[英]Elegant way to serialize a MailMessage object in .NET
我目前正在考慮在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的文件夾,如上面的代碼所做的那樣並將文件內容讀回字符串...
關於如何使這更優雅的任何指示將非常感激。
謝謝。
這將是一個黑客。 不要忘記,MS可以在.Net的下一個版本中進行更改。
(在ILSpy的幫助下)您可以編寫如下的擴展方法
public static class MailExtensions
{
public static string ToEml(this MailMessage mail)
{
var stream = new MemoryStream();
var mailWriterType = mail.GetType().Assembly.GetType("System.Net.Mail.MailWriter");
var mailWriter = Activator.CreateInstance(
type: mailWriterType,
bindingAttr: BindingFlags.Instance | BindingFlags.NonPublic,
binder: null,
args: new object[] { stream },
culture: null,
activationAttributes: null);
mail.GetType().InvokeMember(
name: "Send",
invokeAttr: BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
binder: null,
target: mail,
args: new object[] { mailWriter, true, true });
return Encoding.UTF8.GetString(stream.ToArray());
}
}
並用作
string eml = mailMessage.ToEml();
經過大量工作后,我終於設法對MailMessage進行反序列化:
為了做到這一點,我創建了一個將在客戶端應用程序和Web服務中使用的DLL。 這需要相同的反序列化工作:)
我在這里選擇了dll序列化類: https : //bitbucket.org/burningice/compositec1contrib.email/src/0bba07df532c8134717cfb40757f4cb22f002b1d/Email/Serialization/?at=default
非常感謝分享!
編譯完成后,將我的新dll添加到項目中,發送和接收工作正常。
所以我用這種方式轉換MailMessage:string serializedMessage = SerializeAsBase64(mail); 在Webservice中,我用這種方式重建它:MailMessage Mm = DeserializeFromBase64(serializedMessage);
我希望這有幫助...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.