我目前正在研究在 C# 中序列化 MailMessage 对象,虽然网络上有几个示例的变体,但它们序列化为二进制,这与 IMO 的要点无关。
我的方法是我想将 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 并添加一个 Serialize 函数,该函数会自动返回 rfc822 字符串,而不会影响文件系统。
由于我似乎无法使用 Visual Studio 追踪到 SMTPClient.Send 函数,因此这种“理想”的做事方式有点棘手。
我已经通过对 Peter Huber 的 POP3MimeClient 和 POP3MailClient 类添加一些小的更改来整理 RFC 消息的反序列化,以便我可以将 HDD 上的文件或字符串反序列化回 MailMessage。
困扰我的是,我真的应该能够使用流序列化 MailMessaage 并将流写入我选择的字符串或文件,而不是像上面的代码那样四处走动以创建基于 GUID 的文件夹并将文件的内容读回字符串...
任何关于我如何使它更优雅的指针都将不胜感激。
谢谢。