python☞自动发送邮件
一.SMTP 协议
SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式
二.smtplib 模块
Python的smptlib模块提供了一种很方便的途径来发送电子邮件。它对SMTP协议进行了简单的封装。们可以使用SMTP对象的sendmail发放发送邮件,首先我们看下此模块重要的方法如何使用
1.connect(self,host='localhost',port=0)
host:邮件服务器地址
port:邮件服务器端口(不输入参数默认为25)
2.login(self,user,password)
user:登录邮箱用户名
password:登录邮箱密码
3.sendmail(self,from_addr,to_addrs,msg)
from_addr:发送邮件人地址
to_addrs:接受邮件人地址
msg:发送的内容
一般我们发送邮件时有两种方式。
方式一:自己邮箱的web页面,输入用户名和密码登录,打开发邮件页面,填写对方的邮箱地址及邮件标题与正文,完成后点击发送。
方式二:下载安装邮箱客户端,填写邮箱账号密码及邮箱服务器,一般的邮箱客户端会默认记下这些信息,所以,这个过程只需要填写依次,后面发邮件的过程与方法一相同。而我们通过python发送邮件更像方式二,因为需要填写邮箱服务器。
三.实例
我使用的测试邮箱系统为QQ邮箱,在进行测试之前我们需要设置一下QQ邮箱,获取QQ邮箱的授权码(授权码是用于登录第三方邮件客户端的专用密码)用来以后登录邮箱时的密码,对于其他邮箱如何获取授权码请自行百度
1.打开QQ邮箱,依次点击【设置】-【账户】如图1:
图1:
2.找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务”操作列表,图2:
3.开启前2个服务,并点击【生成授权码】,我这边得到的授权码为:gifhhsbgqyovbhhc
4.代码如下:
# 这边我是读取文件中的内容充当发送邮件内容的,若想测试可以把传递的参数去掉,并注释掉14-20行,加一行file_msg='<html><h1> python test send imail</h1></html>'
1 #! user/bin/python 2 ''' 3 代码说明:自动发送邮件 4 编写日期:2018.07.16 5 设计者:linux超 6 ''' 7 8 import smtplib 9 from email.mime.text import MIMEText 10 from email.header import Header 11 import time 12 13 def send_email(filename): 14 # 打开报告文件读取文件内容 15 #filename = './report/'+ time.strftime('%Y-%m-%d %H_%M_%S') 16 f = open(filename,'r') 17 file_msg = f.read() 18 #print(filename) 19 #print(file_msg) 20 f.close() 21 # 邮件服务器 22 smtpserver = 'smtp.qq.com' 23 # 发件人用户名和密码 24 user = 'username@qq.com' 25 password = 'gifhhsbgqyovbhhc' 26 # 发件人 27 sender = 'sender@qq.com' 28 # 收件人 29 receiver = 'receiver@qq.com' 30 # 邮件主题 31 subject = 'Python test send email' 32 # 邮件设置 33 msg = MIMEText(file_msg,'html','utf-8') 34 msg['subject'] = Header(subject,'utf-8') 35 msg['from'] = sender 36 # 连接服务器,登录服务器,发送邮件 37 smtp = smtplib.SMTP() 38 smtp.connect(smtpserver,465) 39 smtp.login(user,password) 40 try: 41 smtp.sendmail(sender,receiver,msg.as_string()) 42 except Exception as e: 43 print('send failed',e) 44 else: 45 print('send success!') 46 smtp.quit()# 结束SMTP会话 47 print('send email success!') 48 if __name__ == '__main__': 49 send_email('./report/2018-07-16 13_09_21.txt')
5.结果:
总结: 后续会填加发送带附件的案例