2014-09-25 54 views
1

我试图转换一些.Net网站中使用的Python代码。该代码检索存储在RFC822格式的消息,并将该消息再次使用SMTP服务器:如何发送c#中的RFC822文件#

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) 

该文件已经被读入变量味精。有没有简单的方法在C#中做到这一点?

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

如有需要,我可以写我自己的班级发送邮件。这是一个非常简单的要求,它不会花费很长时间。但是,如果有一种使用标准库的方式,它们可能比我的代码少一些。

回答

1

你是对的,内置的东西不提供解决方案。

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

+0

你不希望有重写的可配置性SmptClient。如果OP想要使用认证,加密,不同的服务器等,则需要使用代码读取配置。 – CodeCaster 2014-09-25 10:30:54

+0

@CodeCaster为什么不呢? OP的要求显然不符合SmtpClient的设计要求,而且他似乎只支持单个SMPT服务器(或其中少数)。手动解决方案应该很好地完成这项工作。为此,SMTP协议非常简单。 – Polynomial 2014-09-25 10:32:36

+0

谢谢,我怀疑我最终会自己做。我有一个C++ SMTP类,我在石器时代写过,我可以很快地在C#中重做,所以没什么大不了的。如果没有任何建议,我明天就会接受。 – 2014-09-25 15:50:11

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); 
} 
+0

谢谢Jeffrey,但没有必要解析RFC822文件。它只需要发送一个套接字到SMTP服务器。我花了大约一个小时的时间编写了一个使用TcpClient发送文件的简单类。在我添加所有异常跟踪的时间内,Polynomial对50行的估计证明相当乐观,但它仍然是一项快速工作。 – 2014-09-27 05:03:42