private static void FreeMapiMessage(NativeMethods.MapiMessage msg) { if (msg.lpszSubject != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpszSubject); msg.lpszSubject = IntPtr.Zero; } if (msg.lpszNoteText != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpszNoteText); msg.lpszNoteText = IntPtr.Zero; } if (msg.lpFiles != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpFiles); msg.lpFiles = IntPtr.Zero; msg.nFileCount = 0; } if (msg.lpRecips != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpRecips); msg.lpRecips = IntPtr.Zero; msg.nRecipCount = 0; } }
static void FreeMapiMessage(NativeMethods.MapiMessage msg) { if (msg.lpFiles != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpFiles); msg.lpFiles = IntPtr.Zero; msg.nFileCount = 0; } if (msg.lpRecips != IntPtr.Zero) { Marshal.FreeHGlobal(msg.lpRecips); msg.lpRecips = IntPtr.Zero; msg.nRecipCount = 0; } }
private static void ShowComposeNewEmailImpl(EmailMessage message) { bool useAnsi = global::System.Environment.OSVersion.Version < new Version(6, 2); int recipCount = message.To.Count + message.CC.Count + message.Bcc.Count; NativeMethods.MapiMessage msg = new NativeMethods.MapiMessage(); if (useAnsi) { if (!string.IsNullOrEmpty(message.Subject)) { msg.lpszSubject = Marshal.StringToHGlobalAnsi(message.Subject); } if (!string.IsNullOrEmpty(message.Body)) { msg.lpszNoteText = Marshal.StringToHGlobalAnsi(message.Body); } } else { if (!string.IsNullOrEmpty(message.Subject)) { msg.lpszSubject = Marshal.StringToHGlobalUni(message.Subject); } if (!string.IsNullOrEmpty(message.Body)) { msg.lpszNoteText = Marshal.StringToHGlobalUni(message.Body); } } // recipients if (recipCount > 0) { int recipdesclen = Marshal.SizeOf <NativeMethods.MapiRecipDesc>(); msg.lpRecips = Marshal.AllocHGlobal(recipdesclen * recipCount); msg.nRecipCount = recipCount; int currentRecip = 0; foreach (EmailRecipient r in message.To) { if (useAnsi) { var rd = new NativeMethods.MapiRecipDesc(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_TO); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } else { var rd = new NativeMethods.MapiRecipDescW(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_TO); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } currentRecip++; } foreach (EmailRecipient r in message.CC) { if (useAnsi) { var rd = new NativeMethods.MapiRecipDesc(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_CC); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } else { var rd = new NativeMethods.MapiRecipDescW(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_CC); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } currentRecip++; } foreach (EmailRecipient r in message.Bcc) { if (useAnsi) { var rd = new NativeMethods.MapiRecipDesc(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_BCC); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } else { var rd = new NativeMethods.MapiRecipDescW(r.Address, r.Name, NativeMethods.RecipientClass.MAPI_BCC); Marshal.StructureToPtr(rd, IntPtr.Add(msg.lpRecips, recipdesclen * currentRecip), false); } currentRecip++; } } // attachments if (message.Attachments.Count > 0) { int fileDescLen = Marshal.SizeOf <NativeMethods.MapiFileDesc>(); msg.lpFiles = Marshal.AllocHGlobal(fileDescLen * message.Attachments.Count); msg.nFileCount = message.Attachments.Count; for (int i = 0; i < message.Attachments.Count; i++) { if (useAnsi) { NativeMethods.MapiFileDesc f = new Email.EmailManager.NativeMethods.MapiFileDesc(message.Attachments[i].Data.Path, message.Attachments[i].FileName); Marshal.StructureToPtr(f, IntPtr.Add(msg.lpFiles, fileDescLen * i), false); } else { NativeMethods.MapiFileDescW f = new Email.EmailManager.NativeMethods.MapiFileDescW(message.Attachments[i].Data.Path, message.Attachments[i].FileName); Marshal.StructureToPtr(f, IntPtr.Add(msg.lpFiles, fileDescLen * i), false); } } } if (useAnsi) { uint result = NativeMethods.MAPISendMail(IntPtr.Zero, IntPtr.Zero, ref msg, 0xd, 0); } else { uint result = NativeMethods.MAPISendMailW(IntPtr.Zero, IntPtr.Zero, ref msg, 0xd, 0); } FreeMapiMessage(msg); }