使用带有uuencode的“sendmail”发送邮件,并附带主题

时间:2011-11-09 09:47:27

标签: linux sendmail uuencode

我正在尝试使用sendmail发送带附件的邮件。问题是我无法发送主题行。

以下命令行会触发两封邮件而不是一封 - 一封带有“Subject : Report”,另一封带有附件:

/usr/bin/gmime-uuencode "/tmp/url_by_ip.txt" "Report.txt" | echo "Subject: Report" | /usr/sbin/sendmail <sender> <receiver>

4 个答案:

答案 0 :(得分:9)

如果你可以使用其他命令,我建议mutt可以很容易地处理附件:

mutt -a file_to_attach -s "your subject" recipient@test.com < /tmp/mail_content

如果您遇到/usr/sbin/sendmail,那么您还有很多工作要做。 sendmail没有附件概念,并将电子邮件内容视为单独的US-ASCII文本(有关详细信息,请参阅this answer)。

要使用sendmail发送附件,您需要将邮件内容格式化为MIME邮件。有关示例,请参阅this forum thread on unix.com


为了让您顺利进行,这是使用bash的快速未经测试示例。为简洁起见,我对变量进行了硬编码,但您可以很容易地将示例转换为将相关变量作为参数的脚本/函数。

#!/bin/bash
# --- user params ---
MAILFROM="peter.gibbons@initech.com"
MAILTO="bill.lumbergh@initech.com"
SUBJECT="TPS Report"
BODY_FILE="/home/peter/coversheey.txt"  # file holding mail body
ATT_FILE="/tnp/url_by_ip.txt"   # file to attach
ATT_AS_FILE="Report.txt"   # name to attach as

# --- generated values ---
BOUNDARY="unique-boundary-$RANDOM"
BODY_MIMETYPE=$(file -ib $BODY_FILE | cut -d";" -f1)   # detect mime type
ATT_MIMETYPE=$(file -ib $ATT_FILE | cut -d";" -f1)     # detect mime type
ATT_ENCODED=$(base64 < $ATT_FILE)  # encode attachment

# --- generate MIME message and pipe to sendmail ---
cat <<EOF | /usr/sbin/sendmail $MAILTO
MIME-Version: 1.0
From: $MAILFROM
To: $MAILTO
Subject: $SUBJECT
Content-Type: multipart/mixed; boundary="$BOUNDARY"

--$BOUNDARY
Content-Type: $BODY_MIMETYPE
Content-Disposition: inline

$(cat $BODY_FILE)
--$BOUNDARY
Content-Type: $ATT_MIMETYPE; name="$ATT_AS_FILE"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$ATT_AS_FILE"

$ATT_ENCODED
--$BOUNDARY
EOF

当然,如果您乐意使用更高级别的脚本语言(Python,Ruby,Perl,......),那么现有的模块将会为您带来繁重的工作。

P.S。还有mpack实用程序为您进行MIME转换,但AFAIK默认情况下不会出现在大多数* nix框中。

答案 1 :(得分:2)

使用您的邮件标题创建一个文件,例如mail.txt:

Subject: here is the subject

这里是发送电子邮件的脚本:

#!/bin/bash
cat mail.txt > mail_to_send
cat attachment | uuencode attachment >> mail_to_send
sendmail recipient@example.com < mail_to_send
rm mail_to_send

答案 2 :(得分:0)

试试这个:

mail -s 'Report' myemail@yahoo.com < tmp/url_by_ip.txt

答案 3 :(得分:0)

也许您想要一些实用程序发送MIME邮件?有vmime C++ library,许多脚本语言(Python,Ruby,Perl,Ocaml,...)都有MIME包。还有shell脚本可使用的命令,例如mpack以及许多其他人。