Python3 smtplib多收件人HTML邮件格式异常问题排查
问题
使用Python 3.10通过smtplib向多个收件人发送带HTML内容的邮件时,邮件能成功送达所有收件人,但HTML格式未正常渲染——既没有排版效果也没有换行,收到的内容和纯文本无异。以下是相关代码(已隐藏敏感凭据):
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.message import EmailMessage from email.utils import make_msgid cobertura = "Movistar" msisdn="53763615" client_name="Ernesto Ruiz Rodriguez" client_document="786876876786786" mensaje="Este mensaje ha sido enviado a los administradores solamente" content_text=f"""\ Saludos El sistema PANIX ha recibido una nueva portabilida móvil inversa con los siguientes datos: Cobertura: {cobertura} Msisdn: {msisdn} Nombre cliente: {client_name} Documento cliente: {client_document} Otra información de interes: {mensaje} Le recomendamos hacer un seguimiento del estado de esta portabilidad desde el apartado "Portabilidad móvil/Solicitudes portabilidad móvil inversa" Atentamente: Equipo Panix """ content_html=f"""\ <html> <head></head> <body> <p><strong>Saludos</strong></p> <p>El sistema PANIX ha recibido una nueva portabilida móvil inversa con los siguientes datos:</p> <p><strong>Cobertura:</strong> {cobertura}</p> <p><strong>Msisdn:</strong> {msisdn}</p> <p><strong>Nombre cliente:</strong> {client_name}</p> <p><strong>Documento cliente:</strong> {client_document}</p> <p><strong>Otra información de interes:</strong></p> <p>{mensaje}</p> <p>Le recomendamos hacer un seguimiento del estado de esta portabilidad desde el apartado "Portabilidad móvil/Solicitudes portabilidad móvil inversa".</p> <p>Atentamente:</p> <p>Equipo Panix</p> </body> </html> """ mail=smtplib.SMTP('smtp.server.com', 587) mail.ehlo() mail.starttls() mail.login('user@server.com','password') sender_email='from@server.com' receiver_email='receiver1@gmail.com, receiver2@gmail.com' message = EmailMessage() message["Subject"] = "Message with html to multiple receipents" message["From"] = sender_email message["To"] = receiver_email message.set_content(content_text) message.add_alternative(content_text, subtype='html') mail.send_message(message) mail.close()
解决方案
核心错误修正
你的代码里add_alternative方法传入的是纯文本内容content_text,而非定义好的HTML内容content_html,导致邮件客户端无法识别并渲染HTML格式。把这一行的参数替换为content_html即可解决格式问题。
其他优化建议
- 收件人格式规范:虽然部分SMTP服务器支持逗号分隔的字符串收件人,但更可靠的方式是使用列表格式,避免解析错误:
receiver_email = ["receiver1@gmail.com", "receiver2@gmail.com"] - 使用上下文管理器管理SMTP连接:用
with语句自动处理连接的打开和关闭,无需手动调用close(),代码更健壮。
修正后的完整代码
import smtplib from email.message import EmailMessage cobertura = "Movistar" msisdn="53763615" client_name="Ernesto Ruiz Rodriguez" client_document="786876876786786" mensaje="Este mensaje ha sido enviado a los administradores solamente" content_text=f"""\ Saludos El sistema PANIX ha recibido una nueva portabilida móvil inversa con los siguientes datos: Cobertura: {cobertura} Msisdn: {msisdn} Nombre cliente: {client_name} Documento cliente: {client_document} Otra información de interes: {mensaje} Le recomendamos hacer un seguimiento del estado de esta portabilidad desde el apartado "Portabilidad móvil/Solicitudes portabilidad móvil inversa" Atentamente: Equipo Panix """ content_html=f"""\ <html> <head></head> <body> <p><strong>Saludos</strong></p> <p>El sistema PANIX ha recibido una nueva portabilida móvil inversa con los siguientes datos:</p> <p><strong>Cobertura:</strong> {cobertura}</p> <p><strong>Msisdn:</strong> {msisdn}</p> <p><strong>Nombre cliente:</strong> {client_name}</p> <p><strong>Documento cliente:</strong> {client_document}</p> <p><strong>Otra información de interes:</strong></p> <p>{mensaje}</p> <p>Le recomendamos hacer un seguimiento del estado de esta portabilidad desde el apartado "Portabilidad móvil/Solicitudes portabilidad móvil inversa".</p> <p>Atentamente:</p> <p>Equipo Panix</p> </body> </html> """ sender_email='from@server.com' receiver_email = ["receiver1@gmail.com", "receiver2@gmail.com"] message = EmailMessage() message["Subject"] = "Message with html to multiple receipents" message["From"] = sender_email message["To"] = receiver_email # 设置纯文本 fallback,供不支持HTML的客户端显示 message.set_content(content_text) # 添加HTML内容 message.add_alternative(content_html, subtype='html') # 使用上下文管理器管理SMTP连接 with smtplib.SMTP('smtp.server.com', 587) as mail: mail.ehlo() mail.starttls() mail.login('user@server.com','password') mail.send_message(message)
内容的提问来源于stack exchange,提问作者Ernesto Ruiz
相关产品推荐
相关产品推荐

