如何在Linux上使用邮件命令附加文件?

61

我在运行Linux shell的服务器上。我需要将一个简单的文件发送给收件人。如何做到这一点,最好只使用mail命令?

更新:找到了一个好的解决方案,使用mutt代替:

$ echo | mutt -a syslogs.tar.gz admin@domain.org

这个重复问题包含了我的一个回答,试图梳理和澄清mail/mailx的几个不兼容版本,希望能够对这里和其他地方的多个冲突答案做出一些解释。 - tripleee
13个回答

52

2
uuencode是一个“默认”的GNU工具吗?我的电脑似乎没有它。 - Seiti
1
这篇参考文章真的很有用!谢谢! - Seiti
4
@Seiti说,uuencode是sharutils中的一部分,它是GNU软件。Ubuntu软件包也叫做sharutils。http://www.gnu.org/software/sharutils/ - Janus Troelsen
3
仅适用于允许 UUEncoded 附件的收件人。 - Stefan Schmidt
1
这是一个针对生态系统仍停留在上世纪90年代的良好解决方案,但在现代世界中,首选解决方案是切换到MIME。使用mutt的解决方案可以很好地实现这一点,并且具有合理的可移植性。 - tripleee
显示剩余3条评论

23

mail在我尝试过的所有现代Linux版本中都可以完成。无需其他软件:

matiu@matiu-laptop:~$ mail -a doc.jpg someone@somewhere.com
Subject: testing

This is a test
EOT

当您输入完毕时,请使用ctrl+d。


3
不太准确。有一些版本的mail支持此功能,但它们肯定不是“普通的mail”,而是某种现代化的版本或变体。如果您能指明您正在使用哪个平台上的哪个版本,将会更有帮助。 - tripleee
1
这是在Ubuntu 14.04上使用Heirloom mailx版本12.5 6/20/10。从记忆中得知,它也适用于CentOS 6、Ubuntu 12.04和CentOS 7。 - matiu
2
为了使其不需要用户交互:echo This is a test | mail -a doc.jpg -s "testing" someone@somewhere.com - matiu
曾经使用过 RHEL6.8 邮件版本:12.4 7/29/08。 - SidJ
1
The mailutils版本的mail使用“-A”来添加附件(Ubuntu 16.04 Xenial Server上的GNU Mailutils 2.99.99)。 - Peter
显示剩余2条评论

22
$ echo | mutt -a syslogs.tar.gz admin@domain.org

但它使用mutt,而不是mail(或mailx)。


12
对我来说并不完全有效。参数顺序不同。有效的方法是:echo | mutt admin@domain.org -a syslogs.tar.gz。我使用的是1.5.20版本的mutt。 - Marcus
发送Unix日志到邮件服务器对我来说是有效的。谢谢。 - Hongtao

13

mailx也可能会有所帮助。来自mailx的man页面:

-a file
     Attach the given file to the message.

相当容易,对吧?


11
请注意,这与 Ubuntu 中的 mailx 不同。在那个版本中,“-a”表示“在命令行上指定其他标头字段,例如“ X-Loop: foo@bar”等。如果字符串包含空格,则必须使用引号。此参数可以多次指定,然后标头将被串联起来。” - Janus Troelsen
5
我的mailx不支持-a选项(在CentOS上的mailx-8.1.1-44.2.2软件包中)。 - einpoklum
2
我的也不支持 -a(OS X 10.7.5) - Stefan Schmidt

12

除了邮件之外,我的答案还需要base64,但是一些uuencode版本也可以使用-m进行base64编码,或者您可以忽略mime并使用普通的uuencode输出...

   FROM=me@mydomain.com
   TO=someone@mydomain.com
   SUBJECT="Auto emailed"
   MIME="application/x-gzip"  # Adjust this to the proper mime-type of file
   FILE=somefile.tar.gz
   ENCODING=base64  
   boundary="---my-unlikely-text-for-mime-boundary---$$--" 

   (cat <<EOF
    From: $FROM
    To: $REPORT_DEST
    Subject: $SUBJECT
    Date: $(date +"%a, %b %e %Y %T %z")
    Mime-Version: 1.0
    Content-Type: multipart/mixed; boundary="$boundary"
    Content-Disposition: inline

    --$boundary
    Content-Type: text/plain; charset=us-ascii
    Content-Disposition: inline

    This email has attached the file

    --$boundary
    Content-Type: $MIME;name="$FILE"
    Content-Disposition: attachment;filename="$FILE"
    Content-Transfer-Encoding: $ENCODING

    EOF
    base64 $FILE
    echo ""
    echo "--$boundary" ) | mail

