private static void SaveCLR(MailMessage message, Stream outputStream, MethodInfo sendMethod)
{
// Unfortunately we have to use reflection because of poorly designed .NET framework components
Assembly assembly = typeof(SmtpClient).Assembly;
Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
// Get reflection info for MailWriter contructor
var mailWriterContructor = mailWriterType.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new[] { typeof(Stream) },
null);
// Construct MailWriter object with our FileStream
object mailWriter = mailWriterContructor.Invoke(new object[] { outputStream });
var methodParams = sendMethod.GetParameters().Length == 2
? new[] { mailWriter, true } // .NET 4.0 (and earlier?)
: new[] { mailWriter, true, true }; // .NET 4.5 has an additional parameter
// Call method passing in MailWriter
sendMethod.Invoke(
message,
BindingFlags.Instance | BindingFlags.NonPublic,
null,
methodParams,
null);
}