Shell脚本发送含text/plain与text/html的多部分邮件仅显示HTML部分求助
问题原因分析
- 客户端默认渲染规则:
multipart/alternative类型的MIME内容默认按「优先级从低到高」排列各个部分,标准要求优先展示最后出现的格式(也就是你代码里的HTML部分),只有当客户端不支持HTML、或用户手动设置优先展示纯文本时才会显示纯文本内容,这是邮件协议的标准行为,并非纯文本部分发送失败。你删除HTML部分后客户端没有可选的更高优先级格式,自然就展示纯文本,也印证了这一点。 - MIME头格式不规范:你代码中
text/plain、text/html的Content-Type行末尾带有多余分号,且未指定字符集,同时额外加了非必要的Content-ID字段,部分严格的MIME解析器会识别异常,导致跳过纯文本部分的解析。 - 内容格式混淆:纯文本部分的
**TEXT email**是Markdown语法,在纯文本上下文不会被渲染,你看到的会是带星号的原始内容,容易误以为是内容解析错误。
解决方案
- 修正
multipart/alternative部分的MIME头,删除多余的Content-ID、补充字符集、去掉末尾多余分号,修改后的对应部分代码如下:
--AlternativeBoundaryString Content-Type: text/plain; charset=utf-8 TEXT email --AlternativeBoundaryString Content-Type: text/html; charset=utf-8 <html> <head> </head> <body> <h1>Result</h1> <p>HTML email</p> <p><img border=0 width=1024 height=503 style='width:10.6666in;height:5.2416in' id=id.obrazek1 src="cid:id.obrazek1" alt="Opis: cid:id.obrazek1"></p> </body> </html> --AlternativeBoundaryString--
- 验证纯文本是否发送成功:不要直接看客户端默认展示内容,打开收件箱的「查看原始邮件」「查看邮件源码」功能,搜索纯文本内容,只要能在源码中检索到就说明发送正常。
- 可选优化:你的内嵌图片是png格式,当前ContentType写的是
image/jpeg,建议修改为Content-Type: image/png;避免部分客户端解析图片异常。
内容的提问来源于stack exchange,提问作者popiomar
相关产品推荐
相关产品推荐

