这是我对 RawMessage() 的 VB.NET 重新散列,其中在标头中包含 BCC。基于其他人对原始 SO 链接的重新散列:http://colinmackay.co.uk/2011/11/10/sending-more-than-a-basic-email-with-amazon-ses
Public Class BuildRawMailHelper
Private Const nonPublicInstance As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
Private Shared ReadOnly _mailWriterContructor As ConstructorInfo
Private Shared ReadOnly _sendMethod As MethodInfo
Private Shared ReadOnly _closeMethod As MethodInfo
Private Shared ReadOnly _writeHeadersMethod As MethodInfo
Shared Sub New()
Dim systemAssembly As Assembly = GetType(SmtpClient).Assembly
Dim mailWriterType As Type = systemAssembly.[GetType]("System.Net.Mail.MailWriter")
_mailWriterContructor = mailWriterType.GetConstructor(nonPublicInstance, Nothing, {GetType(Stream)}, Nothing)
_sendMethod = GetType(MailMessage).GetMethod("Send", nonPublicInstance)
_closeMethod = mailWriterType.GetMethod("Close", nonPublicInstance)
_writeHeadersMethod = mailWriterType.GetMethod("WriteHeaders", nonPublicInstance)
End Sub
Public Shared Function ConvertMailMessageToMemoryStream(message As MailMessage) As MemoryStream
Using memoryStream As New MemoryStream()
Dim mailWriter As Object = _mailWriterContructor.Invoke(New Object() {memoryStream})
' BCC is not output in headers by Send method, so we add it in manually
If message.Bcc.Any Then
Dim bccHeaders As New NameValueCollection()
bccHeaders.Add("BCC", String.Join(", ", message.Bcc.Select(Function(x) x.ToString())))
_writeHeadersMethod.Invoke(mailWriter, nonPublicInstance, Nothing, {bccHeaders, False}, Nothing)
End If
' See http://stackoverflow.com/questions/9595440/getting-system-net-mail-mailmessage-as-a-memorystream-in-net-4-5-beta
_sendMethod.Invoke(message, nonPublicInstance, Nothing, {mailWriter, True, True}, Nothing)
_closeMethod.Invoke(mailWriter, nonPublicInstance, Nothing, {}, Nothing)
Return memoryStream
End Using
End Function
End Class