如何修改Python邮件脚本,将邮件发送至To字段而非Bcc密送
解决邮件To字段显示问题及代码优化建议
核心修改:让邮件显示在To字段
当前代码中,server.sendmail()虽指定了收件人,但邮件内容的头部未包含To字段,导致邮件客户端将其识别为密送(Bcc)。只需在构建邮件内容时添加To头部即可解决:
修改构建邮件的代码:
# 原代码 message = 'Subject: {}\n\n{}'.format(Subject, Body) # 修改后 message = 'To: {}\nSubject: {}\n\n{}'.format(email, Subject, Body)
修改后,邮件头部会明确标注收件人邮箱,收件人打开邮件时就能在To栏看到自己的地址。
代码整体优化建议(针对Python新手)
- 更简洁的遍历方式:避免用
range(len(emails)),直接用zip同时迭代姓名、邮箱和类型,代码更易读:
for name, email, email_type in zip(names, emails, types): if email_type == 1: # 处理类型1的邮件逻辑 else: # 处理类型2的邮件逻辑
- 使用标准库构建邮件:手动拼接邮件头部容易出错,推荐用
email.mime模块构建邮件,更规范且支持扩展(如HTML邮件、附件):
from email.mime.text import MIMEText # 构建邮件对象 msg = MIMEText(Body) msg['From'] = your_email msg['To'] = email msg['Subject'] = Subject # 发送邮件 server.send_message(msg)
- 避免硬编码敏感信息:邮箱密码直接写在代码里不安全,建议用环境变量读取:
import os your_password = os.getenv('EMAIL_PASSWORD')
(设置环境变量:Windows用set EMAIL_PASSWORD=你的密码,Mac/Linux用export EMAIL_PASSWORD=你的密码)
- 添加异常处理:发送邮件可能遇到网络错误、收件人无效等问题,添加异常处理能避免程序崩溃,还能记录失败情况:
try: server.sendmail(your_email, [email], message) print(f"邮件已发送给 {email}") except Exception as e: print(f"发送邮件给 {email} 失败: {str(e)}")
规范变量名:遵循PEP8命名规范,变量名用小写字母加下划线,比如
types改成email_types(避免和内置type冲突),Subject改成subject,message_1改成message_for_type1,让代码更易维护。自动管理连接:用
with语句管理SMTP连接,无需手动调用server.close(),连接会自动关闭:
with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server: server.login(your_email, your_password) # 遍历发送邮件的代码放在这里
内容的提问来源于stack exchange,提问作者LeroyBrown
相关产品推荐
相关产品推荐

