将 sendmail 用于 HTML 正文和二进制附件

Posted

技术标签:

【中文标题】将 sendmail 用于 HTML 正文和二进制附件【英文标题】:Using sendmail for HTML body and binary attachment 【发布时间】:2012-06-23 11:49:39 【问题描述】:

目标:发送带有 html 正文和二进制附件的邮件(使用 sendmail)。

遵循以下链接中指定的准则

http://www.unix.com/shell-programming-scripting/159522-sendmail-html-body-attachment-2.html

http://www.unix.com/shell-programming-scripting/58448-sendmail-attachment.html

它的工作范围是,无论是 HTML 正文还是带有 uuencode 的二进制附件,但不是两者兼而有之。

下面给出的是发送邮件的 shell 脚本的 sn-p。有了这个,HTML 正文就可以了,但是附件被错误地编码/解码并且无法查看。

请指教。

#!/usr/bin/ksh

export MAILFROM="noreply@site.dom"
export MAILTO="somebody@somesite.com"
export SUBJECT="Test PDF for Email"
export BODY="email_body.htm"
export ATTACH="file.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"-$MAILPART\""
 echo "---$MAILPART"
 echo "Content-Type: text/html"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "---$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: base64"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 uuencode -m $ATTACH $(basename $ATTACH)
 echo "---$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

我正在使用 HP-UX ia64。 翻遍了论坛和网络,发现主要是对 php、Python 等的引用。

【问题讨论】:

使用mutt -a 更容易:mutt.org/doc/man_page.html 谢谢,但当前的服务器设置限制我只能发送邮件:-(。另外,服务器上没有安装/设置 mutt 使用 sendmail 发送带有纯文本附件的 HTML 正文电子邮件:***.com/questions/17359/… 【参考方案1】:

将电子邮件中的内容传输编码类型从 base64 更改为 uuencode 解决了该问题。 感谢您迄今为止的投入。

下面给出的是修改后的脚本。

#!/usr/bin/ksh

export MAILFROM="noreply@domain.com"
export MAILTO="mail.to@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="email_body.htm"
export ATTACH="file.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`uuidgen` ## Generates Unique ID

(
 echo "From: $MAILFROM"
 echo "To: $MAILTO"
 echo "Subject: $SUBJECT"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
 echo ""
 echo "--$MAILPART"
 echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
 echo ""
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/plain; charset=ISO-8859-1"
 echo "You need to enable HTML option for email"
 echo "--$MAILPART_BODY"
 echo "Content-Type: text/html; charset=ISO-8859-1"
 echo "Content-Disposition: inline"
 cat $BODY
 echo "--$MAILPART_BODY--"

 echo "--$MAILPART"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
 echo "Content-Transfer-Encoding: uuencode"
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
 echo ""
 #uuencode -m $ATTACH $(basename $ATTACH)
 uuencode $ATTACH $(basename $ATTACH)
 echo "--$MAILPART--"
) > email_`date '+%Y%m%d_%H%M%S'`.out
| /usr/sbin/sendmail $MAILTO

【讨论】:

我们如何处理多个附件? @divinedragon,你重复echo "--$MAILPART"echo "--$MAILPART--"之前的代码。这就是添加一个附件的原因。【参考方案2】:

尝试在uuencode之后添加一个新行

也可以不使用-m

【讨论】:

uuencode -m 自动在末尾添加新行。我已经尝试过 -m 并且它也不起作用。我再次尝试了您的建议和同样的问题(附件来了,但无效)。

以上是关于将 sendmail 用于 HTML 正文和二进制附件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 perl 和 sendmail 从 URL 发送 pdf [Mail::Sendmail]

sendmail 不适用于 chrooted php-fpm 和 nginx

Sendmail 不适用于 crontab (bash)

WindowsGUI自动化测试框架搭建-邮件服务模块封装(sendmail)

用于提取 HTML 正文内容的正则表达式

如何使用Email :: Mime与sendmail