【问题标题】:linux mail < file.log has Content-Type: application/octet-stream (a noname attachment in Gmail)linux mail < file.log 有 Content-Type: application/octet-stream (Gmail 中的无名附件)
【发布时间】:2012-05-07 18:10:48
【问题描述】:

我一直在用

 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

但现在文件更长了,我收到了无名附件,因为这样:

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?

【问题讨论】:

    标签: linux email mailx


    【解决方案1】:

    手册页是一个很好的起点!继续阅读,直到您到达 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
      

    【讨论】:

    • tr -cd '\11\12\15\40-\176'
    • 我注意到关于 mime 类型的评论。感谢您的解决方法,其中任何一个都可以很好地工作
    • 谢谢。使用 mutt 是更简单的解决方案。
    • 您也可以尝试使用 bsd-mailx,它不会切换 mime 类型。在 Debian 打包系统中,选择 hierloom-mailx 而不是 bsd-mailx 来满足虚拟 mailx 包是非常随意的,并且有一些建议将来可能会偏重于 bsd-mailx,因为 hierloom-mailx 包被认为更少免费。
    【解决方案2】:

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

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

    更多详情discussion of cat with mailx。

    【讨论】:

    • cat 的 -v 选项真的很有帮助,因为我可以理解为什么我无法将邮件正文作为附件接收。谢谢。
    【解决方案3】:

    在更改为 Ubuntu Precise 12.04 后,我无法运行自动电子邮件脚本。我不知道,当 Ubuntu(或 Debian)将 bsd-mailx 与 heirloom-mailx 交换时,这两个“邮件”命令的行为非常不同。 (例如 heirloom 将 -a 用于附件,而它用于 bsd 中的附加标题。) 在我的例子中,heirloom-mailx 无法可靠地确定 Mime 类型并继续将文本作为附件发送。怪我没有清除控制字符或其他任何东西,但我认为更改在升级之前完美完成工作的脚本没有多大意义。 因此,如果您更喜欢自己设置 Mimetype,bsd-mailx 是一个更好的解决方案。

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

    帮我解决了。

    【讨论】:

    • +1 用于提及heirloom。在没有man 的Linux 系统上,我很难找出使用了哪个mailx,因为mailx -V 只是打印了版本,而不是它的名称或类型。
    【解决方案4】:

    在基于 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/mail 当前指向的信息:

    sudo alternatives --display mail
    

    检查各种已安装的 mailx 包:

    sudo rpm -qa *mailx
    

    【讨论】:

      【解决方案5】:

      在我的例子中,脚本是从未定义 LC_* 的 cron 调用的,并且重音符号被解释为“控制字符”。我刚刚在 crontab 文件的开头插入了以下几行:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-11
        • 2012-06-25
        • 2013-12-28
        • 2011-04-22
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多