本文目录导读:

我来介绍几种在Python中发送邮件的方法。
使用 smtplib 发送简单邮件
基础示例(使用QQ邮箱)
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件配置
smtp_server = "smtp.qq.com"
smtp_port = 465 # SSL端口
sender_email = "your_email@qq.com"
sender_password = "your_authorization_code" # QQ邮箱授权码
receiver_email = "receiver@example.com"
# 创建邮件内容
message = MIMEText("这是一封测试邮件。", "plain", "utf-8")
message["From"] = Header("发件人昵称", "utf-8")
message["To"] = Header("收件人昵称", "utf-8")
message["Subject"] = Header("邮件主题", "utf-8")
try:
# 连接SMTP服务器(SSL方式)
with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
server.login(sender_email, sender_password)
server.sendmail(sender_email, [receiver_email], message.as_string())
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败:{e}")
发送HTML格式邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_html_email():
html_content = """
<html>
<body>
<h1>HTML格式邮件</h1>
<p>这是一封 <b>HTML</b> 格式的邮件。</p>
<p>可以包含样式和格式。</p>
<ul>
<li>列表项1</li>
<li>列表项2</li>
<li>列表项3</li>
</ul>
<a href="https://www.example.com">点击访问</a>
</body>
</html>
"""
message = MIMEText(html_content, "html", "utf-8")
message["From"] = "发件人 <sender@example.com>"
message["To"] = "收件人 <receiver@example.com>"
message["Subject"] = "HTML格式测试邮件"
with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
server.login("your_email@qq.com", "password")
server.sendmail("sender@example.com", ["receiver@example.com"], message.as_string())
send_html_email()
发送带附件的邮件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
def send_email_with_attachment():
# 创建多部分邮件对象
msg = MIMEMultipart()
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"
msg["Subject"] = "带附件的测试邮件"
# 邮件正文
body = "这是一封带附件的邮件。"
msg.attach(MIMEText(body, "plain", "utf-8"))
# 添加附件
filename = "test.txt" # 附件文件名
attachment_path = "path/to/your/file" # 附件路径
try:
with open(attachment_path, "rb") as attachment:
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header(
"Content-Disposition",
f"attachment; filename= {filename}",
)
msg.attach(part)
except FileNotFoundError:
print("附件文件未找到")
return
# 发送邮件
with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
server.login("your_email@qq.com", "password")
server.send_message(msg)
send_email_with_attachment()
完整示例:邮件发送函数
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from typing import List, Dict, Optional
import os
class EmailSender:
"""邮件发送类"""
def __init__(self, smtp_server: str, smtp_port: int,
email: str, password: str, use_ssl: bool = True):
self.smtp_server = smtp_server
self.smtp_port = smtp_port
self.email = email
self.password = password
self.use_ssl = use_ssl
def send_email(self,
receivers: List[str],
subject: str,
body: str,
body_type: str = "plain",
attachments: Optional[List[str]] = None,
cc: Optional[List[str]] = None,
bcc: Optional[List[str]] = None) -> bool:
"""
发送邮件
Args:
receivers: 收件人列表
subject: 邮件主题
body: 邮件正文
body_type: 正文类型 ("plain" 或 "html")
attachments: 附件路径列表
cc: 抄送人列表
bcc: 密送人列表
Returns:
bool: 是否发送成功
"""
try:
# 创建邮件对象
msg = MIMEMultipart()
msg["From"] = self.email
msg["Subject"] = subject
# 处理收件人
all_receivers = receivers.copy()
if cc:
msg["Cc"] = ", ".join(cc)
all_receivers.extend(cc)
if bcc:
all_receivers.extend(bcc)
msg["To"] = ", ".join(receivers)
# 添加正文
msg.attach(MIMEText(body, body_type, "utf-8"))
# 添加附件
if attachments:
for file_path in attachments:
if not os.path.exists(file_path):
print(f"附件不存在: {file_path}")
continue
with open(file_path, "rb") as f:
part = MIMEBase("application", "octet-stream")
part.set_payload(f.read())
encoders.encode_base64(part)
filename = os.path.basename(file_path)
part.add_header(
"Content-Disposition",
f"attachment; filename={filename}"
)
msg.attach(part)
# 发送邮件
if self.use_ssl:
with smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) as server:
server.login(self.email, self.password)
server.sendmail(self.email, all_receivers, msg.as_string())
else:
with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
server.ehlo()
server.starttls()
server.ehlo()
server.login(self.email, self.password)
server.sendmail(self.email, all_receivers, msg.as_string())
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
# 使用示例
if __name__ == "__main__":
# 初始化发送器
sender = EmailSender(
smtp_server="smtp.qq.com",
smtp_port=465,
email="your_email@qq.com",
password="your_authorization_code",
use_ssl=True
)
# 发送邮件
success = sender.send_email(
receivers=["receiver@example.com", "another@example.com"],
subject="测试邮件",
body="<h1>Hello!</h1><p>这是一封测试邮件。</p>",
body_type="html",
attachments=["/path/to/file1.pdf", "/path/to/file2.txt"],
cc=["cc@example.com"],
bcc=["bcc@example.com"]
)
if success:
print("邮件发送完成")
else:
print("邮件发送失败")
常用邮箱SMTP配置
| 邮箱服务 | SMTP服务器 | SSL端口 | TLS端口 | 备注 |
|---|---|---|---|---|
| QQ邮箱 | smtp.qq.com | 465 | 587 | 需开启SMTP服务 |
| 163邮箱 | smtp.163.com | 465 | 25 | 需开启IMAP/SMTP |
| Gmail | smtp.gmail.com | 465 | 587 | 需开启低安全性应用访问 |
| Outlook | smtp.office365.com | 587 | 587 | 需开启SMTP认证 |
获取邮箱授权码
QQ邮箱:
- 登录QQ邮箱
- 设置 → 账户
- 开启POP3/SMTP服务
- 生成授权码(用于登录密码)
163邮箱:
- 登录163邮箱
- 设置 → POP3/SMTP/IMAP
- 开启SMTP服务
- 设置客户端授权密码
注意事项
- 安全性:不要在代码中硬编码密码,建议使用环境变量或配置文件
- 错误处理:添加完善的异常处理机制
- 发送限制:大多数邮箱有日发送量限制
- 垃圾邮件:避免发送大量邮件,防止被标记为垃圾邮件
- 附件大小:注意附件大小限制(通常25MB以内)
使用环境变量示例
import os
from dotenv import load_dotenv
load_dotenv()
EMAIL = os.getenv("EMAIL")
PASSWORD = os.getenv("EMAIL_PASSWORD")
SMTP_SERVER = os.getenv("SMTP_SERVER", "smtp.qq.com")
SMTP_PORT = int(os.getenv("SMTP_PORT", "465"))
这些示例涵盖了Python发送邮件的常见场景,你可以根据实际需求选择合适的方案。