赞
踩
SMTP(Simple Mail Transfer Protocol)是简单传输协议。
python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML 邮件以及带附件的邮件。两个核心模块如下:
email模块:负责构建邮件
smtplib模块:负责发送邮件
常用方法与属性:
如果要使用qq邮箱发送的话,需要在qq邮箱设置-账户里面开启POP3/SMTP服务
首次开启需要你用手机号发送短信,照着做就好了,做完之后会给你一个授权码,记着这个授权码,写代码需要用到,忘记了也可以找回
接着编写代码,发送普通邮件
- import smtplib
- from email.mime.text import MIMEText
- from email.header import Header
-
- def send_email():
- # 设置要登录的邮箱
- smtp_obj = smtplib.SMTP('smtp.qq.com')
- # 登录邮箱 这里需要填写你的qq邮箱地址和生成的授权码
- smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
- # 编辑内容
- mail_text = 'This is Email~ 您要的邮件来啦~~'
- # plain 原生文本模式
- msg_body = MIMEText(mail_text,'plain','utf-8')
- # 设置从哪发送的
- msg_body['From'] = Header('xxx','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邮件只需要把发送的内容换成html代码即可
- import smtplib
- from email.mime.text import MIMEText
- from email.header import Header
-
- def send_email():
- # 设置要登录的邮箱
- smtp_obj = smtplib.SMTP('smtp.qq.com')
- # 登录邮箱 这里需要填写你的qq邮箱地址和生成的授权码
- smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
- # 编辑内容
- mail_text = '''
- <h1 style='color:red'>这是一个HTML邮件通知</h1>
- <p>这个是邮件的内容</p>
- <p><a href='http://www.itbaizhan.cn'>这个是链接</a></p>
- '''
- # plain 原生文本模式
- msg_body = MIMEText(mail_text,'plain','utf-8')
- # 设置从哪发送的
- msg_body['From'] = Header('xxx','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()
有时邮件的内容只靠文本是无法完全描述内容。这时就可以考虑发 送附件来携带内容。具体方法如下:
设置登录服务器 、登录邮箱、增加附件 、设置请求头、 发送邮件
- 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('xxx@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('xx','utf-8')
- part['Subject'] = Header('附件邮件','utf-8')
- # 发送邮件
- stmp_obj.sendmail('xxx@qq.com','hotelmail@126.com',part.as_string())
-
- if __name__ =='__main__':
- send_file_email()
这里以发送工资条为例
工资数据如下:
- from email.header import Header
- from email.mime.text import MIMEText
- import smtplib
-
- from openpyxl import load_workbook
-
- def send_many_mail():
- # 设置登录邮箱服务器
- smtp_obj = smtplib.SMTP('smtp.qq.com')
- # 登录邮箱
- smtp_obj.login('xxx@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('xxx@qq.com',{r[9].value},msg.as_string())
- print(f'{r[1].value} 工资条发送成功!!')
- if __name__ =='__main__':
- send_many_mail()
Zmail的优势
1 自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)
2 将一个字典映射为email,构造信件就像构造字典一样简单
3 自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的)
安装:pip install zmail
发送的消息以字典发送,包含的key:
subject 邮件主题
from 发送人
content_text 邮件内容-文本
content_html 邮件内容-HTML
attachments 邮件内容-附件,可写多个
- import zmail
- def send_text():
- # 登录邮箱
- server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
- # 编写内容
- info = {
- 'from':'笨笨的张小白',
- 'subject':'测试zmail模块',
- 'content_text':'这个是zmail邮件信息'
- }
- # 发送邮件
- server.send_mail('hotelmail@126.com',info)
- def send_html():
- # 登录邮箱
- server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
- # 编写内容
- info = {
- 'from':笨笨的张小白',
- 'subject':'测试zmail模块',
- 'content_html':'<h1>这个是zmail邮件信息</h1>'
- }
- # 发送邮件
- server.send_mail('hotelmail@126.com',info)
- def send_file():
- # 登录邮箱
- server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
- # 编写内容
- info = {
- 'from':'笨笨的张小白',
- '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('xxx@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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。