在刚开始学习python的时候就听有的人说,用python发邮件简直太轻松了,随着学习的深入,今天学习了一下python的smtplib模块,果不其然,只需几行代码就可以轻松实现发邮件的功能。 在本例中,使用自己的163邮箱给qq邮箱发测试样例。
一共需要四部即可
遵从这四步,首先一段简单的:
1 2 3 4 5 6 7 8 9 10 import smtplibmsg = 'From: xxx@163.com\r\nTo: xxx@qq.com\r\nSubject: Test smtp by python\r\n\r\nJust for test' handle = smtplib.SMTP('smtp.163.com' , '25' ) handle.login('xxx@163.com' , 'xxxxx' ) handle.sendmail('xxx@163.com' , 'xxx@qq.com' , msg) handle.quit() print 'send successfully'
sendmail()
的所有参数要遵循RFC 2822,即电子邮件的地址必须要有正确的格式,消息体要有正确的前导头,前导头后是两个回车和换行(\r\n
)对
SMTP通讯时,只要一个端口25
以上很简单的就实现了利用python自带的smtplib
模块实现了发送邮件的功能,但是在现实发邮件中,肯定比这样的要复杂。这时需要另一个模块email
,email
负责构造邮件,smtplib
负责发送邮件。
构造一个邮件对象就是一个Messag
对象,如果构造一个MIMEText
对象,就表示一个文本邮件对象,如果构造一个MIMEImage
对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart
对象,而MIMEBase
可以表示任何对象。 一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextfrom email.utils import parseaddr, formataddrimport smtplibdef _format_addr (s ): name, addr = parseaddr(s) return formataddr(( \ Header(name, 'utf-8' ).encode(), \ addr.encode('utf-8' ) if isinstance (addr, unicode) else addr)) from_addr = raw_input('From: ' ) password = raw_input('Password: ' ) to_addr = raw_input('To: ' ) smtp_server = raw_input('SMTP server: ' ) msg = MIMEText('hello, send by Python...' , 'plain' , 'utf-8' ) msg['From' ] = _format_addr(u'Python爱好者 <%s>' % from_addr) msg['To' ] = _format_addr(u'管理员 <%s>' % to_addr) msg['Subject' ] = Header(u'来自SMTP的问候……' , 'utf-8' ).encode() server = smtplib.SMTP(smtp_server, 25 ) server.set_debuglevel(1 ) server.login(from_addr, password) server.sendmail(from_addr, [to_addr], msg.as_string()) server.quit()
编写了一个函数_format_addr()
来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>
,因为包含中文,所以需要使用Header
对象进行编码。
若需要添加附件时,可以构造一个MIMEMultipart
对象代表邮件本身,然后往里面加上一个MIMEText
作为邮件正文,再继续往里面加上表示附件的MIMEBase
对象即可。
原文出处: 利用python发邮件(一) 原文出处: 利用python发邮件(二)