Postfix MTA下将旧系统纯文本邮件包装为HTML的优雅方案咨询
Postfix MTA下将旧系统纯文本邮件包装为HTML的优雅方案咨询
嗨Pa0x43,碰到这种没法改造旧系统的情况确实头疼,我给你几个比自己从零写Go Milter更省心的优雅方案,都是Postfix生态里现成的工具或者配置技巧,上手快还稳:
方案一:用MIMEDefang(成熟邮件过滤框架)
这是最推荐的方案,它本身就是基于Milter接口的Perl框架,专门用来处理邮件格式转换、垃圾邮件过滤这类需求,比自己写Milter少踩很多坑:
- 先安装MIMEDefang:Debian/Ubuntu用
apt install mimedefang,RHEL/CentOS用dnf install mimedefang - 配置Postfix启用Milter,在
/etc/postfix/main.cf里添加:smtpd_milters = inet:localhost:12345 non_smtpd_milters = $smtpd_milters milter_default_action = accept - 编辑MIMEDefang的核心过滤脚本
/etc/mimedefang/mimedefang-filter,插入纯文本转HTML的逻辑:# 只处理纯文本且无HTML部分的邮件 if (get_message_type() eq 'text/plain' && !has_mime_part('text/html')) { my $txt_content = get_body_part(0); # 把纯文本用简单HTML模板包裹,用<pre>保留原格式,也可借助HTML::FromText模块自动转换行 my $html_content = "<!DOCTYPE html><html><body><pre>$txt_content</pre></body></html>"; # 生成多部分邮件(同时保留纯文本+HTML,兼容所有邮件客户端) replace_body_multipart('text/plain', $txt_content, 'text/html', $html_content); } - 重启MIMEDefang和Postfix服务:
systemctl restart mimedefang postfix,测试发送纯文本邮件就能看到效果了。
方案二:Postfix管道转发+轻量转换工具
如果不想碰Perl脚本,这个轻量方案更适合你,用管道把旧系统的邮件转成HTML再发出去:
- 先安装转换工具,比如
txt2html(通用纯文本转HTML)或者pandoc(更强大,支持多种格式转换),以txt2html为例:apt install txt2html - 在
/etc/postfix/master.cf里添加一个新的管道服务:txt2html unix - n n - - pipe flags=F user=nobody argv=/usr/bin/txt2html --no-inline-images --body-only | /usr/sbin/sendmail -oi -f ${sender} ${recipient} - 配置Postfix只把旧系统的邮件导向这个管道,编辑
/etc/postfix/main.cf:transport_maps = hash:/etc/postfix/transport - 编辑
/etc/postfix/transport,指定旧系统的标识(比如发件人地址或客户端IP):# 按发件人地址匹配 old-system@your-domain.com txt2html: # 或者按客户端IP匹配 [192.168.1.100] txt2html: - 执行
postmap /etc/postfix/transport生成哈希表,重启Postfix即可。
方案三:极简配置——用Postfix body_checks做文本包裹
如果你的旧系统邮件格式非常简单(没有复杂换行、特殊字符),可以用Postfix自带的body_checks直接做文本替换,不需要额外安装工具:
- 在
/etc/postfix/main.cf里启用body_checks:body_checks = regexp:/etc/postfix/body_checks - 编辑
/etc/postfix/body_checks,添加正则替换规则:/^/ PREPEND <!DOCTYPE html><html><body><pre> /$/ APPEND </pre></body></html> - 重启Postfix,这个规则会把所有纯文本邮件的内容包裹在HTML的
<pre>标签里,保留原格式。
补充说明
如果你之前用Go写Milter没成功,大概率是没处理好多部分邮件的结构或者Milter的生命周期回调逻辑——不过上面这几个方案都是经过大量生产环境验证的,比自己造轮子省心太多。优先推荐MIMEDefang,因为它能处理各种边缘情况(比如带附件的纯文本邮件),以后要加其他邮件处理逻辑(比如加签名、过滤垃圾邮件)也很方便。
备注:内容来源于stack exchange,提问作者Pa0x43
相关产品推荐
相关产品推荐

