利用python发邮件

在刚开始学习python的时候就听有的人说,用python发邮件简直太轻松了,随着学习的深入,今天学习了一下python的smtplib模块,果不其然,只需几行代码就可以轻松实现发邮件的功能。
在本例中,使用自己的163邮箱给qq邮箱发测试样例。


一共需要四部即可

  • 连接到服务器
  • 登录
  • 发出服务请求
  • 退出

遵从这四步,首先一段简单的:

1
2
3
4
5
6
7
8
9
10
#coding: utf-8

import smtplib

msg = 'From: [email protected]\r\nTo: [email protected]\r\nSubject: Test smtp by python\r\n\r\nJust for test'
handle = smtplib.SMTP('smtp.163.com', '25') #第一步
handle.login('[email protected]', 'xxxxx') #第二步 用户名和密码
handle.sendmail('[email protected]', '[email protected]', msg) #第三步
handle.quit() #第四步
print 'send successfully'
  • sendmail()的所有参数要遵循RFC 2822,即电子邮件的地址必须要有正确的格式,消息体要有正确的前导头,前导头后是两个回车和换行(\r\n)对
  • SMTP通讯时,只要一个端口25

以上很简单的就实现了利用python自带的smtplib模块实现了发送邮件的功能,但是在现实发邮件中,肯定比这样的要复杂。这时需要另一个模块emailemail负责构造邮件,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
# -*- coding: utf-8 -*-

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

def _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 <[email protected]>,因为包含中文,所以需要使用Header对象进行编码。


若需要添加附件时,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可。

原文出处: 利用python发邮件(一)
原文出处: 利用python发邮件(二)