MAPISendMail

C# Signature:

/// <summary>
  /// The MAPISendMail function sends a message.
  /// 
  /// This function differs from the MAPISendDocuments function in that it allows greater 
  /// flexibility in message generation.
  /// </summary>
  [DllImport("MAPI32.DLL", CharSet=CharSet.Ansi)]
  public static extern uint MAPISendMail(IntPtr lhSession, IntPtr ulUIParam, 
    MapiMessage lpMessage, uint flFlags, uint ulReserved);

VB Signature:

<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

Sample Code:

[DllImport("MAPI32.DLL")]
    static extern int MAPISendMail(IntPtr sess, IntPtr hwnd, MapiMessage message, int flg, int rsv);

    public int SendMail(string fileName)
    {
        MapiMessage msg = new MapiMessage();
        msg.subject = "Hello World!";
        msg.noteText = "See attached file for details";
        msg.files = GetAttachments(fileName, out msg.fileCount);

        int result = MAPISendMail(new IntPtr(0), new IntPtr(0), msg, 0x00000001 | 0x00000008, 0);
        if (result > 1 || result < 0)
        throw new System.InvalidOperationException();
        return result;
    }

    IntPtr GetAttachments(string fileName, out int fileCount)
    {
        int size = Marshal.SizeOf(typeof(MapiFileDesc));
        IntPtr intPtr = Marshal.AllocHGlobal(size);

        MapiFileDesc mapiFileDesc = new MapiFileDesc();
        //An integer used to indicate where in the message text to render the attachment. 
        mapiFileDesc.position = -1;
        int ptr = (int)intPtr;

        mapiFileDesc.name = Path.GetFileName(fileName);
        mapiFileDesc.path = fileName;
        Marshal.StructureToPtr(mapiFileDesc, (IntPtr)ptr, false);
        ptr += size;

        fileCount = 1;
        return intPtr;
    }
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class MapiMessage
    {
    public int reserved;
    public string subject;
    public string noteText;
    public string messageType;
    public string dateReceived;
    public string conversationID;
    public int flags;
    public IntPtr originator;
    public int recipCount;
    public IntPtr recips;
    public int fileCount;
    public IntPtr files;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class MapiFileDesc
    {
    public int reserved;
    public int flags;
    public int position;
    public string path;
    public string name;
    public IntPtr type;
    }

Última actualización