////// HACK - SmtpClient does not give access to filenames when outputting e-mails to disk. The following extension method /// uses reflection to call the internal MailWriter type so that mails can be created with a specified filename. /// /// Code taken from: http://www.codeproject.com/KB/IP/smtpclientext.aspx /// /// Mail message to be serialized./// Filename of mail message.public static void Save(this MailMessage Message, string FileName) { // TODO: See if the Mono framework has serialization code we can use. Assembly assembly = typeof(SmtpClient).Assembly; Type _mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); using (FileStream _fileStream = new FileStream(FileName, FileMode.Create)) { // Get reflection info for MailWriter contructor ConstructorInfo _mailWriterContructor = _mailWriterType.GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[] { typeof(Stream) }, null); // Construct MailWriter object with our FileStream object _mailWriter = _mailWriterContructor.Invoke(new object[] { _fileStream }); // Get reflection info for Send() method on MailMessage MethodInfo _sendMethod = typeof(MailMessage).GetMethod( "Send", BindingFlags.Instance | BindingFlags.NonPublic); // Call method passing in MailWriter _sendMethod.Invoke( Message, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { _mailWriter, true, true }, null); // Finally get reflection info for Close() method on our MailWriter MethodInfo _closeMethod = _mailWriter.GetType().GetMethod( "Close", BindingFlags.Instance | BindingFlags.NonPublic); // Call close method _closeMethod.Invoke( _mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); } }
Friday, January 4, 2013
How to save MailMessage into eml file by Reflection on .net framework 4.5?
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment