本文目录导读:

我来介绍几种常用的自动化发送邮件的方法,从简单到复杂:
Python + SMTP 方式(最常用)
基础示例
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os
def send_email(sender_email, sender_password, receiver_email,
subject, body, smtp_server, smtp_port, attachments=None):
"""
发送邮件的通用函数
"""
try:
# 创建邮件对象
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = receiver_email
message['Subject'] = subject
# 添加邮件正文
message.attach(MIMEText(body, 'plain', 'utf-8'))
# 添加附件
if attachments:
for file_path in attachments:
with open(file_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={os.path.basename(file_path)}'
)
message.attach(part)
# 连接到SMTP服务器并发送
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password)
server.send_message(message)
print("邮件发送成功!")
return True
except Exception as e:
print(f"邮件发送失败: {e}")
return False
# 使用示例
if __name__ == "__main__":
# 配置信息(以QQ邮箱为例)
sender = "your_email@qq.com"
password = "your_smtp_authorization_code" # 使用授权码,不是QQ密码
receiver = "receiver@example.com"
send_email(
sender_email=sender,
sender_password=password,
receiver_email=receiver,
subject="自动化邮件测试",
body="这是一封自动发送的测试邮件。",
smtp_server="smtp.qq.com",
smtp_port=587,
attachments=["report.pdf", "data.csv"] # 可选附件
)
常用邮箱SMTP配置
EMAIL_CONFIGS = {
"qq": {
"smtp_server": "smtp.qq.com",
"smtp_port": 587,
"need_ssl": True
},
"163": {
"smtp_server": "smtp.163.com",
"smtp_port": 25,
"need_ssl": False
},
"gmail": {
"smtp_server": "smtp.gmail.com",
"smtp_port": 587,
"need_ssl": True
},
"outlook": {
"smtp_server": "smtp-mail.outlook.com",
"smtp_port": 587,
"need_ssl": True
}
}
使用 yagmail 简化版
import yagmail
# 更简洁的方式
yag = yagmail.SMTP(
user='your_email@qq.com',
password='your_authorization_code',
host='smtp.qq.com'
)
# 发送邮件
yag.send(
to=['receiver1@example.com', 'receiver2@example.com'],
subject='自动化邮件',
contents=['邮件正文', 'html内容', '附件文件.txt'],
attachments=['image.jpg', 'document.pdf']
)
批量发送带模板的邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import csv
from string import Template
class EmailAutomation:
def __init__(self, smtp_config):
self.smtp_config = smtp_config
self.server = None
def connect(self):
"""连接到SMTP服务器"""
self.server = smtplib.SMTP(
self.smtp_config['host'],
self.smtp_config['port']
)
self.server.starttls()
self.server.login(
self.smtp_config['user'],
self.smtp_config['password']
)
def load_template(self, template_file):
"""加载邮件模板"""
with open(template_file, 'r', encoding='utf-8') as f:
return Template(f.read())
def load_recipients(self, csv_file):
"""从CSV加载收件人列表"""
recipients = []
with open(csv_file, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
recipients.append(row)
return recipients
def send_bulk_emails(self, template_file, csv_file):
"""批量发送邮件"""
template = self.load_template(template_file)
recipients = self.load_recipients(csv_file)
self.connect()
for recipient in recipients:
# 个性化邮件内容
email_body = template.substitute(recipient)
msg = MIMEMultipart()
msg['From'] = self.smtp_config['user']
msg['To'] = recipient['email']
msg['Subject'] = f"尊敬的{recipient['name']},您的个性化邮件"
msg.attach(MIMEText(email_body, 'html', 'utf-8'))
self.server.send_message(msg)
print(f"已发送: {recipient['email']}")
self.server.quit()
print("全部邮件发送完成!")
# 使用示例
config = {
'host': 'smtp.qq.com',
'port': 587,
'user': 'your_email@qq.com',
'password': 'your_authorization_code'
}
emailer = EmailAutomation(config)
emailer.send_bulk_emails('template.html', 'recipients.csv')
定时发送邮件(使用 schedule 库)
import schedule
import time
from datetime import datetime
def scheduled_email_job():
"""定时执行的邮件任务"""
print(f"{datetime.now()}: 开始发送定时邮件...")
# 这里调用上面的发送函数
# send_email(...)
print("定时邮件发送完成")
# 设置定时任务
schedule.every().day.at("09:00").do(scheduled_email_job) # 每天早上9点
schedule.every().monday.at("10:00").do(scheduled_email_job) # 每周一10点
schedule.every(30).minutes.do(scheduled_email_job) # 每30分钟
# 运行定时任务
while True:
schedule.run_pending()
time.sleep(1)
发送HTML格式化邮件
def send_html_email(sender, password, receiver, subject, html_content):
"""发送HTML格式邮件"""
msg = MIMEMultipart('alternative')
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = subject
# 纯文本版本(备用)
text_part = MIMEText("请使用支持HTML的邮件客户端查看", 'plain', 'utf-8')
msg.attach(text_part)
# HTML版本
html_part = MIMEText(html_content, 'html', 'utf-8')
msg.attach(html_part)
# 发送...
使用第三方服务(如SendGrid)
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
def send_via_sendgrid():
"""使用SendGrid发送邮件"""
message = Mail(
from_email='sender@example.com',
to_emails='receiver@example.com',
subject='SendGrid Test',
html_content='<strong>测试邮件</strong>'
)
sg = SendGridAPIClient('YOUR_SENDGRID_API_KEY')
response = sg.send(message)
print(f"发送状态: {response.status_code}")
注意事项
-
邮箱授权码:大部分邮箱需要开启SMTP服务并获取授权码,不是直接使用登录密码
-
发送限制:免费邮箱通常有每日发送限制(如Gmail每日500封)
-
垃圾邮件处理:避免发送大量相同内容,否则可能被标记为垃圾邮件
-
安全考虑:
# 不要硬编码密码,使用环境变量 import os password = os.getenv('EMAIL_PASSWORD') # 或使用配置文件 import configparser config = configparser.ConfigParser() config.read('config.ini') password = config['email']['password']
根据需要选择合适的方案,对于简单任务使用基本的SMTP即可,批量任务建议使用封装好的库。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播