Python 发送邮件
SMTP发送邮件
SMTP是邮件发生的协议,Python内置对SMTP的支持,可以通过Pytho发送纯文本邮件、Html邮件以及带附件的邮件
其中PYthon对SMTP只有的有smtplib和email两个模块,email负责构造邮件,smtplib负责邮件发送
1.首先来一个纯文本邮件的demo
from email.mime.text import MIMEText
import smtplib
info = MIMEText('Hello World','plain','utf-8')
#构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,'plain'表示纯文本,最终MIME就是'text/plain',第三个为字符集
#定义Email地址和密码
from_addr = 'xxx@xxx.com'
password = 'xxxxxx'
#收件人邮箱地址
to_user = 'xxxxx@xxx.com'
#SMTP邮件服务器地址
smtp_server = 'xxx.smtp.com'
s = smtplib.SMTP(smtp_server,25) #定义一个s对象
s.set_debuglevel(1) #打印debug日志
s.login(from_server,password) #auth发件人信息
server.sendmail(from_addr,to_addr,info.as_string())
s.quit()
测试下,OK可以收到邮件,但是这个邮件没有主题和发件人等信息,这样的邮件很容易被邮件管理系统标记为垃圾邮件甚至被直接拒绝,所以,我们需要对邮件进行添加主题等信息
2.对一个邮件添加主题等信息
#!/bin/env python
#-*- coding:utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from_addr = 'xxx'
passwd = 'xxx'
to_addr = 'xxx'
smtp_addr = 'xxx'
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
msg = MIMEText('Hello 这封是带主题的', 'plain', 'utf-8')
msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()
s = smtplib.SMTP(smtp_addr,25) #定义一个s对象
s.set_debuglevel(1) #打印debug日志
s.login(from_addr,passwd) #auth发件人信息
s.sendmail(from_addr,to_addr,msg.as_string())
s.quit()
这里写了一个函数_format_addr()用来格式化邮件的地址
HTMl格式的邮件
msg = MIMEText('
Hello
' +'
send by Python...
' +'', 'html', 'utf-8')
3.大招 发送附件
#!/bin/env python
#-*- coding:utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.base import MIMEBase
import smtplib
from_addr = 'xxx'
passwd = 'xxx'
to_addr = 'xxx'
smtp_addr = 'xxx'
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
msg = MIMEMultipart()
msg['From'] = _format_addr('我是发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('这是邮件主题', 'utf-8').encode()
# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))
# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/tmp/1.png', 'rb') as f:
# 设置附件的MIME和文件名,这里是png类型:
mime = MIMEBase('image', 'png', filename='1.png')
# 加上必要的头信息:
mime.add_header('Content-Disposition', 'attachment',
filename='1.png')
mime.add_header('Content-ID', '<0>')
同时支持HTML和Plain格式
如果发html格式邮件,收件人如果不支持就无法浏览,so可以选择同时支持
msg = MIMEMultipart('alternative')
msg['From'] = ...
msg['To'] = ...
msg['Subject'] = ...
msg.attach(MIMEText('hello', 'plain', 'utf-8'))
msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html', 'utf-8'))
# 正常发送msg对象...
加密SMTP
smtp_server = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()
# 剩下的代码和前面的一模一样:
server.set_debuglevel(1)
总结:
smtplib 只需要掌握构造方法 设置好邮件开头 就可以顺利发送邮件
构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。它们的继承关系如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· 官方的 MCP C# SDK:csharp-sdk
· 一款 .NET 开源、功能强大的远程连接管理工具,支持 RDP、VNC、SSH 等多种主流协议!
· 提示词工程师自白:我如何用一个技巧解放自己的生产力
· 一文搞懂MCP协议与Function Call的区别
· 如何不购买域名在云服务器上搭建HTTPS服务