В настоящее время я рассматриваю сериализацию объекта MailMessage на С#, и, хотя в сети есть несколько вариантов примера, они сериализуются в двоичный код, что, по-моему, не соответствует сути.
Мой подход заключается в том, что я хотел бы сериализовать MailMessage в строку eml RFC2822, и приведенный ниже код - это то, что я придумал.
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, даже не затрагивая файловую систему.
Поскольку мне кажется, что я не могу отследить функцию SMTPClient.Send с помощью Visual Studio, этот «идеальный» способ ведения дел немного сложен.
Я уже разобрался с десериализацией сообщения RFC, добавив небольшие изменения в классы POP3MimeClient и POP3MailClient Питера Хубера, чтобы я мог десериализовать файл на жестком диске или строку обратно в MailMessage.
Меня раздражает то, что я действительно должен иметь возможность сериализовать MailMessaage, используя поток, и записывать поток в строку или файл по моему выбору вместо того, чтобы ходить по домам и создавать папки на основе GUID, как это делает приведенный выше код. и чтение содержимого файла обратно в строку...
Любые указатели на то, как я могу сделать это более элегантным, будут высоко оценены.
Спасибо.