我正在尝试从 Perl 脚本发送一封带有附件的电子邮件。
首先,我创建附件(一个 xml 文件):
open(XMLFILE, ">:utf8", $xmlfile);
print XMLFILE "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
print XMLFILE "<data>\n";
#print XMLFILE "...\n";
print XMLFILE "</data>\n";
close (XMLFILE);
我也尝试open(XMLFILE, ">", $xmlfile);
过binmode XMLFILE, ":utf8";
。
然后我像这样发送电子邮件:
open(MUTT, "|/usr/bin/mutt -s \"TestSubject\" -a $xmlfile \"test\@example.com\"");
binmode MUTT, ":utf8";
print MUTT ("TestBody");
close (MUTT);
尽管如此,正文部分和附件都有Content-Type: text/plain; charset=iso-8859-1
。
我也尝试过open(MUTT, "|/usr/bin/mutt -e \"set file_charset=utf-8\" -a $xmlfile ...
,但这给了我一个Error in command line: file_charset: unknown variable
.
我究竟做错了什么?
答案1
像往常一样,优秀的 Arch wiki 给出了答案(https://wiki.archlinux.org/index.php/Mutt)。逐字引用:
电子邮件字符编码
使用 Mutt 时,必须指定两个级别的字符集:
- 用于编写电子邮件的文本编辑器必须将其保存为所需的编码。
- 然后,Mutt 将检查电子邮件并根据您在 send_charset 变量中指定的优先级确定哪种编码更合适。默认值:“us-ascii:iso-8859-1:utf-8”。
因此,如果您编写的电子邮件包含 ISO-8859-1 中允许的字符(例如“简历”),但没有 Unicode 特有的字符,则 Mutt 会将编码设置为 ISO-8859-1。
为了避免这种行为,请在 muttrc 中设置变量:
set send_charset="us-ascii:utf-8"
甚至
set send_charset="utf-8"
将使用从左侧开始的第一个兼容字符集。由于 UTF-8 是 US-ASCII 的超集,因此将其保留在 UTF-8 前面并没有什么害处,它可以确保旧的 MUA 在看到电子邮件标头中的字符集时不会感到困惑。
您可以从命令行而不是通过在 muttrc 中添加前缀来执行此操作
-e 'set send_charset="utf-8"'
到命令标志。
答案2
像这样的事情怎么样:
$ mutt -e "set content_type=text/html" Email address -s "subject" < test.html
将其更改为您想要的 content_type。在 Perl 中是这样的:
open(MUTT, "|/usr/bin/mutt -e \"set content_type=text/xml\" -s \"TestSubject\" -a $xmlfile \"test\@example.com\"");
如果您不想使用,mutt
可以使用mail
:
### method #1
$ mail -a 'MIME-Version: 1.0' -a 'Content-Type: text/xml; charset=iso-8859-1' -a 'X-AUTOR: Some Guy' -s 'MTA STATUS: mail queue' <to user> -- -f <from user> < /tmp/eximrep.xml
### method #2
$ mail -a 'Content-type: text/xml; charset="us-ascii"' <to user> < /tmp/file.xml
您也可以直接使用 sendmail 来执行此操作:
(
echo "From: [email protected]"
echo "To: [email protected]"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed;"
echo ' boundary="BOUNDARY"'
echo "Subject: Test Message"
echo ""
echo "This is a MIME-encapsulated message"
echo "--BOUNDARY"
echo "Content-Type: text/plain"
echo ""
echo "This is what someone would see without an HTML capable mail client."
echo ""
echo "--BOUNDARY"
echo "Content-Type: text/html"
echo ""
echo "<html>
<body bgcolor='black'>
<blockquote><font color='green'>GREEN</font> <font color='white'>WHITE</font> <font color='red'>RED</font></blockquote>
</body>
</html>"
echo "--BOUNDARY--"
) | sendmail -t
参考
答案3
我无法更新 mutt 版本,但我找到了一个解决方法 - 其他人可能会发现这也很有帮助。
包含带有特殊字符的注释可以让 perl 和 mutt 选择正确的 (utf-8) 编码(可能“ł”就足够了,但是使用变音字符可以使意图变得更清晰):
在 xml 中,它是这样的:
<?xml ... ?>
<?comment <!-- ł€èÄöÜß --> ?>
<content>
...
</content>