1

我正在尝试转换一些 Python 代码以在 .Net 网站中使用。该代码检索以 RFC822 格式存储的消息,并使用以下命令再次将消息发送到 SMTP 服务器:

mail from: blah blah
rcpt to: blah blah
data
<send the text from the RFC822 file here>
.

因此不需要解析 RFC822 文件(幸运的是!)。在 Python 中,这很简单:

smtp = smtplib.SMTP(_SMTPSERVER)
smtp.sendmail(_FROMADDR, recipient, msg)

其中文件已被读入变量msg。有没有一种简单的方法可以在 C# 中做到这一点?

内置的 C# SMTP 对象不提供执行此操作的方法,或者至少我还没有找到方法。它们似乎是基于通过分别提供地址、主题和正文来构建 MailMessage 的原则。SmtpClient有一个Send(string, string, string, string)方法,但这又需要一个单独的主题和正文,所以我猜它为您构造了 RFC822 格式的消息。

如有必要,我可以编写自己的课程来发送邮件。这是一个如此简单的要求,不会花很长时间。但是,如果有一种方法可以使用标准库,那么它们的错误可能比我的代码少。

4

3 回答 3

4

我建议使用MimeKit解析消息文件,然后使用MailKit通过 SMTP 发送。MailKit 基于 MimeKit,因此它们可以很好地协同工作,并且 MailKit 的 SmtpClient 优于 System.Net.Mail 的实现。

解析消息就像这样简单:

var message = MimeMessage.Load (fileName);

发送消息就像这几行一样简单:

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.gmail.com", 465, true);
    client.Authenticate ("username", "password");
    client.Send (message);
    client.Disconnect (true);
}
于 2014-09-27T00:45:43.577 回答
1

你是对的,内置的东西并没有为此提供解决方案。

我的建议是简单地编写一些代码,使用 TcpClient 和 StreamReader / StreamWriter 与 SMTP 服务器进行交互。它不应该需要超过 50 行代码。

于 2014-09-25T10:27:54.617 回答
1

这很容易做到,您只需要从 nuget 安装 MailKit 和 MimeKit。请注意,因为如果您不需要身份验证,将“useSsl”设置为 false 是不够的,它不起作用。您需要设置 MailKit.Security.SecureSocketOptions.None

 var message = MimeMessage.Load("pathToEml");
                using (var client = new MailKit.Net.Smtp.SmtpClient())
                {
                    client.Connect("smtp.yourserver.yourdomain", 25, MailKit.Security.SecureSocketOptions.None);  //set last param to true for authentication
                    //client.Authenticate("username", "password");
                    client.Send(message);
                    client.Disconnect(true);
                }
于 2020-03-04T17:03:06.917 回答