Hi,
I have a system where an email is generated and sent out. I need to create a mechanism to store the email as proof that it was sent.
At first I thought I could store the email in my database. Easy until I realised that MailMessage() is not serialised. Did find some links on how to serialise it but it looks enormously complicated and I could not get any of them close to working.
I then came across this article which adds a save method to the class. The code can be found here:
http://www.codeproject.com/KB/IP/smtpclientext.aspx
It’s written in C# so I’ve had to convert it VB.Net but I cannot see to fix a single error which is:
Extension methods can be defined only in modules.
Here is the VB code:
Any help much appreciated.Code:Imports System.Net.Mail Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.IO Imports System.Reflection Namespace MailMessageExtension Public NotInheritable Class MailMessageExt Private Sub New() End Sub <System.Runtime.CompilerServices.Extension> _ Public Shared Sub Save(Message As MailMessage, FileName As String) Dim assembly As Assembly = GetType(SmtpClient).Assembly Dim _mailWriterType As Type = assembly.[GetType]("System.Net.Mail.MailWriter") Using _fileStream As New FileStream(FileName, FileMode.Create) ' Get reflection info for MailWriter contructor Dim _mailWriterContructor As ConstructorInfo = _mailWriterType.GetConstructor(BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Type() {GetType(Stream)}, Nothing) ' Construct MailWriter object with our FileStream Dim _mailWriter As Object = _mailWriterContructor.Invoke(New Object() {_fileStream}) ' Get reflection info for Send() method on MailMessage Dim _sendMethod As MethodInfo = GetType(MailMessage).GetMethod("Send", BindingFlags.Instance Or BindingFlags.NonPublic) ' Call method passing in MailWriter _sendMethod.Invoke(Message, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {_mailWriter, True}, Nothing) ' Finally get reflection info for Close() method on our MailWriter Dim _closeMethod As MethodInfo = _mailWriter.[GetType]().GetMethod("Close", BindingFlags.Instance Or BindingFlags.NonPublic) ' Call close method _closeMethod.Invoke(_mailWriter, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {}, Nothing) End Using End Sub End Class End Namespace




Reply With Quote