如何解决Django中win32发送邮件HTML样式失效问题?
问题原因
Outlook采用Word的HTML渲染引擎,对W3C标准CSS支持存在诸多限制:
<head>中的<style>块经常被忽略,类选择器、ID选择器的渲染逻辑极不稳定- 部分CSS属性(如
border-radius)在Outlook中完全不生效 - 块级元素的盒模型(padding、margin)渲染结果不一致
解决方案
改用内联样式(直接写在标签的style属性中),这是Outlook最兼容的样式实现方式,同时彻底放弃类/ID选择器。
修改后的代码
pythoncom.CoInitialize() dynamic_link='prueba' try: outlook = win32.Dispatch('Outlook.Application') mail = outlook.CreateItem(0) mail.SentOnBehalfOfName = 'example@outlook.com' mail.To = adminEmail mail.Subject = 'NUEVA SOLICITUD DE PRUEBAS DE LABORATORIO' # 移除<head>中的<style>块,全部改用内联样式 html_body = f""" <html> <body style="font-family: Arial, sans-serif; padding: 20px; background-color: red;"> <h1 style="color: #333;">Solicitud de pruebas de laboratorio</h1> <p style="color: #333;">Nueva solicitud pruebas de laboratorio del usuario {FullName}</p> <div style="width: 130px; height:130px; background-color:white;"> <p style="color: #333;">El usuario {FullName} ha creado una nueva solicitud de pruebas de laboratorio para el cliente {customer} con una fecha requerida para el {require_date}</p> </div> <!-- Outlook不支持border-radius,此处移除该属性以避免无效代码 --> <a href="{dynamic_link}" style="display: inline-block; padding: 10px 20px; background-color: #4CAF50; color: #fff; text-decoration: none;">Ir a la página</a> </body> </html> """ mail.HTMLBody = html_body mail.Send() return Response({"message": "Correo enviado correctamente"}, status=status.HTTP_200_OK) except Exception as e: print(f"Error: {e}") finally: pythoncom.CoUninitialize()
额外注意事项
- 复杂布局建议:如果需要稳定的多栏或嵌套布局,必须使用
<table>实现,Outlook对表格的渲染逻辑远优于块级元素 - 属性兼容清单:提前确认Outlook支持的CSS属性,避免使用
box-shadow、transition等完全不兼容的属性 - 变量校验:确保f-string中的动态变量(如
{FullName}、{customer})已正确赋值,避免渲染后出现未替换的占位符
内容的提问来源于stack exchange,提问作者Leonardo Chavira
相关产品推荐
相关产品推荐

