#if NET452 || NETSTANDARD2_0 using System; using System.IO; using System.Net.Mail; using System.Reflection; namespace Unosquare.Swan { /// /// Extension methods. /// public static class SmtpExtensions { /// /// The raw contents of this MailMessage as a MemoryStream. /// /// The caller. /// A MemoryStream with the raw contents of this MailMessage. public static MemoryStream ToMimeMessage(this MailMessage self) { if(self == null) { throw new ArgumentNullException(nameof(self)); } MemoryStream result = new MemoryStream(); Object mailWriter = MimeMessageConstants.MailWriterConstructor.Invoke(new Object[] { result }); _ = MimeMessageConstants.SendMethod.Invoke( self, MimeMessageConstants.PrivateInstanceFlags, null, MimeMessageConstants.IsRunningInDotNetFourPointFive ? new[] { mailWriter, true, true } : new[] { mailWriter, true }, null); result = new MemoryStream(result.ToArray()); _ = MimeMessageConstants.CloseMethod.Invoke( mailWriter, MimeMessageConstants.PrivateInstanceFlags, null, new Object[] { }, null); result.Position = 0; return result; } internal static class MimeMessageConstants { public static readonly BindingFlags PrivateInstanceFlags = BindingFlags.Instance | BindingFlags.NonPublic; public static readonly Type MailWriter = typeof(SmtpClient).Assembly.GetType("System.Net.Mail.MailWriter"); public static readonly ConstructorInfo MailWriterConstructor = MailWriter.GetConstructor(PrivateInstanceFlags, null, new[] { typeof(Stream) }, null); public static readonly MethodInfo CloseMethod = MailWriter.GetMethod("Close", PrivateInstanceFlags); public static readonly MethodInfo SendMethod = typeof(MailMessage).GetMethod("Send", PrivateInstanceFlags); public static readonly Boolean IsRunningInDotNetFourPointFive = SendMethod.GetParameters().Length == 3; } } } #endif