2017-05-19 20 views
1

我试图发送HTML邮件带有附件,但不工作,仅仅是发送文件如何发送HTML电子邮件附件和sendmail软件UNIX的ksh

下面的代码,是用HTML:

message="all the HTML message" 
(
    echo "From: [email protected]"; 
    echo "To: [email protected]"; 
    echo "Subject: Testing HTML with attachment"; 
    echo "Content-Type: text/html"; 
    echo "MIME-Version: 1.0"; 
    echo ""; 
    echo "${message}"; 
) | /usr/sbin/sendmail -t 

,但我尝试添加这样的附件:

message="all the HTML message" 
(
    echo "From: [email protected]"; 
    echo "To: [email protected]"; 
    echo "Subject: Testing HTML with attachment"; 
    echo "Content-Type: text/html"; 
    echo "MIME-Version: 1.0"; 
    echo "Content-Transfer-Encoding: base64" 
    echo "Content-Type: application/octet-stream; name=test_file.txt" 
    echo "Content-Disposition: attachment; filename=/directory/myfile" 
    echo ""; 
    echo "${message}"; 
) | /usr/sbin/sendmail -t 

不工作,只发送附件而不需任何可读的东西...任何想法?

回答

0
echo "Content-Transfer-Encoding: base64" 
... 
echo "${message}"; 

邮件传统上受限于ASCII数据和998个字符的线的长度。这意味着需要对二进制数据进行编码以遵守这些限制,并且需要指定编码类型。指定编码通过Content-Transfer-Encoding标题完成,该标题正确设置为base64。问题在于,您不会将数据编码为base64,而只是插入原始数据。在这种情况下,大多数邮件客户端会忽略任何不属于base64的字符(即A-Za-z0-9/+以外的所有字符)作为垃圾。其余的将被视为base64编码并进行相应解码,导致您看到的垃圾数据。

因此,您不应该直接包含${message},而是首先对邮件进行编码。这可以使用base64 tool(如果可用)或使用uuencode --base64来完成。但使用uuencode,你绝对需要删除前缀和后缀行,并只保留编码数据。

除此之外,您应该也可以对HTML消息执行此操作,除非消息已经处于仅限ASCII字符的限制范围内,并且行长度限制为998个字符。在大多数情况下,它可能无需编码工作,但可能会因某些收件人而失败,具体取决于涉及的邮件服务器和邮件客户端的功能。