Python通过SMTP向收件人列表发信仅首个收件人可收到问题求助
问题原因分析
你遇到的问题本质是第三方邮件库Dmail的send()方法实现缺陷:该方法的第二个位置参数仅会取列表的第一个元素作为实际提交给SMTP服务器的收信地址,其余地址仅会被渲染到邮件头部的收件人显示栏,不会触发实际的发信流程,因此会出现收件人栏显示多地址但仅第一个地址收到邮件的情况。你之前尝试的列表转字符串、追加符号的操作仅会修改邮件头显示内容,不会影响实际发信逻辑,因此无效。
可行解决方案
- 方案1:遍历收件人列表单独发信
如果不需要收件人看到其他收件人地址,可循环调用send()方法分别发信,代码示例:
from Dmail import Email sender_email = 'sender@email.com' email_list = ['name@email.com', 'name2@email.com'] with Email(mail_server="smtp.myserver.org", sender_email=sender_email, mail_port=25, mail_use_ssl=False, mail_use_tls=False) as email: for recipient in email_list: email.send("Test Body", recipient, subject="test")
- 方案2:调整
Dmail传参方式
部分版本的Dmail支持通过to_addrs关键字参数传入收件人列表,修改调用方式即可:
from Dmail import Email sender_email = 'sender@email.com' email_list = ['name@email.com', 'name2@email.com'] with Email(mail_server="smtp.myserver.org", sender_email=sender_email, mail_port=25, mail_use_ssl=False, mail_use_tls=False) as email: email.send("Test Body", to_addrs=email_list, subject="test")
- 方案3:替换为Python标准库
smtplib实现
如果Dmail无法满足需求,可直接使用标准库实现批量发信,兼容性更高:
import smtplib from email.mime.text import MIMEText from email.header import Header sender_email = 'sender@email.com' email_list = ['name@email.com', 'name2@email.com'] # 构造邮件内容 message = MIMEText('Test Body', 'plain', 'utf-8') message['From'] = Header(sender_email) message['To'] = Header(','.join(email_list)) message['Subject'] = Header('test', 'utf-8') # 发信逻辑 try: smtp_obj = smtplib.SMTP('smtp.myserver.org', 25) # sendmail方法第二个参数直接传入收件人列表即可实现批量发送 smtp_obj.sendmail(sender_email, email_list, message.as_string()) print("邮件发送成功") except smtplib.SMTPException as e: print(f"发信失败:{e}") finally: if 'smtp_obj' in locals(): smtp_obj.quit()
注意事项
- 不要自行将收件人列表拼接为带逗号/分号的字符串传入发信参数,绝大多数SMTP服务端不识别该格式,会直接判定为无效地址。
- 批量发信时控制发信频率,避免触发SMTP服务器的反垃圾邮件规则导致发信权限被限制。
内容的提问来源于stack exchange,提问作者smitty_werben_jagerm
相关产品推荐
相关产品推荐

