我正在调试由我支持的产品中的MailKit SMTP模块发送的消息。因此,我编写了一个快速的C程序,它可能是有史以来最糟糕的SMTP实现(我不是一个有经验的程序员),以帮助我解析应用程序生成的消息。应用程序监听端口25并进行基本的SMTP(无SSL)握手,因此我得到了MailKit将转储消息的点,以便我可以看到它是如何格式化的。
当MailKit连接时,我发送回一个字符串"220 test.com SMTP服务器",然后发生以下情况:
- MailKit回复"EHLO hostname.domain.com">
- 我的应用程序返回"250 hostname.domain.com"。
- MailKit发送给我的应用程序"MAIL FROM:account@domain.com">
从这里开始,MailKit总是崩溃并显示"无法解析服务器返回的状态码";我已经尝试了我能找到的所有SMTP教程中的各种答案。在绝望的时刻,我将我的生产邮件服务器配置为接受子网的未经身份验证的中继,并执行了pcap。我试图在C中实现与pcap从后缀中获得的完全相同的字符串(在后缀中,电子邮件发出很好):
char *response = "250-server.test.comn250-SIZE 104857600n250-STARTTLSn250-ENHANCEDSTATUSCODEn250-8BITMIMEn250-DNSn250-CHUNKINGrn";
在这种情况下,MailKit从不从…它只是在超时之前等待很长时间的响应。
我的问题是……我无法在MailKit文档中找到(源代码对我帮助不大)…MailKit将接受的正确答案格式是什么,以便它继续发送RCPT TO和消息体?错误来自mailkit.net.smt.smtpstream . readresponse .
修改如下:
char *response = "250-server.test.comn250-SIZE 104857600n250-STARTTLSn250-ENHANCEDSTATUSCODEn250-8BITMIMEn250-DNSn250-CHUNKINGrn";
:
char *response = "250-server.test.comn250-SIZE 104857600n250-STARTTLSn250-ENHANCEDSTATUSCODEn250-8BITMIMEn250-DNSn250 CHUNKINGrn";
SMTP状态码后的-
字符告诉客户端至少还有1行响应,但在您的代码中,响应的最后一行具有-
,这就是为什么MailKit的SmtpClient继续等待更多数据的原因。
更新:
如果所有你想做的是检查MIME格式的MimeKit/MailKit正在做的,做这个,而不是试图写自己的邮件服务器:
var options = FormatOptions.Default.Clone();
options.NewLineFormat = NewLineFormat.Dos;
message.Prepare(EncodingConstraint.EightBit);
message.WriteTo(options, "fileName.txt");