如何在 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
.我究竟做錯了什麼?
像往常一樣,優秀的 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"'
到命令標誌。
像這樣的東西怎麼樣:
$ 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
,可以使用### 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: myuser@example.com" echo "To: user@example.net" 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
參考