本文目录导读:

我来介绍几种在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发送邮件的常见场景,你可以根据实际需求选择合适的方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播