设为首页 收藏本站
查看: 1123|回复: 0

[经验分享] Python【十四】:雏形-邮件发送程序

[复制链接]
累计签到:77 天
连续签到:1 天
发表于 2014-8-14 08:53:10 | 显示全部楼层 |阅读模式
自己的邮箱经常收到垃圾邮件,即便是最先进的反垃圾邮件引擎也无法保证完美的拦截率。于是自己对于邮件的发送接收产生了兴趣,正好刚学了Python,看到其有丰富的Internet应用包,于是赶紧来试试吧!自己用了两天时间写了一个发送邮件的小程序,只能说是一个雏形吧,没有交互界面,功能也不完善,但是还是学到了不少东西,下面先简单补充下email中可能用到的知识,然后讲解下我们的代码。
   想要了解Email,最好的方法莫过于分析一个Email文件了,这里截取了一个测试的邮件,做下简单的分析:



    Received: from mail.sdas.org (unknown [172.16.1.9])
        by mail.sdas.org (AnyMacro(G7)) with SMTP id D2A8210009D
        for <******@sdas.org>; Wed, 23 Jul 2014 16:40:04 +0800 (HKT)
    X-scanvirus: By EQAVSE AntiVirus Engine
    X-scanresult: CLEAN
    X-MAILFROM: <sysadmin_oa@126.com> //发送邮件SMTP的邮箱
    X-RCPTTO: <******@sdas.org>
    X-FROMIP: 123.125.50.110 //发送邮件的SMTP服务器的IP,北京市联通
    X-EQManager-Scaned: 1
    X-Received:m50-110.126.com,123.125.50.110,20140723163845
    Received: from m50-110.126.com (123.125.50.110)
      by localhost with SMTP; 23 Jul 2014 08:38:45 -0000
    DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=126.com; //域名服务器数字签名 防止伪造域名发送垃圾邮件
        s=s110527; h=MIME-Version:from:subject:Message-Id:Date; bh=d7E0W
        8XWKkHJfmeJfJpA6z4IXUHGL6PMSKBntFW0WQ4=; b=CkOh1jpeyoreLs5qk41Sg
        ZqEsgXfJEEo9y83736JjeUIkDYTAOafSzhWaxWVLpos4bd1mgWj60FJJN23qc0ui
        MxTY6r6KX5HC6BBg8cLOu0mf73pEW/v5QhQ1Fa8jYlSJ2puO5pFg/7asJfjZ0xlL
        UD5u68gPeA9drgCZLlVOqo=
    Received: from [172.16.20.110] (unknown [60.208.139.35]) //山东省济南市联通
        by smtp4 (Coremail) with SMTP id jdKowEBJjlPmdM9T6c_WCA--.1152S2;
        Wed, 23 Jul 2014 16:40:07 +0800 (CST)
    Content-Type: multipart/mixed; boundary="===============0886446980=="
    MIME-Version: 1.0
    to: ******@sdas.org
    from: suon@sdas.org
    subject: Test
    X-CM-TRANSID:jdKowEBJjlPmdM9T6c_WCA--.1152S2
    Message-Id:<53CF74E7.A5D465.10027@m50-110.126.com>
    X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
        VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUvk9NDUUUU
    X-Originating-IP: [60.208.139.35]
    Date: Wed, 23 Jul 2014 16:40:07 +0800 (CST)
    Sender: sysadmin_oa@126.com //标识了原始发送方
    X-CM-SenderInfo: pv1vtv5plqs0bd6rjloofrz/1tbitQrRREX9rRLCZAAAsL
    X-MT-SPAMFLAG: NO;1406104804;MT_IP_WHITELIST

    --===============0886446980==
    Content-Type: text/plain; charset="us-ascii" //邮件部分的内容
    MIME-Version: 1.0
    Content-Transfer-Encoding: 8bit

    HAHA,baby, see my email, love U
    --===============0886446980==--

    Email格式是比较容易理解的,下面简要分析下吧:第六行和第八行显示的是邮件的真实发送方和发送的邮件服务器的IP地址;第十三行使用的是现在普遍的DKIM机制,其实就是域名密钥验证,用于防止邮件伪造域名,对于使用真实SMTP服务器的我们来说关系并不是很大,大家可以理解成一种认证发送方域名数字签名就可以了;第十九行显示了邮件最近的一个邮件服务器地址,第三十八行显示了邮件的内容部分,可以看到Type和charset参数;这里出现了MIME-Version,所谓MIME的意义在于为每个数据部分贴上标签,使得浏览器读取该部分时通过MIME标签选择合适的插件来解读这些数据,比如text可以使用记事本,pdf就使用PDF插件,等等;除了us-ascii之外另外一种常用的是base64编码,它可以将3个字节24位的数据编程4个6位的数据,每个组前两位添0,base64编码主要用于在邮件附件中嵌入二进制数据或作为HTTP协议的部分。
