使用Python发送各种形式的邮件的方法汇总

时间:2022-10-19 14:44:10

我们平时需要使用 Python 发送各类邮件,这个需求怎么来实现?答案其实很简单,smtplib 和 email 库可以帮忙实现这个需求。smtplib 和 email 的组合可以用来发送各类邮件:普通文本,HTML 形式,带附件,群发邮件,带图片的邮件等等。我们这里将会分几节把发送邮件功能解释完成。
smtplib 是 Python 用来发送邮件的模块,email 是用来处理邮件消息。

发送 HTML 形式的邮件
发送 HTML 形式的邮件,需要 email.mime.text 中的 MIMEText 的 _subtype 设置为 html,并且 _text 的内容应该为 HTML 形式。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import smtplib
from email.mime.text import MIMEText
 
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
 
msg = MIMEText(u'''<pre>
<h1>你好</h1>
</pre>''','html','utf-8')
 
msg['Subject'] = subject
 
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

注意:这里的代码并没有把异常处理加入,需要读者自己处理异常。

发送带图片的邮件
发送带图片的邮件是利用 email.mime.multipart 的 MIMEMultipart 以及 email.mime.image 的 MIMEImage:

  1. import smtplib 
  2. from email.mime.multipart import MIMEMultipart 
  3. from email.mime.text import MIMEText 
  4. from email.mime.image import MIMEImage 
  5.  
  6. sender = '***' 
  7. receiver = '***' 
  8. subject = 'python email test' 
  9. smtpserver = 'smtp.163.com' 
  10. username = '***' 
  11. password = '***' 
  12.  
  13. msgRoot = MIMEMultipart('related'
  14. msgRoot['Subject'] = 'test message' 
  15.  
  16. msgText = MIMEText( 
  17.   '''<b> Some <i> HTML </i> text </b > and an image.<img alt="" src="cid:image1"/>good!''''html''utf-8'
  18. msgRoot.attach(msgText) 
  19.  
  20. fp = open('/Users/1.jpg''rb'
  21. msgImage = MIMEImage(fp.read()) 
  22. fp.close() 
  23.  
  24. msgImage.add_header('Content-ID''<image1>'
  25. msgRoot.attach(msgImage) 
  26.  
  27. smtp = smtplib.SMTP() 
  28. smtp.connect(smtpserver) 
  29. smtp.login(username, password) 
  30. smtp.sendmail(sender, receiver, msgRoot.as_string()) 
  31. smtp.quit() 
 

发送带附件的邮件
发送带附件的邮件是利用 email.mime.multipart 的 MIMEMultipart 以及 email.mime.image 的 MIMEImage,重点是构造邮件头信息:

?
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
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
 
sender = '***'
receiver = '***'
subject = 'python email test'
smtpserver = 'smtp.163.com'
username = '***'
password = '***'
 
msgRoot = MIMEMultipart('mixed')
msgRoot['Subject'] = 'test message'
 
# 构造附件
att = MIMEText(open('/Users/1.jpg', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="1.jpg"'
msgRoot.attach(att)
 
smtp = smtplib.SMTP()
smtp.connect(smtpserver)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()