首页 > 解决方案 > 尝试邮寄某些附件时,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 的位置。您还应该根据需要更改smtpHostand 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 封带附件的电子邮件,但我发现的这几个例子只是没有发送。

任何建议如何进行?

标签: smtptcl

解决方案


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


推荐阅读