Python实现类StackOverflow风格带代码块的Markdown转HTML(适配邮件)
解决方案:Markdown转邮件HTML的代码块样式优化
首先确认你用markdown2的fenced-code-blocks扩展生成的是<pre><code>结构的代码块——这是基础,只要启用扩展就没问题。接下来核心是兼容邮件客户端的CSS样式,因为邮件不支持JS,且对CSS的支持比浏览器有限,得针对性调整。
关键CSS调整方案
直接在HTML头部内嵌<style>标签(主流邮箱都支持这种方式),分别处理行内代码和代码块:
- 行内代码:保留轻量背景和内边距,和GitHub风格一致
- 代码块:用背景色、内边距、边框构建矩形区域,同时用
overflow-x:auto解决代码过长导致的右侧错乱问题(这个属性在Gmail、新版Outlook、Apple Mail都支持)
完整Python实现代码
import markdown2 def md_to_email_html(md_file_path): # 读取Markdown文件 with open(md_file_path, 'r', encoding='utf-8') as f: md_content = f.read() # 转换HTML,启用代码块扩展 converted_html = markdown2.markdown(md_content, extras=["fenced-code-blocks"]) # 邮件专用HTML模板,带兼容样式 email_html_template = """ <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style type="text/css"> /* 全局基础样式,适配邮件阅读 */ body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; line-height: 1.5; color: #24292f; max-width: 800px; margin: 0 auto; padding: 20px; } /* 行内代码样式 */ code { font-family: Consolas, "Liberation Mono", Menlo, Courier, monospace; background-color: #f6f8fa; padding: 2px 4px; border-radius: 3px; font-size: 85%; } /* 代码块容器:构建GitHub风格的矩形区域 */ pre { background-color: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; margin: 16px 0; border: 1px solid #e1e4e8; } /* 代码块内的代码:重置行内样式,避免冲突 */ pre code { padding: 0; background: none; border-radius: 0; font-size: 85%; white-space: pre; word-break: normal; } /* 标题样式优化,接近GitHub */ h1, h2, h3 { border-bottom: 1px solid #eaecef; padding-bottom: 0.3em; margin-top: 24px; margin-bottom: 16px; } </style> </head> <body> {converted_content} </body> </html> """ # 拼接最终HTML final_email_html = email_html_template.format(converted_content=converted_html) return final_email_html # 使用示例 if __name__ == "__main__": result_html = md_to_email_html("your_markdown_file.md") # 这里可以用smtplib发送result_html作为邮件内容 print(result_html)
注意事项
- 不要用外部CSS文件:邮件客户端几乎都不支持外链样式,必须内嵌在
<head>里 - 兼容性兜底:老版Outlook可能不支持
border-radius,但背景色、内边距、边框依然会生效,保证代码块的矩形区域能正常显示 - 代码换行处理:用
white-space:pre保留代码原格式,overflow-x:auto让长代码可以横向滚动,避免右侧内容错乱
内容的提问来源于stack exchange,提问作者JJandke
相关产品推荐
相关产品推荐

