You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可解决格式问题。

其他优化建议

  1. 收件人格式规范:虽然部分SMTP服务器支持逗号分隔的字符串收件人,但更可靠的方式是使用列表格式,避免解析错误:
    receiver_email = ["receiver1@gmail.com", "receiver2@gmail.com"]
    
  2. 使用上下文管理器管理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:04:52