python电子邮件
SMTP是发送邮件的协议,python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
python对SMTP支持有smtplib和email两个模块。email负责构造邮件,smtplib负责发送邮件。
from email.mime.text import MIMEText import smtplib #构造邮件发送内容 msg=MIMEText('hello,my name is xjm.this send by python','plain','utf-8') from_addr='1510261589@qq.com' #发送者 password='jghwkwogclzahcjd' #密码(授权码) to_addr='946271805@qq.com' #接收者 smtp_server='smtp.qq.com' #smtp服务器地址 server=smtplib.SMTP(smtp_server,25) server.set_debuglevel(1) #不加者两个发不出去,不知道为啥。第二个是建立安全连接 server.ehlo() server.starttls() server.login(from_addr,password) server.sendmail(from_addr,[to_addr],msg.as_string()) server.quit()
可以去自己的邮箱看已发送:
仔细观察,有问题。
- 邮件没有主题
- 收件人的名字没有显示友好的名字
这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From
、To
和Subject
添加到MIMEText
中,才是一封完整的邮件:
from email.mime.text import MIMEText from email import encoders from email.header import Header from email.utils import parseaddr,formataddr import smtplib #格式化邮件地址 def _format_addr(s): name, addr=parseaddr(s) return formataddr((Header(name,'utf-8').encode(),addr)) from_addr='1510261589@qq.com' #输入发送者 password='jghwkwogclzahcjd' #密码 to_addr='946271805@qq.com' #接收者 smtp_server='smtp.qq.com' #smtp服务器地址 #构造邮件 msg=MIMEText('hello,my name is xjm.this send by python','plain','utf-8') msg['From']=_format_addr('王者小喵喵<%s>'%from_addr) msg['To']=_format_addr(to_addr) msg['Subject']=Header('来自小喵喵的问候……','utf-8').encode() server=smtplib.SMTP(smtp_server,25) server.set_debuglevel(1) server.ehlo() server.starttls() server.login(from_addr,password) server.sendmail(from_addr,[to_addr],msg.as_string()) server.quit()
修改了代码之后可以正常显示了:
说明:
我们编写了一个函数_format_addr()
来格式化一个邮件地址。注意不能简单地传入name <addr@example.com>
,因为如果包含中文,需要通过Header
对象进行编码。
msg['To']
接收的是字符串而不是list,如果有多个邮件地址,用,
分隔即可。
再发送一遍邮件,就可以在收件人邮箱中看到正确的标题、发件人和收件人。
发送HTML邮件
我们要发送HTML邮件,不是普通的纯文本怎么办。在构造MIMEText对象时,把HTML字符串穿进去,再把第二个参数plain变为HTML就可以:
msg=MIMEText('<html><body><h1>(⊙o⊙)哦!hello,my name is xjm.</h1>'+'<p>this send by <a href="http://www.python.org">py
thon</a>...</p>'+'</body></html>','html','utf-8')
发送附件
如果Email中要加上附件怎么办?带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart
对象代表邮件本身,然后往里面加上一个MIMEText
作为邮件正文,再继续往里面加上表示附件的MIMEBase
对象即可:
效果:
修改代码:
from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase #邮件对象 msg=MIMEMultipart() #邮件正文 msg.attach(MIMEText('<html><body><h1>(⊙o⊙)哦!hello,my name is xjm.</h1>'+'<p>this send by <a href="http://www.python.org">python</a>...</p>'+'</body></html>','html','utf-8')) #附件 MIMEBase with open(r'C:\Users\20152\Desktop\一加\IMG_20180519_225021_8508021882695333767.jpg','rb') as f: #设置附件的MIME和文件名,这里是jpg类型: mime=MIMEBase('image','jpg',filename='IMG_20180519_225021_8508021882695333767.jpg') #加上必要的头信息: mime.add_header('Content-Disposition', 'attachment', filename='IMG_20180519_225021_8508021882695333767.jpg') mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') #把附件的内容读出来: mime.set_payload(f.read()) #用base64编码: encoders.encode_base64(mime) #添加到MIMEmultipart: msg.attach(mime)