Monday, August 8, 2016

Converting MailMessage to Memory stream remove BCC

I had a problem using SendRawMessage with Amazon SES & not able to send BCC, later I figured out that the problem is in converting the mail message to memory stream.

So this is the detailed method required to convert mail message to memory stream and include BCC also. It for .Net 4.5


1 - In SendMessageUsingAWSProfileAsync(, Remove the desintation as it does not entertain BCC
                var sendRequest = new SendRawEmailRequest(rawMessage)
                {
                    Source = mailMessage.From.Address, // Destination is removed from here intenationally as it stop doing BCC
}
2 - In ConvertMailMessageToMemoryStream, Include BCC headers while creating the stream from mail message
// BCC is not included by default, so need to include it.
        if (message.Bcc.Count > 0)
        {
            MethodInfo writeHeadersMethod = mailWriter.GetType().GetMethod("WriteHeaders", BindingFlags.Instance | BindingFlags.NonPublic);
            System.Collections.Specialized.NameValueCollection bccHeaders = new System.Collections.Specialized.NameValueCollection();
            bccHeaders.Add("BCC", string.Join(",", message.Bcc.Select(b => b.Address)));
            writeHeadersMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { bccHeaders, false }, null);
        }