如何在c#中发送RFC822文件

时间:2014-09-25 10:24:53

标签: c# smtp rfc822

我正在尝试转换一些用于.Net网站的Python代码。该代码检索以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格式的消息。

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

3 个答案:

答案 0 :(得分:2)

我建议使用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);
}

答案 1 :(得分:1)

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

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

答案 2 :(得分: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);
                }