smtp - 尝试邮寄某些附件时,smtp::sendmessage 给出“400:来自服务器的文件过早结束”
问题描述
偶尔我们的 TCL 应用程序无法发送带有附件的电子邮件。我有 3 个示例文件(PDF、DOCX 和 PPTX)可以始终如一地重现此问题。我整理了以下测试用例以在 TCL shell 中重现此问题(在 Windows 2012 上,我没有尝试过其他操作系统)。PDF 文件可在此处下载。
要重现此问题,请下载上述 PDF 文件并将其保存在本地驱动器上,例如“c:/tmp/Raptor 1NT.pdf”。将以下代码保存到本地临时目录中的新 TCL 文件中,例如 c:/tmp/mail-fail.tcl。编辑代码以将filename
变量更改为保存 PDF 的位置。您还应该根据需要更改smtpHost
and smtpport
。在 TCL shell 源代码中运行它的脚本,例如source c:/tmp/mail-fail.tcl
(注意,我刚刚更新了测试用例以使用 mime 1.6 和 smtp 1.4.5)。
package require mime 1.6
package require smtp 1.4.5
#package require mime 1.4
#package require smtp 1.4
proc mail_test { } {
set filename "c:/tmp/Raptor 1NT.pdf" ;#change this to wherever you saved the file
set smtpHost 192.168.1.7 ;#change these to your smtp host and port
set smtpport 25
puts "Start\n"
set from_addr "anyone@anywhere.com"
set originator "bounce-555-9C2589AD35AF0A6CF851CACA5555AA1741C3E2C6-9066@anywhere.com"
set reply_to $from_addr
set to_addr $from_addr
set mime_type "application/pdf"
set title "Raptor PDF"
set name "=Raptor 1NT.pdf"
set tokens [mime::initialize \
-param [list name $title] \
-header [list "Content-Disposition" "attachment; filename=\"$name\""] \
-header [list Content-Description $title] \
-canonical $mime_type \
-file "$filename"]
set tokens [mime::initialize -canonical "multipart/mixed" -parts $tokens]
set message_id [mime::uniqueID]
mime::setheader $tokens "message-id" $message_id
set clock [clock seconds]
set date [clock format $clock -format "%Y-%m-%d %H:%M:%S"]
set message_date [mime::parsedatetime $date proper]
mime::setheader $tokens date $message_date
set encoded_subject "=?UTF-8?Q?My_test_mail?="
mime::setheader $tokens Subject $encoded_subject
set headers_list [list [list From $from_addr] [list Reply-To $reply_to] [list To [join $to_addr ","]]]
set cmd [list smtp::sendmessage $tokens -originator $originator]
foreach header $headers_list {
lappend cmd -header $header
}
lappend cmd -servers $smtpHost -ports $smtpport
puts "cmd=$cmd \n"
if {[catch $cmd errorMsg]} {
puts "\n$errorMsg \n"
} else {
puts "Mail successfully sent \n"
}
puts "\nThe end."
}
mail_test
运行此脚本时得到的输出是:
cmd=smtp::sendmessage ::mime::27 -originator bounce-555-9C2589AD35AF0A6CF851CACA5555AA1741C3E2C6-9066@anywhere.com -header {From anyone@anywhere.com} -header {Reply-To anyone@anywhere.com} -header {To anyone@anywhere.com} -servers 192.168.1.7 -ports 25
400: premature end-of-file from server
现在这个应用程序多年来已经成功发送了 1000 封带附件的电子邮件,但我发现的这几个例子只是没有发送。
任何建议如何进行?
解决方案
如果其他人来这里想知道解决方案是什么,这里的问题原来是阻止附件的防火墙规则。经验教训 - 当您遇到邮件问题时检查您的日志!
推荐阅读
- elasticsearch - 在 elasticsearch 模板中创建 geoip 字段
- gradle - 构建特定类型的包
- jquery - 如何捕获此输入框中的文本
- python - 如何使用非唯一列将具有总和值的熊猫 Groupby 数据帧映射到另一个数据帧
- python-3.x - 在 pyhocon 中是否可以在运行时包含文件
- javascript - Chrome 扩展读取 GET 请求
- google-cloud-dataflow - 使用气流 Cloud Composer 运行多文件 python apache 光束
- amazon-dynamodb - 更新 dynamodb 上的许多项目
- scala - Spark graphX 从数据框生成 Edge/Vertex RDD
- ruby - 在使用 Ruby 在 shell 中的字符串中使用单引号时,我得到 sh: -c: line 0: unexpected EOF while looking for matching `''