python学习之 发送邮件

来源:互联网 发布:算法书籍 哪本好 编辑:程序博客网 时间:2024/05/29 03:49

来源:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832745198026a685614e7462fb57dbf733cc9f3ad000

来源:http://blog.csdn.net/offbeatmine/article/details/51790654

来源:http://python.usyiyi.cn/documents/python_278/library/smtplib.html

SMTP发送邮件

Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。(SMTP属于TCP/IP协议族,所以只负责通信)

首先,我们来构造一个最简单的纯文本邮件:

from email.mime.text import MIMETextmsg = MIMEText('hello, send by Python...', 'plain', 'utf-8')

注意到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain',最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性。

(注意:官方对于email.mime的定义是:creating email and MIME objects from scratch,也就是一点点地构造一封邮件)

(关于email module的介绍:构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:

Message+- MIMEBase   +- MIMEMultipart   +- MIMENonMultipart      +- MIMEMessage      +- MIMEText      +- MIMEImage
基本上所有的对象的创建都是from email.mime.multipart import MIMEMultipart

  1. python2.3以及更高版本默认自带smtplib模块,无需额外安装。邮件传输文本,邮件主题会包含HTML、图像、声音以及附件等。  
  2.   
  3. email.mime可以理解为smtplib模块邮件内容主体的扩展,从只支持纯文本格式扩展到HTML,同时支持附件、音频、图像等格式,smtplib只负责邮件的投递  
  4. SMTP类的定义:  
  5. smtplib.SMTP():构造函数,功能是与smtp服务器建立连接,连接成功后,就可以向服务器发送相关请求,比如登录,校验,发送,退出  
  6. SMPT.connect():  
  7.   
  8. EMAIL类:  
  9. email.mime.multipart.MIMEMultipart([_subtype[,boundary]]):生成包括多个部分的邮件体  
  10. email.mime.image.MIMEImage():创建包含音频数据的邮件体  


关于smtp的一些介绍

一些很有用的异常的定义:

exception smtplib.SMTPException

此模块提供的所有其他异常的基异常类。

class smtplib.SMTP([host[port[local_hostname[timeout]]]])

SMTP实例封装一个 SMTP 连接。它具有支持 SMTP 和 ESMTP 操作完整剧目的方法。如果给出可选的主机和端口参数的信息,在初始化过程中使用这些参数调用时 SMTPconnect ()方法。如果指定,则会将local_hostname用作 HELO/EHLO 命令中的本地主机的 FQDN。否则,使用socket.getfqdn(),找到了本地主机名称。如果使用 connect ()调用返回成功代码之外的任何内容,则会引发SMTPConnectError 可选的超时参数指定以秒计) 阻塞操作 (如连接尝试超时 (如果不指定,将使用全局默认超时设置)。如果在超时过期,则会引发socket.timeout 

正常使用,您应该只需要初始化或连接, sendmail()quit ()方法。示例所示。

2.6 版本中的更改:添加了超时

class smtplib.SMTP_SSL([host[port[local_hostname[keyfile[certfile[timeout]]]]]])

一个SMTP_SSL实例的行为完全相同的SMTP实例。 SMTP_SSL应该用于 SSL 要求从一开始的连接和使用starttls()并不适当情况。如果未指定主机,则使用本地主机。如果端口省略,则使用标准 SMTP 在 SSL 端口 (465)。local_hostname具有相同的含义一样SMTP类。密钥文件certfile也是可选的并且可以包含一个 PEM 格式私人密钥和证书链文件对于 SSL 连接。可选的超时参数指定以秒计) 阻塞操作 (如连接尝试超时 (如果不指定,将使用全局默认超时设置)。如果在超时过期,则会引发socket.timeout 

SMTP.connect([host[port]])

连接到一个给定的端口上的主机。默认值是要连接到本地主机在标准 SMTP 端口 (25)。如果主机名以冒号结尾 (': ') 后跟一个数字,该后缀将剥离和数字解释为要使用的端口号。如果在实例化过程中指定的主机,该构造函数将自动调用此方法。返回的响应代码和在其连接响应服务器发送的消息 2 元组。



#coding=utf-8import smtplibfrom email.mime.text import MIMETextfrom email.header import Headerusername = 'Sentimental_Dog'#注意不带@xxx.compassword = 'hengheng'#明文sender = u‘我的Pyhton’+‘<’username+'@126.com>'receiver = username+'@126.com'mail_host = 'smtp.126.com'//利用126邮箱发送message = MIMEText('这次的作业不用你改了,我会帮你改好的','plain','utf-8')message['From'] = Header(sender,'utf-8')message['To'] = Header(receiver,'utf-8')message['Subject'] = Header('这是我给你发的邮件','utf-8')try :<span style="white-space:pre"></span>smtpObj = smtplib.SMTP()<span style="white-space:pre"></span>smtpObj.connect(mail_host)<span style="white-space:pre"></span>smtpObj.login(username,password)<span style="white-space:pre"></span>smtpObj.sendmail(sender,receiver,message.as_string())except smtplib.SMTPException,e:<span style="white-space:pre"></span>print e
这是一个发送纯文本的邮件

print message 我们会发现这个message对象内部的编码非常复杂,这也是为什么我们使用headers来不断补充这个对象

要解决发件人名称乱码问题,必须使用Header,如下代码:

from email.header import Headerfrom = ("%s<outofmemory_cn@126.com>") % (Header('OutOfMemory.CN管理员','utf-8'),)

通过这样设置发件人之后,发件人的显示就不会有乱码的现象了。

邮件主题乱码问题

邮件主题乱码有可能是在某些邮箱出现,例如我遇到发给Gmail不会乱码,但是发给sina.cn的邮箱就会乱码。

要解决邮件主题乱码的问题需要保证subject必须是unicode,如下:

if not isinstance(subject,unicode):    subject = unicode(subject)msg['Subject'] = subject

解决邮件正文乱码问题

首先需要将MIMEText指定为utf-8编码,然后还要设置msg['Accept-Language']和msg['Accept-Charset']两个属性,如下代码片段:

    msg = MIMEText(body,format,'utf-8')    msg["Accept-Language"]="zh-CN"    msg["Accept-Charset"]="ISO-8859-1,utf-8"


Python发送带附件的邮件

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送。

<pre name="code" class="python">#coding=utf-8import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headerusername = ''password = ''mail_host = 'smtp.126.com'sender = username+'@126.com'receiver = ''towhome = ("%s<Sentimental_Dog>") % (Header(receiver,'utf-8'))message = MIMEMultipart()att1 = MIMEText(open('sendmail3.txt','rb').read(),'base64','utf-8')att1['Content-Type'] = 'application/octet-stream'att1['Content-Disposition'] = 'attachment; filename="mycode.txt"'message.attach(att1)message['From'] = Header(sender,'utf-8')message['To'] = towhomemessage['Subject'] = Header('我的python','utf-8')try :smtpObj = smtplib.SMTP()smtpObj.connect(mail_host)smtpObj.login(username,password)smtpObj.sendmail(sender,receiver,message.as_string())except smtplib.SMTPException,e:print e


0 0
原创粉丝点击