我正在使用 Amazon Linux 并创建一个 bash 脚本。我正在尝试通过电子邮件发送附件并且已成功
(cat $TFILE1; uuencode $output_file $output_file) | mailx -s "$subject" "$to_email"
然而,我遇到的问题是附件显示(至少在 Gmail 中)名称为“noname”。有没有办法让附件以与“$output_file”变量相同的名称显示?
答案1
我注意到mail
/mailx
有附件问题。尝试使用mutt
它,它可以很好地处理附件并且应该保持文件名完整。
mutt -a "$attachment_file" -s "$subject" -- "$to_email" < "$TFILE1"
其中"$TFILE1"
是邮件消息的正文。/dev/null
如果您只想发送附件,请将其替换为。
答案2
mpack
将附件名称设置为等于输入文件名。因此,例如(-a
用于附件而不是内联;-s
设置主题;-c
设置 MIME 类型;1.png
是要附加的文件;anthony@localhost
是要发送到的电子邮件地址):
mpack -a -s 'test mpack' -c image/png 1.png anthony@localhost
1.png
向我发送一封附有文件名的电子邮件:
Content-Type: image/png; name="1.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="1.png"
Content-MD5: EGqHjkvvXXcaO+41lBN2uA==
因此,您只需正确命名文件,然后使用mpack
.
如果您想完全控制消息,另一个选择是mime-construct
。
答案3
uuencode
是 20 世纪 90 年代初的残余,如果可能的话,应该避免使用适当的 MIME 工具。
不幸的是,仍然没有事实上的用于发送 MIME 消息的标准简单 Unix 命令行实用程序,虽然mutt
很接近(但它仍然主要是一个交互式程序,因此如果您需要的只是从脚本向 MTA 提交消息,那么它会包含相当多的膨胀)。
使用现代脚本语言,只需几行代码即可发送包含内嵌文本正文部分和二进制附件的多部分消息的工具。在裸shell脚本中,代码有点庞大;但真正的挑战往往是对 MIME 有足够的了解,以便能够正确地完成任务。简而言之,您需要了解 MIME 消息的整体结构以及如何对要使用的正文部分类型进行编码。
( printf 'From: %s\nTo: %s\nSubject: %s\n' "$sender" "$recipient" "$subject"
printf 'Mime-Version: 1.0\nContent-type: multipart/mixed; boundary="foooobar"\n'
printf '\n--foooobar\n\n'
cat "$TFILE1"
printf '\n--foooobar\nContent-type: application/octet-stream; name="%s"\n' "${output_file##*/}"
printf 'Content-transfer-encoding: base64\n\n'
base64 "$output_file"
printf '\n--foooobar--\n' ) |
sendmail -t
这应该适用于基本的 7 位 US-ASCII 文本;如果您需要 8 位文本,特别是在标头中,则有许多额外的变化(用于人类可读文本的 RFC 2047,用于文件名等的 RFC 2231),此时您确实需要切换到语言封装了这些细节,因此您不必理解它们或担心它们。
除了对实际提交的依赖之外base64
,这是纯粹的内置函数和非常基本的 shell 实用程序。sendmail
参数扩展${output_file##*/}
应该与最近的 shell 一起使用,以删除最后一个斜杠中的所有内容,但如果您使用的是非常旧的 shell,则可能需要使用它basename
。