Python循环内HTML代码嵌入变量失效及邮件内容设置问题
解决Python批量邮件发送的两个问题
问题1:HTML内容中变量b未正常渲染
- 原因:HTML字符串未完成变量插值,直接写入
{b}不会被Python解析,必须通过字符串格式化方法替换变量 - 解决方法:使用f-string(Python 3.6+)或
str.format()将变量嵌入HTML内容
示例:# 错误写法:{b}不会被解析 html_content = "<p>您好,{b},这是测试邮件</p>" # 正确写法1:f-string插值 html_content = f"<p>您好,{b},这是测试邮件</p>" # 正确写法2:format方法插值 html_content = "<p>您好,{},这是测试邮件</p>".format(b)
问题2:msg.add_alternative()后msg.set_content()看似失效
- 原因:当邮件同时包含纯文本和HTML版本时,支持HTML的邮件客户端会优先显示HTML内容,并非
set_content()功能失效 - 解决方法:确保纯文本内容同步替换变量,保持
set_content()在前、add_alternative()在后(顺序不影响功能,但逻辑更清晰),测试时可切换邮件客户端的「显示纯文本」模式验证内容
完整批量发送代码示例:import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 收件人列表:(姓名, 邮箱)格式 recipients = [("张三", "zhangsan@example.com"), ("李四", "lisi@example.com")] smtp_server = "smtp.example.com" smtp_port = 587 sender_email = "your_email@example.com" sender_password = "your_app_password" for name, email in recipients: # 创建多部分邮件对象 msg = MIMEMultipart('alternative') msg['From'] = sender_email msg['To'] = email msg['Subject'] = f"专属通知 - {name}" # 设置纯文本内容(替换变量) plain_text = f"您好,{name},这是纯文本版本的邮件内容" msg.set_content(plain_text) # 设置HTML内容(替换变量) html_text = f""" <html> <body> <h1>您好,{name}!</h1> <p>这是为您定制的HTML格式邮件</p> </body> </html> """ msg.add_alternative(html_text, subtype='html') # 发送邮件 with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(sender_email, sender_password) server.send_message(msg)
MacBook设备额外注意事项
- 若使用Gmail等第三方邮箱,需开启应用专用密码(Mac系统安全限制下,直接用账号密码可能登录失败)
- 测试时优先发送到自己的邮箱,通过客户端的「显示纯文本」选项验证
set_content()的内容是否正常
内容的提问来源于stack exchange,提问作者user20817578
相关产品推荐
相关产品推荐