DKIM介绍:http://baike.baidu.com/link?url= ... Stmjz704uJMEkH-o-s_
Base64介绍:http://baike.baidu.com/view/469071.htm?fr=aladdin

************************************************************************************************************
   
   好了,接下来说说我们的邮件发送程序吧,其核心思想是自己构造出email消息,然后通过合法邮箱的smtp服务器发送到指定目标。其中主要解决Email邮件的构造和SMTP发送问题,具体代码如下:



    # -*- coding: cp936 -*-
    #A Email Send Tool
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart

    #Define the Sender and Receiver
    sender = 'test@sdas.org'
    receiver = '******@sdas.org'
    subject = 'Response!'
    body = '你好 这是一个邮件发送的测试 收到请回复 谢谢!我的邮箱是test@sdas.com'
    print 'Emial Header Initialing...'
    #Build the Email Message
    m = MIMEMultipart()
    m['to'] = receiver
    m['from'] = sender
    m['subject'] = subject

    m.attach(MIMEText(body, 'html', 'gb2312'))
    print 'Email build...'
    #Send the Email
    server = smtplib.SMTP('smtp.126.com')
    server.login('sysadmin_oa@126.com', '********')
    server.sendmail('sysadmin_oa@126.com', receiver, m.as_string())
    server.close()
    print 'Email Send Success!'
    raw_input('Enter for Exit...')

    第一行中因为我们的代码中有中文,而Python默认的为ascii编码,因此需要指定编码方式为cp939,该编码的兼容性比gb2312还要好一些;
   第三行到第五行导入了我们要使用的Python标准模块。首先构造Email消息使用的是MIMEMultipart函数添加一个MIME消息部分,然后使用MIMEText()函数将指定的字符串生成Email消息内容,最后通过smtp.SMTP建立连接发送邮件;
   第八行到第十一行定义了下面要用到的Email消息的头部信息,包括发件人,收件人以及邮件主题和邮件内容等;
   第十四到第十九行使用MIMEMultipart()建议一个消息对象m,然后填充该消息对象的头部信息,之后添加使用MIMEText()函数生成的消息部分,注意这里的MIMEText()指定了消息格式为'html'以及字符集为'gb2312',使用默认的'plain'格式邮件查看会出现乱码;
    第二十二到第二十五行使用提前准备的测试邮箱启动SMTP服务,发送邮件,这里需要先认证发送者身份,因此使用smtp.login()方法,最后smtp.close()关闭此次连接;
   运行结果如下:

26275986_1406186240Wz5A.jpg

【本节要点:
1. 邮件构造模块email;
2. 邮件消息创建:email.mime.multipart中的MIMEMultipart()创建MIME消息对象m;
3. 邮件内容填充:email.mime.text中的MIMEText(msg, 'html', 'gb2312')函数,其中还有发送邮件时的m.as_string()函数将内容转换为字符串发送;
4. 邮件发送:模块smtp;
5. smtp.SMTP('SMTP Server域名')建立连接到SMTP服务器的对象;
6. 邮件发送:server.connect()或server.login(username, passwd);
7. 邮件发送:server.sendmail('你的SMTP邮箱账号', Receiver, msg);
8. 邮件发送:server.close()关闭邮件发送对象;】



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-23725-1-1.html 上篇帖子: Python【十三】:类的基础 下篇帖子: Python【十五】:迭代器与生成器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表