由于某种原因,使用mutt时,加密附件在编码时会增长400-500%,这基本上将我的附件限制在约2MB。因此,我不得不使用此方法从头开始构建带有base64编码附件的电子邮件,除非您想将其导向sendmail -t - Kyle MacFarlane
好答案 - 我喜欢猫追加部分。 - bgs
如果您没有访问适当的MIME工具,这很好,但手动拼凑MIME结构会很快变得疲劳。如果您需要不止一次使用,您可能希望找到一个为您封装这些步骤的工具。 - tripleee
1
这是在假设你的 mail 不会因为 MIME 输入而出错的情况下,但如果出现问题,你可以在管道末尾切换到 | sendmail -oi -t。此时,你不再需要 mail 包装器提供的任何功能。 - tripleee
2
最后一行应该在右括号之前有echo "--$boundary--",末尾有两个破折号来标记这是最终的、结束的边界。 - tripleee
Content-Disposition: inline 是符合RFC标准的,但显然对Yahoo有问题(但是什么不是呢);它完全是可选的,如果考虑到这一点,也许可以将其删除。另请参见https://stackoverflow.com/questions/48436217/mutt-on-linux-has-empty-text-attachments-that-appear-in-yahoo-mail - tripleee

7
mailx -a /path/to/file email@address

您可以进入交互模式(它会提示您输入“主题:”然后是一行空白),输入主题,然后输入正文并按下Ctrl+D(EOT)完成。


1
在Mac 10.7上执行此操作时会出现错误。mailx: illegal option -- a - isomorphismes
这是因为OSX没有像Linux一样的许多现代更新的命令行实用程序。使用Homebrew或MacPorts安装Coreutils。 - f0ster
@f0ster mailx 不是 GNU coreutils 的一部分。你可能可以找到一个支持这种用法的 OSX 版本的 mailx,但如果没有提供链接,这并没有什么帮助。有多个版本,其中许多不支持这种用法。 - tripleee

4
mpack -a \
    -s"Hey: might this serve as your report?" \
    -m 0 -c application/x-tar-gz \
    survey_results.tar.gz \
    hesco@example.net
mpackmunpackmetamail一起配合使用,扩展了mailx的功能,在处理现代电子邮件中充斥着HTML标记和附件时非常有用。
这四个软件包共同使用将使您能够处理任何GUI邮件客户端中可以处理的电子邮件。

这对我有用,其他方法在Ubuntu 12.04上似乎都不起作用。 - Shanmu
不幸的是,包含这些实用程序的metamail软件包已经被放弃,现在很难找到。您最好使用现代的MIME客户端;这些旧的实用程序是在MIME出现时提供的基线演示,但它们从来没有非常灵活或易于使用。 - tripleee

2
使用ubuntu 10.4,以下是mutt解决方案的写法: echo | mutt -a myfile.zip -- admin@domain.org

1
从Homebrew安装mutt同样适用。 - Stefan Schmidt

1
以下是一个在Unix/Linux安装中可行的解决方案,不依赖于任何不寻常的程序功能。它支持多行消息正文、多个附件以及mailx的所有其他典型特性。
不幸的是,它不能放在一行上。
#!/bin/ksh

# Get the date stamp for temporary files
DT_STAMP=`date +'%C%y%m%d%H%M%S'`

# Create a multi-line body
echo "here you put the message body
which can be split across multiple lines!
woohoo!
" > body-${DT_STAMP}.mail

# Add several attachments
uuencode File1.pdf File1.pdf >  attachments-${DT_STAMP}.mail
uuencode File2.pdf File2.pdf >> attachments-${DT_STAMP}.mail

# Put everything together and send it off!
cat body-${DT_STAMP}.mail attachments-${DT_STAMP}.mail > out-${DT_STAMP}.mail
mailx -s "here you put the message subject" nobody@test-address.com < out-${DT_STAMP}.mail

# Clean up temporary files
rm body-${DT_STAMP}.mail
rm attachments-${DT_STAMP}.mail
rm out-${DT_STAMP}.mail

相关链接:https://dev59.com/r2sy5IYBdhLWcg3wyxCi#8315149 - JonathanDavidArndt

1

这里有很多回答使用mutt或mailx,或者说邮件不支持“-a”。

首先,在Ubuntu 14.0.4中,mailutils的邮件支持此功能:

mail -A 文件名 -s "主题" 邮件地址

其次,我发现通过使用“man mail”命令并搜索“attach”关键词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接