如何用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
核心说明:
- 添加
MIME-Version: 1.0声明支持MIME标准 - 设置
multipart/mixed类型并指定边界符,让邮件客户端能区分正文和附件 - 每个内容块以
--$BOUNDARY开头,最后用--$BOUNDARY--标记邮件结束
内容的提问来源于stack exchange,提问作者Pooja
相关产品推荐
相关产品推荐

