linux mail <file.log具有Content-Type:application / octet-stream(Gmail中的非匿名附件)

我一直在使用

mail -s "here is a log file" "person@example.com" < log/logfile.log 

过去通过标题:

 User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 

但是现在的文件更长,我得到noname附件,因为有了这个:

 User-Agent: Heirloom mailx 12.4 7/29/08 MIME-Version: 1.0 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 

所以,如果一切都失败了,请检查手动man mail

 NAME mailx - send and receive Internet mail SYNOPSIS mailx [-BDdEFintv~] [-s subject] [-a attachment ] [-c cc-addr] [-b bcc-addr] [-r from-addr] [-h hops] [-A account] [-S variable[=value]] to-addr . . . 

这些选项都没有看起来有用,所以如何强制Content-Type: text/plain

手册页是一个很好的开始! 继续阅读,直到找到MIME TYPES部分,并密切注意以下几点:

否则,或者如果文件名没有扩展名,则使用text / plain或application / octet-stream的内容类型,第一个用于文本或国际文本文件,第二个用于包含除换行符和水平之外的其他格式字符的文件制表符。

所以,如果你的消息中包含除了换行符和制表符之外的“格式化字符”(通常意味着控制字符),它将自动被分类为application/octet-stream 。 我敢打赌,如果你仔细观察数据,你会发现一些控制字符在四处漂浮。

你可以解决这个…

  • 将日志文件作为附件(使用-a )而不是主消息正文,并设置您的~/.mime.types文件以将*.log文件标识为文本/纯文本。
  • tr东西过滤出控制字符。
  • 使用另一个MUA(如mutt发送邮件。 事实上,你可以自己编写一个消息,并直接发送到sendmail

     ( echo To: person@example.com echo From: you@example.com echo Subject: a logfile echo cat logfile.log ) | sendmail -t 

我最近得到了类似的问题,最后得到了一个更短的解决方案:

 cat -v log/logfile.log | mail -s "here is a log file" "person@example.com" 

有关mailx的讨论的更多细节。

在更改为Ubuntu Precise 12.04之后,我遇到了一些麻烦,让我的自动电子邮件脚本运行。 我不知道,当Ubuntu(或Debian)将bsd-mailx与heirloom-mailx交换时,但是这两个“mail”命令的行为却非常不同。 (例如,传家宝使用-a作为附件,而在bsd中使用附加标题。)在我的情况下,heirloom-mailx无法可靠地确定Mime类型并不断发送文本作为附件。 责怪我不去除控制字符或任何东西,但我没有看到太多改变脚本,完成升级之前完成他们的工作的重点。 所以如果你喜欢自己设置Mimetype,bsd-mailx是一个更好的解决方案。

 sudo apt-get install bsd-mailx sudo apt-get remove heirloom-mailx 

为我解决了。

在基于RedHat的系统(SL,CentOS,Fedora等)上,您将需要安装bsd-mailx,然后适当地设置/ etc / alternatives / mail:

 sudo yum -y install bsd-mailx sudo alternatives --set mail /usr/bin/bsd-mailx 

当然,你冒险打破依赖heirloom-mailx行为的应用程序,但不明确地调用“mailx”而不是“mail”。

要显示有关/ bin /邮件的信息,当前指向:

 sudo alternatives --display mail 

检查各种已安装的mailx软件包:

 sudo rpm -qa *mailx 

在我的情况下,脚本是从cron调用的,LC_ *没有定义,口音被解释为“控制字符”。 我刚刚在我的crontab文件的开头插入了以下几行:

 LC_NAME=fr_FR.UTF-8 LC_ALL=fr_FR.UTF-8