smtp::sendmessage在尝试邮寄某些附件时提供"400: premature end-of-file from server"



我们的TCL应用程序偶尔会发送带有附件的电子邮件失败。我有3个示例文件,可以始终如一地重现这个问题(PDF、DOCX和PPTX(。我已经把下面的测试用例放在一起,在TCL外壳中重现了这个问题(在Windows 2012上,我没有尝试过其他操作系统(。PDF文件可以在这里下载。

要再现该问题,请下载上述PDF文件并将其保存在您的本地驱动器上,例如";c:/tmp/Raptor 1NT.pdf";。将以下代码保存到本地临时目录中的新TCL文件中,例如c:\tmp/mail-fail.TCL。编辑代码将filename变量更改为保存PDF的位置。您还应该根据需要更改smtpHostsmtpport。在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 "Startn"
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封带有附件的电子邮件,但我发现的几个例子就是不发送。

有什么建议吗?

如果其他人来这里想知道解决方案是什么,那么这里的问题是防火墙规则阻止了附件。经验教训-当您遇到邮件问题时,请检查日志!