zoukankan      html  css  js  c++  java
  • python 发送 smtp

    MIME 通过定制的一个Content-Type,让接受者知道如何显示它。内容类型有:text/plain 、text/html、image/jpeg、video/mpeg、audio/mp3;他们分别是:主类型/子类型。

    使用带附件的MIME消息:

    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    import smtplib
    
    msg = MIMEMultipart()
    
    att1 = MIMEText(open('c:\unintall.log', 'rb').read(), 'base64', 'gb2312')
    att1['Content-type'] = 'application/octet-stream'
    att1['Content-Disposition'] = 'attachment; filename="123.txt"'
    msg.attach(att1)
    
    att2 = MIMEText(open('c:\unintall.log', 'rb').read(), 'base64', 'gb2312')
    att1['Content-type'] = 'application/octet-stream'
    att1['Content-Disposition'] = 'attachment; filename="123.txt"'
    msg.attach(att1)
    
    msg['to'] = '******@qq.com'
    msg['from'] = 'username@163.com'
    msg['subject'] = 'hello world'
    try:
        server = smtplib.SMTP()
        server.connect('smtp.163.com')
        server.login('username', 'password')
        server.sendmail(msg['from'], msg['to'], msg.as_string())
        server.quit()
        print('send success')
    except Exception, e:
        print(str(e))

    在这里通过添加了两个附件。并且这两个附件在对方的显示邮件中为:123.txt.

    顺便在这里简单那说明一下发送邮件的流程

    1、因为要添加带附件的邮件,所以要先构造一个MIMEMultipart的对象,然后想要添加的东西往里面塞。最后在讲该对象通过邮件发送出去。

    2、添加的附件:这里有两个附件,这里以读二进制文件的形式打开了我电脑上存在的一个文件,然后指定了编码方式是base64,该编码方式是以二进制的方式在网络上进行传送。因为这里是文件不是字符串,所以必须以二进制的方式进行传送。不论带附件的是jpg还是其他压缩文件也是可以这么做。第三个参数指定的是gb2312这个是为了能够支持中文的形式。然后在指定这个Content-type 是'application/octet-stream'的方式进行传送,即8个位的流方式。 然后指定了'Content-Disposition' 的是'attachment; filename="123.txt"' 即指定了部署到对方邮件上的附件的该文件名重命名为123.txt.  然后就可以讲该附件attach到MIMEMultipart上面

    这里传送图片的时候,也可以使用MIMEImage 来替换MIMEText  如果要在正文中显示的话,就需要使用MIMEImage

    3、发送需求:连接到本身账户的服务器上面即:smtp.***.com  现在一般的邮箱都需要身份验证,所以connect到服务器之后,需要进行login() 到该服务器,登陆完成之后就可以进行邮件的发送,sendmail(from, to, msg) 发送成功没有发生异常之后。可以退出跟本身邮箱服务器的通信,即断开链接quit

    接下来是一个在正文中显示图片的一个例子

    import smtplib
    import mimetypes
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.image import MIMEImage
    
    def AutoSendMail():
        subject = 'html'
        smtpserver = 'smtp.163.com'
        msgRoot = MIMEMultipart()
        msgRoot['Subject'] = 'testMessage'
        msgText = MIMEText('邮件<img src="cid:image2"/><img src="cid:image1"/><br>good!', 'html', 'gb2312')
        msgRoot.attach(msgText)
        fp = open('D:\123.jpg', 'rb')
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header('Content-ID', '<image1>')
        msgRoot.attach(msgImage)
        fp = open('D:\xl.jpg', 'rb')
        msgImage = MIMEImage(fp.read())
        fp.close()
        msgImage.add_header('Content-ID', '<image2>')
        msgRoot.attach(msgImage)
        server = smtplib.SMTP()
        server.connect('smtp.163.com')
        server.login('username', 'password')
        server.sendmail('username@163.com', 'destname@qq.com', msgRoot.as_string())
        server.quit()
    
    if __name__ == '__main__':
        AutoSendMail()

    在这里使用的是html的方式在文本中进行显示,其实是为了能够在正文中显示图片。在这里的MIMEText中使用了中文,还有html的格式。  第一个参数是正文要显示的方式,使用了<img src="cid:image2"/> 这里就是指定在该位置要显示的图片,在msgRoot 的attach中存在的一个名字,即下文中的msgImage.add_header中的ID为image1的文件。因为在文中出现了html所以,这里要以html的方式进行发送,否则可能会被识别为附件。 

    这里添加的图片,是以MIMEImage类的方式来进行操作。然后在加入的msgImage。add_header中,指定了ID 为了能够让正文识别该图片是为了显示在正文中,如果图片没有被用到正文中,则该文件,将被当成附件的形式发送到对方的邮件中。

    接下来是简单的ssl邮件的发送

    msg = MIMEText('你好', 'plain', 'gb2312')
    msg['subject'] = Header(subject, 'gb2312')
    
    smtp = smtplib.SMTP()
    smtp.connect('smtp.163.com')
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.set_debuglevel(1)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()

    这里在链接到smtp服务器之后,先进行了一系列的操作,ehlo

    来自百度百科:支持SMTP服务扩展的客户应该以EHLO命令开始SMTP会话,而不是通常的HELO命令。如果服务器也支持,那就返回确认响应,如果不支持就返回失败响应。因为引入了EHLO命令,因此会话开始的第一条命令可以是HELO或EHLO。   EHLO命令可以出现在任何HELO命令出现的地方,在成功发送一个HELO或EHLO命令后再次发送它会使服务器返回503。客户这时不能缓存服务器返回的任何信息。这里一定要注意的是,每次开始SMTP扩展服务会话的时候必须发送EHLO命令。  end 百度百科

    starttls 是将纯文本提升为加密方式

    参考:http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

    还参考了另一个人的博客,可惜那个博客现在没找到,不好意思

  • 相关阅读:
    C#开发微信公众平台-就这么简单(附Demo)
    Newtonsoft.Json高级用法
    C#获取文件的MD5码
    C#动态执行代码
    c#插件式开发
    利用反射执行代码
    yield关键字用法与解析(C# 参考)
    HttpContext.Current.Cache和HttpRuntime.Cache的区别,以及System.Runtime.Caching
    GZip压缩与解压缩
    Asp.Net 请求处理机制
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/3674637.html
Copyright © 2011-2022 走看看