Python SMTP邮件模块

Posted 梦徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python SMTP邮件模块相关的知识,希望对你有一定的参考价值。

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、html邮件以及带附件的邮件。

Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

实例:

1.使用Python发送纯文本格式和html格式的邮件.

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import smtplib
 5 from email.mime.text import MIMEText
 6 from email.utils import formataddr
 7 
 8 def email(message):
 9     #构造MIMEText对象,第一个参数就是邮件正文,第二个参数是MIME的subtype
10     # 传入‘plain‘,最终的MIME就是‘text/plain‘,最后一定要用utf-8编码保证多语言兼容性。
11     msg = MIMEText(message, plain, utf-8)   #message为传入的参数,为发送的消息.
12     """msg = MIMEText(‘<html><body><h1>Hello</h1>‘ +
13     ‘<p>send by <a href="http://www.python.org">Python</a>...</p>‘ +
14     ‘</body></html>‘, ‘html‘, ‘utf-8‘) """
15     #标准邮件需要三个头部信息: From, To, 和 Subject。
16     msg[From] = formataddr(["管理员",[email protected]])     #显示发件人信息
17     msg[To] = formataddr(["Saneri",[email protected]])          #显示收件人信息
18     msg[Subject] = "Zabbix报警系统!"      #定义邮件主题
19     try:
20         #创建SMTP对象
21         server = smtplib.SMTP("smtp.sina.com", 25)
22         #set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
23         #server.set_debuglevel(1)
24         #login()方法用来登录SMTP服务器
25         server.login("[email protected]","password")
26         #sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
27         server.sendmail([email protected], [[email protected],], msg.as_string())
28         print u"邮件发送成功!"

29 server.quit() 30 except smtplib.SMTPException: 31 print u"Error: 无法发送邮件" 32 if __name__ == __main__: 33 cpu = 100 34 disk = 500 35 mem = 50 36 for i in range(1): 37 if cpu > 90: 38 alert = u"CPU出问题!" 39 email(alert) 40 if disk > 90: 41 alert = u"硬盘出问题!" 42 email(alert) 43 if mem > 80: 44 alert = u"内存出问题!" 45 email(alert)
#Python发送HTML格式的邮件与发送纯文本消息的邮件不同之处就是将MIMEText中_subtype设置为html
1     msg = MIMEText(<html><body><h1>Hello</h1> +
2     <p>send by <a href="http://www.python.org">Python</a>...</p> +
3     </body></html>, html, utf-8)

2.Python 发送带附件的邮件.

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

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import smtplib
 5 from email.mime.text import MIMEText
 6 from email.utils import formataddr
 7 from email.mime.multipart import MIMEMultipart
 8 
 9 def email(message):
10 
11     msg = MIMEMultipart()
12     msg[From] = formataddr(["管理员",[email protected]])
13     msg[To] = formataddr(["Saneri",[email protected]])
14     msg[Subject] = "Zabbix报警系统!"
15     msg.attach(MIMEText(message, plain, utf-8))
16 
17     #---这是附件部分---
18     # 构造附件1,文本类型附件
19     att1 = MIMEText(open(test.txt, rb).read(), base64, utf-8)
20     att1["Content-Type"] = application/octet-stream
21     # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
22     att1["Content-Disposition"] = attachment; filename="test.txt"
23     msg.attach(att1)
24 
25     # 构造附件2,jpg类型附件
26     from email.mime.application import MIMEApplication
27     att2 = MIMEApplication(open(001.jpg,rb).read())
28     att2.add_header(Content-Disposition, attachment, filename="001.jpg")
29     msg.attach(att2)
30     #构造附件3,pdf类型附件
31     att3 = MIMEApplication(open(test.pdf,rb).read())
32     att3.add_header(Content-Disposition, attachment, filename="test.pdf")
33     msg.attach(att3)
34     #构造附件4,xlsx类型附件
35     att4 = MIMEApplication(open(test.xlsx,rb).read())
36     att4.add_header(Content-Disposition, attachment, filename="test.xlsx")
37     msg.attach(att4)
38     #构造附件5,mp3类型附件
39     att5 = MIMEApplication(open(test.mp3,rb).read())
40     att5.add_header(Content-Disposition, attachment, filename="test.mp3")
41     msg.attach(att5)
42 
43     try:
44         server = smtplib.SMTP("smtp.sina.com", 25)
45         #set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
46         #server.set_debuglevel(1)
47         #login()方法用来登录SMTP服务器
48         server.login("[email protected]","password")
49         #sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str
50         server.sendmail([email protected], [[email protected],], msg.as_string())
51         print u"邮件发送成功!"
52         server.quit()
53     except smtplib.SMTPException:
54         print u"Error: 无法发送邮件"
55 if __name__ == __main__:
56     cpu = 100
57     disk = 500
58     mem = 50
59     for i in range(1):
60         if cpu > 90:
61             alert = u"CPU出问题!"
62             email(alert)
63         if disk > 90:
64             alert = u"硬盘出问题!"
65             email(alert)
66         if mem > 80:
67             alert = u"内存出问题!"
68             email(alert)

3.在 HTML 文本中添加图片

邮件的 HTML 文本中一般邮件服务商添加外链是无效的,正确添加突破的实例如下所示:

 1 #!/usr/bin/env python
 2 #coding:utf-8
 3 
 4 import smtplib
 5 from email.mime.multipart import MIMEMultipart
 6 from email.mime.text import MIMEText
 7 from email.mime.image import MIMEImage
 8 from email.utils import formataddr
 9 
10 def email():
11     msg = MIMEMultipart()
12     msg[From] = formataddr(["管理员",[email protected]])
13     msg[To] = formataddr(["Saneri",[email protected]])
14     msg[Subject] = "Zabbix报警系统!"
15     msg.attach(MIMEText(<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>good!,html,utf-8))
16 
17     fp = open(001.jpg, rb)
18     msgImage = MIMEImage(fp.read())
19     fp.close()
20     msgImage.add_header(Content-ID, <image1>)
21     msg.attach(msgImage)
22     try:
23         server = smtplib.SMTP("smtp.sina.com", 25)
24         server.login("[email protected]","password")
25         server.sendmail([email protected], [[email protected],], msg.as_string())
26         print u"邮件发送成功!"
27         server.quit()
28     except smtplib.SMTPException:
29         print u"Error: 无法发送邮件"
30 
31 if __name__ == __main__:
32     email()

4.同时支持HTML和Plain格式

如果我们发送HTML邮件,收件人通过浏览器或者Outlook之类的软件是可以正常浏览邮件内容的,但是,如果收件人使用的设备太古老,查看不了HTML邮件怎么办?

办法是在发送HTML的同时再附加一个纯文本,如果收件人无法查看HTML格式的邮件,就可以自动降级查看纯文本邮件。

利用MIMEMultipart就可以组合一个HTML和Plain,要注意指定subtype是alternative

1 msg = MIMEMultipart(alternative)
2 msg[From] = ...
3 msg[To] = ...
4 msg[Subject] = ...
5 
6 msg.attach(MIMEText(hello, plain, utf-8))
7 msg.attach(MIMEText(<html><body><h1>Hello</h1></body></html>, html, utf-8))
8 # 正常发送msg对象...

 

更多参阅:

http://www.runoob.com/python/python-email.html

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



以上是关于Python SMTP邮件模块的主要内容,如果未能解决你的问题,请参考以下文章

Python 收发邮件

如何在python程序中发邮件

Python使用SMTP模块email模块发送邮件

Python使用SMTP模块email模块发送邮件

Python SMTP邮件模块

Python使用SMTP模块email模块发送邮件