如何在 mutt 命令行中指定附件编码?

如何在 mutt 命令行中指定附件编码?

我正在尝试从 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 时,必须指定两个级别的字符集:

  1. 用于编写电子邮件的文本编辑器必须将其保存为所需的编码。
  2. 然后,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>

相关内容