【问题标题】:Embedding an image in an email using linux commands使用 linux 命令在电子邮件中嵌入图像
【发布时间】:2013-01-01 02:37:50
【问题描述】:

有没有办法使用muttsendmail 等Linux 命令将图像嵌入电子邮件正文?

我用过这个

mutt -e 'set content_type="text/image"' \
   u.mohan@6dtech.co.in -s "TEST" \
    -i image001.jpg < data.txt

但它不起作用。

【问题讨论】:

    标签: linux email sendmail


    【解决方案1】:

    您可以附加图像,方法是将命令行中的 -i 更改为 -a。这不会嵌入图像本身,但会包含它。如果您想嵌入它,您发送的邮件必须是内容类型text/html 并包含img 标记以显示附加图像。

    请参阅此 SO 页面,了解如何在 HTML 邮件中正确嵌入图像附件。

    Embedding attached images in HTML emails

    【讨论】:

    • 实际上在 mutt on 选项中可以使用 -i 内联附加文件,但它不起作用
    • 听起来-i 仅适用于邮件正文的文本文件。
    • 我正在使用 -a 选项来附加,但我需要根据我的要求进行内联附加
    【解决方案2】:

    对于那些希望使用 bash 脚本将带有嵌入图像的电子邮件作为电子邮件的一部分发送的人,我将这段代码拼凑在一起。

    电子邮件以以下行开头:

    EMAILBODY="echo \"Alarm went off! "
    EMAILATTACH=""
    

    在定义要附加的每个文件的循环内部:

    EMAILATTACH=$EMAILATTACH" -a /home/xyz/"$ID"/"$Event"/"$Frame"-capture.jpg"
    EMAILBODY=$EMAILBODY"<BR> <IMG Height=150 SRC=\"$Frame-capture.jpg\">"
    

    在循环之后,电子邮件以这些行完成:

    EMAILBODY=$EMAILBODY"\" | mutt -e \"set content_type=text/html\" -s \"House Alarm went off!\""
    EMAILSTRING=$EMAILBODY$EMAILATTACH" -- user@server.net"
    eval $EMAILSTRING
    

    我的最后一个障碍是,当我在我的 android 手机上收到这个(可能在其他浏览器上也一样)时,它不显示图片,只显示一个小框(即使你已经下载了附件)。但它在 Outlook 中显示良好。

    【讨论】:

    • 这不起作用,因为它错过了要链接到 html 电子邮件的附件的 Content-ID。
    【解决方案3】:

    甚至可以使用基本的邮件命令

    您想创建一个 mime HTML 电子邮件:

    How to embed images in email

    然后获取标题(第一个边界之前的所有行),从该输入中删除它们并在邮件之后使用 -a 命令单独添加它们,例如:

    https://stackoverflow.com/a/12262421/2244213 要么 Sending HTML mail using a shell script

    【讨论】:

    • 没有一个通用的mail comcand 具有此功能。如果你有;对你有益;但是为了对他人有用,这个答案应该描述你在哪个平台上。
    【解决方案4】:
    EMAILBODY="echo \"Alarm went off! "
    EMAILATTACH=""
    EMAILATTACH=$EMAILATTACH" -a "/home/uat12mgr/XXDBD_AR_INV_PRINT.jpg""
    EMAILBODY=$EMAILBODY"<BR> <IMG Height=150 SRC=\""/home/uat12mgr/XXDBD_AR_INV_PRINT.jpg"\">"
    EMAILBODY=$EMAILBODY"\" | mutt -e \"set content_type=text/html\" -s \"House Alarm went off!\""
    EMAILSTRING=$EMAILBODY$EMAILATTACH" -- myaka@abc.com"
    eval $EMAILSTRING
    

    【讨论】:

    • 这对我不起作用。命令行错误:content_type:未知变量
    • 它是 1.5.2 版的 IIRC,它被添加到 mutt
    【解决方案5】:

    我编写了一个 shell 脚本,用 mutt 发送带有嵌入图像而不是链接图像的 HTML 消息。

    几个步骤:

    1. 下载原HTML中&lt;img&gt;标签链接的所有图片文件,
    2. 通过将src url 更改为cid 来准备HTML 文件,
    3. 准备一封带有(neo)mutt的多部分电子邮件
    4. 修复此电子邮件中的一些内容描述标签
    5. 发送sendmail

    这是以 HTML 文件名作为参数的主脚本(未执行检查,请不要将其视为 alpha 软件):

    #!/bin/bash
    F=$(basename "$1")
    DIR="/tmp/inlinizer-$$/"
    mkdir -p $DIR/Img
    grep "src=" "$1" | sed -e "s,.*src=\"\([^\"]*/\)*\([^\"/]*\)\".*,wget \1\2 -O $DIR/Img/\2," > $DIR/get_img.sh
    bash $DIR/get_img.sh
    sed -e 's,src="\([^"]*/\)*\([^"/]*\)",src="cid:\2@example.com",g' < "$1" > "$DIR/$F"
    neomutt -e 'set smtp_url=""' -e 'set sendmail="mysendmail"' -e "set content_type=text/html" me@example.com -s "test" -a $DIR/Img/* < "$DIR/$F"
    

    还需要一个自定义的 sendmail 命令(上面的mysendmail),它对mutt 生成的电子邮件文件进行后处理:

    sed -e 's,Content-Disposition: attachment; filename="\([^"]*\)",Content-Disposition: inline; name="\1"\nContent-ID: <\1@example.com>,' < /dev/stdin | sed -e 's,Content-Type: multipart/mixed;,Content-Type: multipart/related;,' | sendmail $*
    

    我已经在 GMail 和其他一些网络邮件中对其进行了测试。欢迎报告邮件客户端或网络邮件的问题。

    【讨论】:

      【解决方案6】:

      这是Jocescript 的改进版本。

      这个不需要自定义sendmail 命令,因为它会即时创建一个、使用它并在之后将其删除。

      它是参数化的,因此您无需针对不同的收件人等更改其代码,它还提供了一些其他好处。

      前几行代码应该足够清楚解释五个位置参数的含义,但这里举个例子,以防万一:

      <script.sh> /srv/emailbody.html "Sender's Name" sender@example.com "Embedded images" 'Recipent's name <recipient@example.net>' 
      

      这取决于mktemp(原始脚本没有),因为我喜欢它而不是使用$$,但这只是个人喜好问题。

      #!/bin/bash
      
      HTMLFULLPATH="$1"
      SENDER="$2"
      SENDEREMAIL="$3"
      SUBJECT="$4"
      RECIPIENT="$5"
      
      HTML=$(basename "${HTMLFULLPATH}")
      SENDERDOMAIN=$(echo "${SENDEREMAIL}" | cut -d@ -f2)
      
      if ! [[ "${RECIPIENT}" == '*<*' ]] ; then
        RECIPIENT="${RECIPIENT}"'<'"${RECIPIENT}"'>' # TO_NO_BRKTS_* SpamAssassin rules
      fi
      
      function atexit
      {
        rm -rf "${TEMPDIR}" "${NEOMUTTCONFIG}" >/dev/null 2>&1
      }
      
      trap atexit INT TERM EXIT
      
      TEMPDIR=$(mktemp -d)
      mkdir -p "${TEMPDIR}/img"
      grep "src=" "${HTMLFULLPATH}" | sed -e "s,.*src=\"\([^\"]*/\)*\([^\"/]*\)\".*,wget \1\2 -O ${TEMPDIR}/img/\2," > "${TEMPDIR}/getimg.sh"
      bash "${TEMPDIR}/getimg.sh" >/dev/null 2>&1
      sed -e 's,src="\([^"]*/\)*\([^"/]*\)",src="cid:\2@'${SENDERDOMAIN}'",g' < "${HTMLFULLPATH}" > "${TEMPDIR}/${HTML}"
      SENDMAIL="${TEMPDIR}/sendmail.sh"
      
      cat > "${SENDMAIL}" << EOF
      #!/bin/bash
      sed -e 's,Content-Disposition: attachment; filename="\([^"]*\)",Content-Disposition: inline; name="\1"\nContent-ID: <\1@'${SENDERDOMAIN}'>,' < /dev/stdin | sed -e 's,Content-Type: multipart/mixed;,Content-Type: multipart/related;,' | sendmail \$*
      EOF
      
      chmod a+rx "${SENDMAIL}"
      
      NEOMUTTCONFIG=$(mktemp)
      
      echo 'set from="'"${SENDER}"' <'"${SENDEREMAIL}"'>"' >> "${NEOMUTTCONFIG}"
      echo 'set smtp_url=""' >> "${NEOMUTTCONFIG}"
      echo 'set sendmail="'${SENDMAIL}'"' >> "${NEOMUTTCONFIG}"
      echo "set content_type=text/html" >> "${NEOMUTTCONFIG}"
      
      neomutt -F "${NEOMUTTCONFIG}" "${RECIPIENT}" -s "${SUBJECT}" -a "${TEMPDIR}/img/"* < "${TEMPDIR}/${HTML}"
      

      【讨论】:

        【解决方案7】:

        为此我构建了一个命令行https://github.com/gonejack/embed-email

        go get github.com/gonejack/embed-email
        
        Usage:
          embed-email *.eml [flags]
        
        Flags:
          -v, --verbose   verbose
          -h, --help      help for embed-email
        

        【讨论】:

          猜你喜欢
          • 2011-03-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-06
          • 2015-01-29
          • 2014-10-03
          • 2015-03-14
          相关资源
          最近更新 更多