Py学习记录
Python 常规学习
Python学习笔记(一)
Python学习笔记(二)
Python学习笔记(三)
Python学习笔记(四)
Python学习笔记(五)
Python学习笔记(六)
Python学习笔记(七)
Python习题(一)
Python习题(二)
Python习题(三)
Python习题(四)
Python习题(五)
Python常见Bug
Python编程环境
Python-依赖安装(三方库)
Python-VS Code
pip-换源
py 程序转 exe
Python-打开选择文件对话框
Python 项目
Python-密码学
Python-与佛伦禅
Python-喵语翻译
Python-翻译服务器
Python-邮件发送
Python-自动签到
Python-自动签到(Post请求)
Python-自动签到(模拟操作)
Python-图片添加二维码
Python-数据可视化
Python-端口扫描器
Python-未测试项目
Python-虚拟环境
Python-临时环境
Python-venv虚拟环境
Python-Conda
Python-OpenCV
OpenCV-人脸识别
Python-PyTorch
本文档使用 MrDoc 发布
-
+
首页
Python习题(四)
## 玩转Python之发邮件  ### 1.0 简单邮件 对于新功能,可以百度了解下  [SMTP发送邮件](https://www.liaoxuefeng.com/wiki/1016959663602400/1017790702398272) 使用Python发送邮件, 需要使用smtplib与email两个模块  email模块负责构造邮件;smtplib模块负责发送邮件 SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件  ``` from email.mime.text import MIMEText # 加载MIMEText模块 import smtplib # 加载smtp库 msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8') # 输入Email地址和口令,常见第三方的密码不行,需要授权码,在设置——账户——生成授权码: from_addr = input('请输入发件人的邮箱号码From: ') password = input('请输入发件人的邮箱密码Password: ') # 输入SMTP服务器地址: smtp_server = input('请输入邮箱服务器地址SMTP server: ') # 输入服务器端口: smtp_host = input('请输入邮箱服务器端口: ') # 输入收件人地址: to_addr = input('请输入收件人邮箱地址To: ') server = smtplib.SMTP_SSL(smtp_server, smtp_host) # QQ邮箱的SMTP默认的端口是25,协议加密端口是465 server.set_debuglevel(1) # 调试级别,打印和SMTP服务器交互的所有信息 server.login(from_addr, password) # 登录SMTP服务器 server.sendmail(from_addr, [to_addr], msg.as_string()) # 发件人的邮箱地址,收件人邮箱地址(可以多个','隔开),内容(.as_string()把邮件内容MIMEText对象变成str) server.quit() # 邮件发送结束后,停止服务的意思. ```  > server.login(from_addr, password) > login()方法用来登录SMTP服务器,参数有两个, from_addr是用户输入的发件邮箱, password是发件邮箱的密码。 > server.sendmail(from_addr, [to_addr], msg.as_string()) > sendmail()方法就是发邮件,需要引入三个参数: > 第一个参数:from_addr是发件人的邮箱地址 > 第二个参数:[to_addr] 是收件人的邮箱地址, 是列表形式。因为邮件可能一次发给多个人,使用列表,如果发送多个人,就写多个邮箱,中间使用逗号隔开。 > 第三个参数:msg.as_string()把邮件内容MIMEText对象变成str。 > server.quit()语句,是邮件发送结束后,停止服务的意思.  #### 开启SMTP服务  如果出现这种错误, 就说明邮箱出现授权问题. 也就是邮箱的SMTP服务没有开启。 打开QQ邮箱客户端, 输入账号,密码进去. 在QQ邮箱页面, 点击【设置】  进【设置】页面进去,点击第二个选项,【账户】,往下滑动, 滑动在下方的时候, 出现如图内容:  在这里, 我们的SMTP服务还是关闭状态, 我们点击【开启】按钮, 开启SMTP服务。然后验证短信  这个就是授权码,输入的密码就是这个 ### 2.0 完整邮件 1. 邮件没有主题 2. 收件人的名字没有显示为友好的名字,比如Mr Green 这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把From、To和Subject添加到MIMEText中,才是一封完整的邮件 ``` from email import encoders # 负责编码 from email.header import Header # 负责处理邮件头 from email.mime.text import MIMEText # 负责处理文本 from email.utils import parseaddr, formataddr # 负责将输入的内容格式化 import smtplib # smtp库 # 构建一个类用来处理格式化文本,将格式化的结果作为返回值传出去 def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr)) # 输入Email地址和口令,常见第三方的密码不行,需要授权码,在设置——账户——生成授权码: from_addr = input('请输入发件人的邮箱号码From: ') password = input('请输入发件人的邮箱密码Password: ') # 输入SMTP服务器地址: smtp_server = input('请输入邮箱服务器地址SMTP server: ') # 输入服务器端口: smtp_host = input('请输入邮箱服务器端口: ') # 输入收件人地址: to_addr = input('请输入收件人邮箱地址To: ') msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8') # 内容 msg['From'] = _format_addr(u'发送者 <%s>' % from_addr) # 发件人名称 msg['To'] = _format_addr(u'收件者 <%s>' % to_addr) # 收件人名称 msg['Subject'] = Header(u'主题', 'utf-8').encode() # 主题 server = smtplib.SMTP_SSL(smtp_server, smtp_host) # QQ邮箱的SMTP默认的端口是25,协议加密端口是465 server.set_debuglevel(1) # 调试级别,打印和SMTP服务器交互的所有信息 server.login(from_addr, password) # 登录SMTP服务器 server.sendmail(from_addr, [to_addr], msg.as_string()) # 发件人的邮箱地址,收件人邮箱地址(可以多个','隔开),内容(.as_string()把邮件内容MIMEText对象变成str) server.quit() # 邮件发送结束后,停止服务的意思. ```   1. encoder s模块负责编码 2. Header 模块负责处理邮件头 3. MIMEText 模块负责处理文本 4. parseaddr 模块与formataddr模块 负责将输入的内容格式化 ``` def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr)) ``` 对输入的内容进行格式化操作,将格式化后的内容赋值给变量 ``` msg = MIMEText('hi,你好呀', 'plain', 'utf-8') msg['From'] = _format_addr(u'发送者 <%s>' % from_addr) msg['To'] = _format_addr(u'接收者 <%s>' % to_addr) msg['Subject'] = Header(u'主题', 'utf-8').encode() ``` 将发送邮箱、接收邮箱、邮件主题格式化 #### 发送多行内容 ``` content = ''' 亲爱的朋友: 你好! 恭喜大家学习坚持到现在! 只为赋能人才,让学习更轻松! ''' msg = MIMEText(content, 'plain', 'utf-8') ``` 使用三引号字符串,将邮件内所有内容放入content变量中 将msg中的内容,换成content变量 ``` from email import encoders # 负责编码 from email.header import Header # 负责处理邮件头 from email.mime.text import MIMEText # 负责处理文本 from email.utils import parseaddr, formataddr # 负责将输入的内容格式化 import smtplib # smtp库 # 构建一个类用来处理格式化文本,将格式化的结果作为返回值传出去 def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr)) # 输入Email地址和口令,常见第三方的密码不行,需要授权码,在设置——账户——生成授权码: from_addr = input('请输入发件人的邮箱号码From: ') password = input('请输入发件人的邮箱密码Password: ') # 输入SMTP服务器地址: smtp_server = input('请输入邮箱服务器地址SMTP server: ') # 输入服务器端口: smtp_host = input('请输入邮箱服务器端口: ') # 输入收件人地址: to_addr = input('请输入收件人邮箱地址To: ') # msg = MIMEText('hello, Python auto send email', 'plain', 'utf-8') # 内容 content = ''' 亲爱的朋友: 你好! 恭喜大家学习坚持到现在! 只为赋能人才,让学习更轻松! ''' msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = _format_addr(u'发送者 <%s>' % from_addr) # 发件人名称 msg['To'] = _format_addr(u'收件人名称,方便区分的名称 <%s>' % to_addr) # 收件人名称 msg['Subject'] = Header(u'主题', 'utf-8').encode() # 主题 server = smtplib.SMTP_SSL(smtp_server, smtp_host) # QQ邮箱的SMTP默认的端口是25,协议加密端口是465 server.set_debuglevel(1) # 调试级别,打印和SMTP服务器交互的所有信息 server.login(from_addr, password) # 登录SMTP服务器 server.sendmail(from_addr, [to_addr], msg.as_string()) # 发件人的邮箱地址,收件人邮箱地址(可以多个','隔开),内容(.as_string()把邮件内容MIMEText对象变成str) server.quit() # 邮件发送结束后,停止服务的意思. ```  ## 群发邮件 ``` from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr)) # 输入Email地址和口令: from_addr = input('请输入发件人的邮箱号码From: ') password = input('请输入发件人的邮箱密码Password: ') # 输入SMTP服务器地址: smtp_server = input('请输入邮箱服务器地址SMTP server: ') to_addr = [] while 1: # 输入收件人地址: addr = input('请输入收件人邮箱地址To: ') to_addr.append(addr) res =input('是否继续添加收件人(输入1继续,输入其他添加完毕):') #如果输入1就继续添加,否则不再添加 if res =='1': continue else: break content = ''' 亲爱的朋友: 你好! 恭喜大家学习坚持到现在! 只为赋能人才,让学习更轻松! ''' msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = _format_addr(u'开课吧 <%s>' % from_addr) msg['To'] = _format_addr(u'管理员 <%s>' % to_addr) msg['Subject'] = Header(u'来自小K的问候……', 'utf-8').encode() server = smtplib.SMTP_SSL(smtp_server, 465) server.set_debuglevel(1) server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) server.quit() ``` ## 带友好提醒 ``` from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib def _format_addr(s): name, addr = parseaddr(s) return formataddr(( Header(name, 'utf-8').encode(), addr)) # 输入Email地址和口令: from_addr = input('请输入发件人的邮箱号码From: ') password = input('请输入发件人的邮箱密码Password: ') # 输入SMTP服务器地址: smtp_server = input('请输入邮箱服务器地址SMTP server: ') # 输入收件人地址: to_addr = [] while True: a=input('请输入收件人邮箱:') to_addr.append(a) b=input('是否继续输入,n退出,任意键继续:') if b == 'n': break content = ''' 亲爱的朋友: 你好! 恭喜大家学习坚持到现在! 只为赋能人才,让学习更轻松! ''' msg = MIMEText(content, 'plain', 'utf-8') msg['From'] = _format_addr(u'发件人 <%s>' % from_addr) msg['To'] = _format_addr(u'收件人 <%s>' % to_addr) msg['Subject'] = Header(u'主题', 'utf-8').encode() try: # 执行内容 server = smtplib.SMTP_SSL(smtp_server, 465) # server.set_debuglevel(1) # 关闭SMTP调试 server.login(from_addr, password) server.sendmail(from_addr, to_addr, msg.as_string()) print("邮件发送成功") except smtplib.SMTPException: # 如果SMTP异常,抛出异常,并执行以下内容 print("Error: 无法发送邮件,SMTP异常") # 提示异常,SMTPException 异常,一般为帐号、密码、服务器、端口这类的问题 server.quit() ``` 
造物者W
2022年1月11日 12:22
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码