You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本发送带PDF附件且不展开超链接的邮件?

解决Shell脚本发送带超链接与PDF附件邮件的问题

问题背景

需通过Shell脚本发送包含超链接与PDF附件的邮件,尝试两种工具后出现以下问题:

  • 使用mailx:附件正常,但邮件中的超链接被自动展开(无法保留可点击的链接格式)
  • 使用sendmail:超链接显示正常,但PDF附件被转为乱码文本直接显示在邮件正文中
  • 服务器无法使用mutt工具

尝试的原始代码

mailx 代码

EMAIL_TO_USERS=/tmp/test.email
touch $EMAIL_TO_USERS
pdf_to_attach=sample.pdf

echo " Hello " > $EMAIL_TO_USERS
echo " This is test url www.domain.com " >> $EMAIL_TO_USERS

cat $EMAIL_TO_USERS | mailx -a $pdf_to_attach -r sender@email.com -s "Subject" pooja@email.com
rm $EMAIL_TO_USERS

sendmail 代码

ATTACH="sample.pdf"
(
 echo "To: pooja@email.com"
 echo "Subject: hello"
 echo "Content-Type: text/html"
 echo
 echo "<html><b><font size='7'>H</font>ello</b></html>"
 echo "<html><body><a href="www.domain.com">www.example.com</a></body></html>"
 echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"';
 echo "Content-Transfer-Encoding: base64";
 echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"';
 echo
 base64 sample.pdf
 ) | /usr/sbin/sendmail -t

解决方案

方案一:修正mailx脚本,保留HTML超链接

mailx默认发送纯文本邮件,需强制指定HTML格式来保留超链接,同时正常添加附件。修正后的代码:

EMAIL_TO_USERS=/tmp/test.email
touch $EMAIL_TO_USERS
pdf_to_attach=sample.pdf

# 写入HTML格式的邮件内容
echo "<html><body>" > $EMAIL_TO_USERS
echo " Hello " >> $EMAIL_TO_USERS
echo " This is test url <a href='https://www.domain.com'>www.domain.com</a> " >> $EMAIL_TO_USERS
echo "</body></html>" >> $EMAIL_TO_USERS

# 指定邮件为HTML格式,同时添加PDF附件
cat $EMAIL_TO_USERS | mailx -a "Content-Type: text/html" -a $pdf_to_attach -r sender@email.com -s "Subject" pooja@email.com
rm $EMAIL_TO_USERS

核心说明:通过-a "Content-Type: text/html"参数强制邮件以HTML格式解析,超链接将被正确渲染为可点击状态,附件功能不受影响。

方案二:修正sendmail脚本,正确处理多部分邮件

sendmail的问题在于未使用MIME多部分邮件格式,导致附件被识别为正文。需拆分邮件为HTML正文和PDF附件两个独立部分,用边界符区分。修正后的代码:

ATTACH="sample.pdf"
# 生成唯一随机边界符,避免与邮件内容冲突
BOUNDARY="----$(date +%Y%m%d%H%M%S)RandomBoundary"

(
 echo "To: pooja@email.com"
 echo "From: sender@email.com"
 echo "Subject: hello"
 echo "MIME-Version: 1.0"
 echo "Content-Type: multipart/mixed; boundary=\"$BOUNDARY\""
 echo
 echo "--$BOUNDARY"
 echo "Content-Type: text/html; charset=utf-8"
 echo
 echo "<html><b><font size='7'>H</font>ello</b></html>"
 echo "<html><body><a href='https://www.domain.com'>www.example.com</a></body></html>"
 echo
 echo "--$BOUNDARY"
 echo "Content-Type: application/pdf; name=\"$(basename $ATTACH)\""
 echo "Content-Transfer-Encoding: base64"
 echo "Content-Disposition: attachment; filename=\"$(basename $ATTACH)\""
 echo
 base64 "$ATTACH"
 echo
 echo "--$BOUNDARY--"
) | /usr/sbin/sendmail -t

核心说明:

  1. 添加MIME-Version: 1.0声明支持MIME标准
  2. 设置multipart/mixed类型并指定边界符,让邮件客户端能区分正文和附件
  3. 每个内容块以--$BOUNDARY开头,最后用--$BOUNDARY--标记邮件结束

内容的提问来源于stack exchange,提问作者Pooja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 01:00:06