首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mimekit / MailKit BSMTP文件

Mimekit / MailKit BSMTP文件
EN

Stack Overflow用户
提问于 2020-11-06 19:35:25
回答 1查看 89关注 0票数 1

尝试在这里自动化一个进程-我们有一个系统生成批处理SMTP文件,将它们转储到一个文件夹-第三方.net组件读取文件,然后发送到我们的SMTP服务器。问题是此组件创建并破坏了与每封电子邮件的新smtp连接。我很痛苦地慢慢来--我和卖主商量过了,也不打算用其他方式来做..ever。因此,我想把我自己的简单服务-进料应用程序创建批处理smtp文件。我试图通过MimeKit加载这个文件,并得到一个解析错误--这并不是客户端使用的正常MIME。是否有任何选项可以让MimeKit甚至MailKit来加载和中继这封邮件?

文件的简化格式。为了清晰起见,所有的数据都被屏蔽了--我想我可以去掉smtp命令,在代码中设置它们,然后在实际的MIM部分中进行流--但是似乎应该有一种更简单的方法。

代码语言:javascript
复制
PORT 25
HELO mydomain.com
MAIL FROM: <asdlfjasdfasdfadsf@mydomain.com>
RCPT TO: <foobar@blah.com>
DATA
From: <foobar@foo.com>
To: foovar@blah.com
Subject: Test
Date: Wed, 04 Nov 2020 11:31:52 -0600
Message-ID: <2asdfadfadaf9-0@v116.mydomain.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
    boundary="--=036c8f0f_0fd5_48a2_85b7_b5310c3b811b"

----=036c8f0f_0fd5_48a2_85b7_b5310c3b811b
Content-Type: multipart/alternative;
    boundary="--=6b227ff4_d132_4000_9af6_f92a291f8101"

----=6b227ff4_d132_4000_9af6_f92a291f8101
Content-Type: text/plain;charset="UTF-8"
Content-Transfer-Encoding: Quoted-Printable

some content here


----=6b227ff4_d132_4000_9af6_f92a291f8101
Content-Type: text/html;charset="UTF-8"
Content-Transfer-Encoding: Quoted-Printable

html content here

----=6b227ff4_d132_4000_9af6_f92a291f8101--

----=036c8f0f_0fd5_48a2_85b7_b5310c3b811b--
.
QUIT
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-07 03:43:51

我想我可以删除smtp命令,并在代码中设置它们,然后在实际的

部分中进行流。

这就是你要做的。没有别的办法了。请记住,您还需要删除仅为.QUIT行的行。

您获得的文件格式本质上是一个"SMTP命令脚本“,其中包括嵌入式MIME,但它本身并不是MIME,因此MimeKit/MailKit的解析器无法处理它。

没有必要保留您删除的SMTP命令,因为MailKit的SmtpClient不允许您发送命令,因为它自己处理发送命令。

MailKit自动检测它需要根据发件人/From和/Cc/Bcc头发送的地址,但我认为,为了获得一个显式列表,解析MAILFROM:RCPT TO:命令可能是值得的。

就像这样:

代码语言:javascript
复制
var recipients = new List<MailboxAddress> ();
MailboxAddress sender = null;
    
if (line.StartsWith ("MAIL FROM:", StringComparison.OrdinalIgnoreCase)) {
    var address = line.Substring ("MAIL FROM:".Length);
    if (MailboxAddress.TryParse (address, out var mailbox))
        sender = mailbox;
} else if (line.StartsWith ("RCPT TO:", StringComparison.OrdinalIgnoreCase)) {
    var address = line.Substring ("RCPT TO:".Length);
    if (MailboxAddress.TryParse (address, out var mailbox))
        recipients.Add (mailbox);
}

最困难的部分将是有效地处理批处理smtp文件。您可以使用StreamReader逐行读取数据,处理输入,直到读取了DATA行为止(后面的所有内容都是消息的一部分,直到遇到与.匹配的行),但问题是,您需要继续使用StreamReader读取数据,并将其转储到MemoryStream或其他可以使用MimeMessage.Load()解析的东西(PS:不要忘记在解析流之前对其进行回风)。

如果您有这样的技能,更好的选择是实现自定义IMimeFilter,然后将MimeMessage.Load()与通过自定义筛选器过滤源流的FilteredStream一起使用。

对于一些示例过滤器实现,请看一看https://github.com/jstedfast/MimeKit/tree/master/MimeKit/IO/Filters

最容易理解的可能是Unix2Dos和Dos2Unix过滤器。

另外要记住的是,当您过滤那些批处理文件中内容的"MIME“部分时,您将需要通过删除第一个点(..)来取消以两个点(.)开头的行。

Pop3Stream代码在MailKit中也必须完成这个过程,因为POP3通过在一个额外的.前面加上一个.来处理MIME行。

您可以在这里看到代码:https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Pop3/Pop3Stream.cs#L344

(不幸的是,这是相当复杂的逻辑,因为它也处理缓冲)。

然后,一旦您删除了使用SMTP命令的所有行并使用上面的代码片段处理了它们,您可以使用以下逻辑通过MailKit的SmtpClient发送:

代码语言:javascript
复制
using (var client = new SmtpClient ()) {
    client.Connect (host, port, SecureSocketOptions.Auto);
    client.Authenticate (username, password);

    foreach (batchFile in batchFiles) {
        using (var stream = File.OpenRead (batchFile)) {
            var message = MyCustomParseMessage (stream, out MailbnoxAddress sender, out List<MailboxAddress> recipients);

            client.Send (message, sender, recipients);
        }
    }

    client.Disconnect (true);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64720634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档