已有批量发邮件代码,如何为每个收件人个性化设置显示名称?
给批量邮件的每个收件人添加个性化显示名称的解决方案
嘿,这个需求很好实现!核心是要遵循邮件地址的标准格式,把显示名称+邮箱地址组合起来,再针对每个收件人单独处理邮件的收件人字段——这样既能保证个性化显示,还能避免所有收件人看到彼此的信息。
关键原理
邮件客户端识别的带显示名称的地址格式是:
"显示名称" <邮箱地址>
比如 "John Doe" <john.doe@example.com>,这样收件人在邮箱里看到的收件人信息就会是友好的名称,而不是冷冰冰的邮箱字符串。
修改后的完整代码
我们把收件人列表改成包含名称和邮箱的结构,然后循环给每个收件人发送定制化的邮件:
import smtplib from email.mime.text import MIMEText # 初始化SMTP连接 s = smtplib.SMTP('smtp.uk.xensource.com') s.set_debuglevel(1) # 定义带个性化名称的收件人列表 recipients = [ ("John Doe", "john.doe@example.com"), ("John Smith", "john.smith@example.co.uk") ] sender = 'me@example.com' email_subject = "你的专属邮件主题" # 遍历每个收件人发送邮件 for recipient_name, recipient_email in recipients: # 构造个性化邮件内容(可选:把名称插入正文) email_body = f"Hi {recipient_name},\n\n这是为你定制的邮件内容,希望对你有帮助!" msg = MIMEText(email_body) # 设置邮件头部信息 msg['Subject'] = email_subject msg['From'] = sender # 重点:设置带显示名称的收件人字段 msg['To'] = f'"{recipient_name}" <{recipient_email}>' # 发送邮件,注意sendmail的第二个参数是纯邮箱地址列表 s.sendmail(sender, [recipient_email], msg.as_string()) # 关闭SMTP连接 s.quit()
几个重要细节
- 逐个发送的好处:如果直接把所有带名称的地址用逗号拼起来放到
msg['To']里,所有收件人都会在收件人列表里看到彼此的信息。逐个发送能保证每个人的邮箱里只显示自己的名称,更隐私也更友好。 - 正文个性化扩展:你可以像示例里那样,把
recipient_name插入到邮件正文中,让邮件的个性化程度更高。 - 格式注意:显示名称外面的双引号是可选的,但如果名称里包含空格或者特殊字符,加上双引号能避免解析错误。
内容的提问来源于stack exchange,提问作者Pedro Gabriel Carvalho




