使用linux命令在电子邮件中嵌入图像

时间:2013-01-17 14:19:59

标签: linux email sendmail

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

我用过这个

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

但它不起作用。

7 个答案:

答案 0 :(得分:2)

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

几个步骤:

  1. 下载原始HTML中由<img>标记链接的所有图像文件,
  2. 通过将src网址更改为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和其他一些网络邮件中对其进行了测试。欢迎报告邮件客户端或网络邮件的问题。

答案 1 :(得分:0)

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

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

Embedding attached images in HTML emails

答案 2 :(得分:0)

对于那些希望使用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中显示得很好。

答案 3 :(得分:0)

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

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

How to embed images in email

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

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

答案 4 :(得分:0)

这是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}"

答案 5 :(得分:0)

我为此构建了一个命令行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

答案 6 :(得分:-1)

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