我目前正在研究在C#中对MailMessage对象进行序列化。虽然网络上有几种示例,但它们将序列化为二进制,这有点违背了我的期望。
我的想法是将MailMessage序列化为RFC2822 eml字符串,下面的代码就是我得出的结果。
public string SerializeEmail(MailMessageArgs e)
{
string rfc822eml = "";
Guid g = Guid.NewGuid();
lock (g.ToString())
{
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\tmpspool");
di.CreateSubdirectory(g.ToString());
string spoolDir = @"C:\tmpspool\" + g.ToString();
SmtpClient Client = new SmtpClient("localhost");
Client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
Client.PickupDirectoryLocation = spoolDir;
Client.Send(e.mailObj);
var files = from file in Directory.EnumerateFiles(spoolDir)
select file;
string serializedEml = files.First();
rfc822eml = File.ReadAllText(serializedEml);
File.Delete(serializedEml);
Directory.Delete(spoolDir);
}
return rfc822eml;
}
它相当讨厌,但它确实有效。不过,理想情况下,我会创建一个新的SMTPClient并添加一个序列化函数,该函数会自动返回rfc822字符串而无需将其放在文件系统中。
由于我似乎无法使用Visual Studio跟踪到SMTPClient.Send函数,所以这种“理想”方式有些棘手。
我已经通过对Peter Huber的POP3MimeClient和POP3MailClient类进行一些小修改来解析RFC消息,因此我可以将硬盘驱动器上的文件或字符串反序列化回MailMessage。
让我烦恼的是,我真的应该能够使用流将MailMessage进行序列化,并将流写入自己选择的字符串或文件中,而不是像上面的代码那样绕道创建基于GUID的文件夹,并将文件内容读回字符串中...
如果您能指出如何使此更加优雅的方法,我将不胜感激。
谢谢。