使用Curl发送带附件邮件报错:非法格式的content-type字段
Curl发送带附件邮件报错的排查与解决
错误信息
Warning: Illegally formatted content-type field! curl: option --form: is badly used here curl: try 'curl --help' or 'curl --manual' for more information
问题根源
curl的SMTP传输模式不支持--form选项,该选项仅用于HTTP协议的表单提交操作。你试图用它构造MIME多部分邮件内容,这完全不符合curl SMTP模式的使用逻辑,因此触发错误。
另外,你的MIME类型获取代码存在变量展开问题:file --mime-type '$ATTACHMENT_FILE'中的单引号会阻止变量$ATTACHMENT_FILE被解析,导致无法正确获取附件的MIME类型。
修复方案
改用手动构造完整的MIME多部分邮件内容,并通过标准输入传递给curl。以下是修正后的完整脚本:
SERVER='smtp.abc.com' PORT='587' USER='sender@gmail.com' PASS='12134' SENDER_ADDRESS="$USER" SENDER_NAME='SENDER' RECIPIENT_NAME='testname' RECIPIENT_ADDRESS='n@gmail.com' SUBJECT='status' MESSAGE='Hi all, ' ATTACHMENT_FILE='/home/ubuntu/aa/aa.log' # 修复变量展开问题,正确获取MIME类型 ATTACHMENT_TYPE="$(file --mime-type "$ATTACHMENT_FILE" | sed 's/.*: //')" # 生成随机MIME边界 BOUNDARY="----$(date +%s%N)" # 构造完整的MIME邮件内容并通过stdin传递给curl curl --ssl-reqd --url "smtp://$SERVER:$PORT" \ --user "$USER:$PASS" \ --mail-from "$SENDER_ADDRESS" \ --mail-rcpt "$RECIPIENT_ADDRESS" \ --upload-file - <<EOF Subject: $SUBJECT From: $SENDER_NAME <$SENDER_ADDRESS> To: $RECIPIENT_NAME <$RECIPIENT_ADDRESS> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="$BOUNDARY" --$BOUNDARY Content-Type: text/plain; charset=utf-8 $MESSAGE --$BOUNDARY Content-Type: $ATTACHMENT_TYPE Content-Disposition: attachment; filename="$(basename "$ATTACHMENT_FILE")" Content-Transfer-Encoding: base64 $(base64 "$ATTACHMENT_FILE") --$BOUNDARY-- EOF
关键修正点说明
- 移除所有
--form选项,改用--upload-file -读取标准输入的完整MIME邮件内容 - 修复
ATTACHMENT_TYPE的变量引用问题,确保正确获取附件MIME类型 - 生成随机
BOUNDARY用于分隔MIME多部分内容 - 手动构造符合RFC规范的MIME邮件头和内容,包括文本部分和base64编码的附件部分
内容的提问来源于stack exchange,提问作者Nitin Alety
相关产品推荐
相关产品推荐

