【问题标题】:Send a mail using 'sendmail' with uuencode, and having a subject alongwith使用带有 uuencode 的“sendmail”发送邮件,并带有主题
【发布时间】:2011-12-25 04:08:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux sendmail uuencode


    【解决方案1】:

    如果你可以使用其他命令,我建议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...),那么现有的模块已经可以为您完成繁重的工作。

    附言还有 mpack 实用程序可以为您进行 MIME 转换,但 AFAIK 在大多数 *nix 机器上默认情况下不会出现。

    【讨论】:

    • ubuntu 10.04 上的 Mutt 1.5.20 只有在我像这样重新排列命令行参数时才有效:mutt -s "your subject" -a file_to_attach -- recipient@test.com &lt; /tmp/mail_content
    • 基本脚本对我来说工作得很好,并且通过使用函数的一些模块化,它甚至很优雅。我建议在你的脚本中使用它而不是安装 mutt。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      试试这个:

      mail -s 'Report' myemail@yahoo.com &lt; tmp/url_by_ip.txt

      【讨论】:

      • 必须使用 sendmail 而不是 mail。
      • 为什么?我认为他们两个没有太多的区别。 CMIIW。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2016-05-11
        • 2011-10-07
        • 2013-03-12
        • 2010-11-08
        • 2015-04-29
        • 2015-08-03
        • 2020-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多