发送普通邮件
SMTP(Simple Mail Transfer Protocol)是简单传输协议。
python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML 邮件以及带附件的邮件。两个核心模块如下:
1、email模块:负责构建邮件
2、smtplib模块:负责发送邮件
常用方法与属性
函数名&属性 | 含义 |
smtplib.SMTP(address) |
设置邮箱服务器地址 腾讯邮箱:smtp.qq.com 新浪邮箱:smtp.sina.com 新浪VIP:smtp.vip.sina.com 搜狐邮箱:smtp.sohu.com 126邮箱:smtp.126.com 139邮箱:smtp.139.com 163网易邮箱:smtp.163.com |
smtp.login(uname,passwd) | 登录SMTP服务器 |
email.mime.text.MIMEText(info,type,encoding) | 设置内容 |
MIMEText['From'] | 设置发送者名 |
MIMEText['Subject'] | 发送邮件主题 |
SMTP.sendmail(from_addr, to_addrs, msg) | 发送邮件 |
email.header.Header(s=None,charset=None) | 创建一个可以包含不同字符集中的字符串,并符合MIME的标头 |
代码
import smtplib from email.mime.text import MIMEText from email.header import Header def send_email(): # 设置要登录的邮箱 smtp_obj = smtplib.SMTP('smtp.qq.com') # 登录邮箱 smtp_obj.login('398707160@qq.com','spcdwgqkltjsaiah') # 编辑内容 mail_text = 'This is Email~ 您要的邮件来啦~~' # plain 原生文本模式 msg_body = MIMEText(mail_text,'plain','utf-8') # 设置从哪发送的 msg_body['From'] = Header('Python学院','utf-8') msg_body['Subject'] = Header('测试Python自动邮件','utf-8') # 发送邮件 smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg_body.as_string()) if __name__ =='__main__': send_email()
发送HTML邮件
代码
# smtplib # email import smtplib from email.mime.text import MIMEText from email.header import Header # 登录邮箱 smtp_obj = smtplib.SMTP("smtp.qq.com") smtp_obj.login('398707160@qq.com','ppzuouwejpuebgfg') # 编辑内容 mail_text = ''' <h1 style="color:red">这个是一个HTML邮件</h1> <p>这是邮件的主题内容</p> <p><a href="http://www.itbaizhan.cn">这个是链接</a></p> ''' msg_body = MIMEText(mail_text,'html','utf-8') msg_body['From'] = Header('测试部门','utf-8') msg_body['Subject'] = Header('测试邮件','utf-8') # 发邮件 smtp_obj.sendmail('398707160@qq.com',['hotelmail@126.com'],msg_body.as_string())
发送附件邮件-smtplib
有时邮件的内容只靠文本是无法完全描述内容。这时就可以考虑发送附件来携带内容。具体方法如下:
1、设置登录服务器
2、登录邮箱
3、增加附件
4、设置请求头
5、发送邮件
常用方法与属性
函数名&属性 | 含义 |
email.mime.application.MIMEApplication | 设置附件 |
MIMEApplication.add_header() | 设置请求头,主要是设置文件名 |
email.mime.multipart.MIMEMultipart | 生成包含多个部分的邮件体的 MIME 对象 |
MIMEMultipart.attach(info) | 增加邮件内容 |
代码
import smtplib from email.mime.text import MIMEText from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.header import Header def send_file_email(): # 设置邮箱服务器 stmp_obj = smtplib.SMTP('smtp.qq.com') # 登录邮箱 stmp_obj.login('398707160@qq.com','spcdwgqkltjsbiah') # 设置邮件内容 # 文本 msg_txt = MIMEText('这个带有附件的邮件','plain','utf-8') # 附件 msg_file = MIMEApplication(open('./base_data/backg.jpg','rb').read()) msg_file.add_header('Content-Disposition','attachment',filename='bg.jpg') # 封装要发送的数据 part = MIMEMultipart() part.attach(msg_txt) part.attach(msg_file) # 设置邮件其它信息 part['From'] = Header('Python学院','utf-8') part['Subject'] = Header('附件邮件','utf-8') # 发送邮件 stmp_obj.sendmail('398707160@qq.com','hotelmail@126.com',part.as_string()) if __name__ =='__main__': send_file_email()
批量发送邮件-smtplib
代码
from email.header import Header from email.mime.text import MIMEText import smtplib from openpyxl import load_workbook def send_many_mail1(): # 设置登录邮箱服务器 smtp_obj = smtplib.SMTP('smtp.qq.com') # 登录邮箱 smtp_obj.login('398707160@qq.com','spcdwgqkltjsbiah') # 编辑内容 msg_txt = ''' <table border="1"> <tr> <td>工号</td> <td>姓名</td> <td>部门</td> <td>基本工资</td> <td>提成</td> <td>加班工资</td> <td>社保扣除</td> <td>考勤扣除</td> <td>应发工资</td> <td>邮箱</td> </tr> <tr> <td>000011</td> <td>张杨工</td> <td>skldjfsl</td> <td>80000</td> <td>0</td> <td>0</td> <td>0</td> <td>0</td> <td>80000</td> <td>aa@qq.com</td> </tr> </table> ''' msg = MIMEText(msg_txt,'html','utf-8') # 设置邮件其他信息 msg['From'] = Header('百战财务部','utf-8') msg['Subject'] = Header('工资条','utf-8') #发送邮件 smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg.as_string()) def send_many_mail2(): # 设置登录邮箱服务器 smtp_obj = smtplib.SMTP('smtp.qq.com') # 登录邮箱 smtp_obj.login('398707160@qq.com','spcdwgqkltjsbiah') # 打开excel文件 wb = load_workbook('./base_data/工资数据.xlsx',data_only=True) # 激活工作簿 sh = wb.active # 读取数据-遍历 for i,r in enumerate(sh.iter_rows()): if i != 0: # 编辑内容 msg_txt = f''' <h3>您好:{r[1].value}</h3> <p>请查收2030年12月工资条详情:</p> <table border="1"> <tr> <td>工号</td> <td>姓名</td> <td>部门</td> <td>基本工资</td> <td>提成</td> <td>加班工资</td> <td>社保扣除</td> <td>考勤扣除</td> <td>应发工资</td> <td>邮箱</td> </tr> <tr> <td>{r[0].value}</td> <td>{r[1].value}</td> <td>{r[2].value}</td> <td>{r[3].value}</td> <td>{r[4].value}</td> <td>{r[5].value}</td> <td>{r[6].value}</td> <td>{r[7].value}</td> <td>{r[8].value}</td> <td>{r[9].value}</td> </tr> </table> ''' msg = MIMEText(msg_txt,'html','utf-8') # 设置邮件其他信息 msg['From'] = Header('财务部','utf-8') msg['Subject'] = Header('工资条','utf-8') #发送邮件 smtp_obj.sendmail('398707160@qq.com',{r[9].value},msg.as_string()) print(f'{r[1].value} 工资条发送成功!!') if __name__ =='__main__': send_many_mail2()
发送邮件-zmail
Zmail的优势
1、自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)
2、将一个字典映射为email,构造信件就像构造字典一样简单
3、自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的)
安装
pip install zmail
常用方法与属性
函数名&属性 | 含义 |
zmail.server(name,password) | 登录服务器邮件 |
server.send_mail(address,info) | 发送邮件 |
server.get_latest() | 获取最新接收邮件 |
发送的消息以字典发送,包含的key:
1、subject 邮件主题
2、from 发送人
3、content_text 邮件内容-文本
4、content_html 邮件内容-HTML
5、attachments 邮件内容-附件,可写多个
代码
# pip install zmail import zmail def send_text(): # 登录邮箱 server = zmail.server('398707160@qq.com','spcdwgqkltjsbiah') # 编写内容 info = { 'from':'Zmail', 'subject':'测试zmail模块', 'content_text':'这个是zmail邮件信息' } # 发送邮件 server.send_mail('hotelmail@126.com',info) def send_html(): # 登录邮箱 server = zmail.server('398707160@qq.com','spcdwgqkltjsbiah') # 编写内容 info = { 'from':'Zmail', 'subject':'测试zmail模块', 'content_html':'<h1>这个是zmail邮件信息</h1>' } # 发送邮件 server.send_mail('hotelmail@126.com',info) def send_file(): # 登录邮 server = zmail.server('398707160@qq.com','spcdwgqkltjsbiah') # 编写内容 info = { 'from':'Zmail', 'subject':'测试zmail模块', 'content_html':'<h1>这个是zmail邮件信息</h1>', 'attachments': [r'.\base_data\backg.jpg'] } # 发送邮件 server.send_mail('hotelmail@126.com',info def get_email(): # 登录邮箱 server = zmail.server('398707160@qq.com','tzteewnmyfqacbce') email = server.get_latest() print(email.get('subject')) print(email.get('from')) print(email.get('content_html')) print(email.get('content_text')) if __name__ == '__main__': # send_text() # send_html() # send_file() get_email()