Files
SDL/_VERAG_PROG_ALLGEMEIN/Classes/cSendMailAttach.vb

264 lines
9.8 KiB
VB.net

'Imports System.Runtime.InteropServices
'Imports System.Windows.Forms
'Imports System.IO
'Namespace SendFileTo
' Public Class cSendMailAttach
' Public Function AddRecipientTo(ByVal email As String) As Boolean
' Return AddRecipient(email, howTo.MAPI_TO)
' End Function
' Public Function AddRecipientCC(ByVal email As String) As Boolean
' Return AddRecipient(email, howTo.MAPI_TO)
' End Function
' Public Function AddRecipientBCC(ByVal email As String) As Boolean
' Return AddRecipient(email, howTo.MAPI_TO)
' End Function
' Public Sub AddAttachment(ByVal strAttachmentFileName As String)
' m_attachments.Add(strAttachmentFileName)
' End Sub
' Public Function SendMailPopup(ByVal strSubject As String,
' ByVal strBody As String) As Integer
' Return SendMail(strSubject, strBody, MAPI_LOGON_UI Or MAPI_DIALOG)
' End Function
' Public Function SendMailDirect(ByVal strSubject As String,
' ByVal strBody As String) As Integer
' Return SendMail(strSubject, strBody, MAPI_LOGON_UI)
' End Function
' <DllImport("MAPI32.DLL")>
' Private Shared Function MAPISendMail(ByVal sess As IntPtr,
' ByVal hwnd As IntPtr, ByVal message As MapiMessage,
' ByVal flg As Integer, ByVal rsv As Integer) As Integer
' End Function
' Private Function SendMail(ByVal strSubject As String,
' ByVal strBody As String, ByVal how As Integer) As Integer
' Dim msg As MapiMessage = New MapiMessage()
' msg.subject = strSubject
' msg.noteText = strBody
' msg.recips = GetRecipients(msg.recipCount)
' msg.files = GetAttachments(msg.fileCount)
' m_lastError = MAPISendMail(New IntPtr(0), New IntPtr(0), msg, how,
' 0)
' If m_lastError > 1 Then
' MessageBox.Show("MAPISendMail failed! " + GetLastError(),
' "MAPISendMail")
' End If
' Cleanup(msg)
' Return m_lastError
' End Function
' Private Function AddRecipient(ByVal email As String,
' ByVal howTo As howTo) As Boolean
' Dim recipient As MapiRecipDesc = New MapiRecipDesc()
' recipient.recipClass = CType(howTo, Integer)
' recipient.name = email
' m_recipients.Add(recipient)
' Return True
' End Function
' Private Function GetRecipients(ByRef recipCount As Integer) As IntPtr
' recipCount = 0
' If m_recipients.Count = 0 Then
' Return 0
' End If
' Dim size As Integer = Marshal.SizeOf(GetType(MapiRecipDesc))
' Dim intPtr As IntPtr = Marshal.AllocHGlobal(
' m_recipients.Count * size)
' Dim ptr As Integer = CType(intPtr, Integer)
' Dim mapiDesc As MapiRecipDesc
' For Each mapiDesc In m_recipients
' Marshal.StructureToPtr(mapiDesc, CType(ptr, IntPtr), False)
' ptr += size
' Next
' recipCount = m_recipients.Count
' Return intPtr
' End Function
' Private Function GetAttachments(ByRef fileCount As Integer) As IntPtr
' fileCount = 0
' If m_attachments Is Nothing Then
' Return 0
' End If
' If (m_attachments.Count <= 0) Or (m_attachments.Count >
' maxAttachments) Then
' Return 0
' End If
' Dim size As Integer = Marshal.SizeOf(GetType(MapiFileDesc))
' Dim intPtr As IntPtr = Marshal.AllocHGlobal(
' m_attachments.Count * size)
' Dim mapiFileDesc As MapiFileDesc = New MapiFileDesc()
' mapiFileDesc.position = -1
' Dim ptr As Integer = CType(intPtr, Integer)
' Dim strAttachment As String
' For Each strAttachment In m_attachments
' mapiFileDesc.name = Path.GetFileName(strAttachment)
' mapiFileDesc.path = strAttachment
' Marshal.StructureToPtr(mapiFileDesc, CType(ptr, IntPtr), False)
' ptr += size
' Next
' fileCount = m_attachments.Count
' Return intPtr
' End Function
' Private Sub Cleanup(ByRef msg As MapiMessage)
' Dim size As Integer = Marshal.SizeOf(GetType(MapiRecipDesc))
' Dim ptr As Integer = 0
' If msg.recips <> IntPtr.Zero Then
' ptr = CType(msg.recips, Integer)
' Dim i As Integer
' For i = 0 To msg.recipCount - 1 Step i + 1
' Marshal.DestroyStructure(CType(ptr, IntPtr),
' GetType(MapiRecipDesc))
' ptr += size
' Next
' Marshal.FreeHGlobal(msg.recips)
' End If
' If msg.files <> IntPtr.Zero Then
' size = Marshal.SizeOf(GetType(MapiFileDesc))
' ptr = CType(msg.files, Integer)
' Dim i As Integer
' For i = 0 To msg.fileCount - 1 Step i + 1
' Marshal.DestroyStructure(CType(ptr, IntPtr),
' GetType(MapiFileDesc))
' ptr += size
' Next
' Marshal.FreeHGlobal(msg.files)
' End If
' m_recipients.Clear()
' m_attachments.Clear()
' m_lastError = 0
' End Sub
' Public Function GetLastError() As String
' If m_lastError <= 26 Then
' Return errors(m_lastError)
' End If
' Return "MAPI error [" + m_lastError.ToString() + "]"
' End Function
' ReadOnly errors() As String = New String() {"OK [0]", "User abort [1]",
' "General MAPI failure [2]", "MAPI login failure [3]",
' "Disk full [4]", "Insufficient memory [5]", "Access denied [6]",
' "-unknown- [7]", "Too many sessions [8]",
' "Too many files were specified [9]",
' "Too many recipients were specified [10]",
' "A specified attachment was not found [11]",
' "Attachment open failure [12]", "Attachment write failure [13]",
' "Unknown recipient [14]", "Bad recipient type [15]",
' "No messages [16]", "Invalid message [17]", "Text too large [18]",
' "Invalid session [19]", "Type not supported [20]",
' "A recipient was specified ambiguously [21]",
' "Message in use [22]", "Network failure [23]",
' "Invalid edit fields [24]", "Invalid recipients [25]",
' "Not supported [26]"}
' Dim m_recipients As New List(Of MapiRecipDesc)
' Dim m_attachments As New List(Of String)
' Dim m_lastError As Integer = 0
' Private Const MAPI_LOGON_UI As Integer = &H1
' Private Const MAPI_DIALOG As Integer = &H8
' Private Const maxAttachments As Integer = 20
' Enum howTo
' MAPI_ORIG = 0
' MAPI_TO
' MAPI_CC
' MAPI_BCC
' End Enum
' End Class
' <StructLayout(LayoutKind.Sequential)>
' Public Class MapiMessage
' Public reserved As Integer
' Public subject As String
' Public noteText As String
' Public messageType As String
' Public dateReceived As String
' Public conversationID As String
' Public flags As Integer
' Public originator As IntPtr
' Public recipCount As Integer
' Public recips As IntPtr
' Public fileCount As Integer
' Public files As IntPtr
' End Class
' <StructLayout(LayoutKind.Sequential)>
' Public Class MapiFileDesc
' Public reserved As Integer
' Public flags As Integer
' Public position As Integer
' Public path As String
' Public name As String
' Public type As IntPtr
' End Class
' <StructLayout(LayoutKind.Sequential)>
' Public Class MapiRecipDesc
' Public reserved As Integer
' Public recipClass As Integer
' Public name As String
' Public address As String
' Public eIDSize As Integer
' Public enTryID As IntPtr
' End Class
'End Namespace
Imports System
Imports System.IO
Imports System.Net.Mail
Imports System.Reflection
Imports System.Runtime.CompilerServices
Namespace Fsolutions.Fbase.Common.Mail
Module MailUtility
<Extension()>
Sub Save(ByVal message As MailMessage, ByVal filename As String, ByVal Optional addUnsentHeader As Boolean = True)
Using filestream = File.Open(filename, FileMode.Create)
If addUnsentHeader Then
Dim binaryWriter = New BinaryWriter(filestream)
binaryWriter.Write(System.Text.Encoding.UTF8.GetBytes("X-Unsent: 1" & Environment.NewLine))
End If
Dim assembly = GetType(SmtpClient).Assembly
Dim mailWriterType = assembly.[GetType]("System.Net.Mail.MailWriter")
Dim mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, {GetType(Stream)}, Nothing)
Dim mailWriter = mailWriterContructor.Invoke(New Object() {filestream})
Dim sendMethod = GetType(MailMessage).GetMethod("Send", BindingFlags.Instance Or BindingFlags.NonPublic)
sendMethod.Invoke(message, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {mailWriter, True, True}, Nothing)
Dim closeMethod = mailWriter.[GetType]().GetMethod("Close", BindingFlags.Instance Or BindingFlags.NonPublic)
closeMethod.Invoke(mailWriter, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {}, Nothing)
End Using
End Sub
End Module
End Namespace