IntPtr GetAttachments(out int fileCount) { fileCount = 0; if (m_attachments == null) { return(IntPtr.Zero); } if ((m_attachments.Count <= 0) || (m_attachments.Count > maxAttachments)) { return(IntPtr.Zero); } int size = Marshal.SizeOf(typeof(MapiFileDesc)); IntPtr intPtr = Marshal.AllocHGlobal(m_attachments.Count * size); MapiFileDesc mapiFileDesc = new MapiFileDesc(); mapiFileDesc.position = -1; int ptr = (int)intPtr; foreach (string strAttachment in m_attachments) { mapiFileDesc.name = Path.GetFileName(strAttachment); mapiFileDesc.path = strAttachment; Marshal.StructureToPtr(mapiFileDesc, (IntPtr)ptr, false); ptr += size; } fileCount = m_attachments.Count; return(intPtr); }
private IntPtr AllocAttachs(string[] attachs) { if (attachs == null) { return(IntPtr.Zero); } Type atype = typeof(MapiFileDesc); int asize = Marshal.SizeOf(atype); IntPtr ptra = Marshal.AllocHGlobal(attachs.Length * asize); MapiFileDesc mfd = new MapiFileDesc(); mfd.position = -1; int runptr = (int)ptra; for (int i = 0; i < attachs.Length; i++) { string path = attachs[i] as string; mfd.name = Path.GetFileName(path); mfd.path = path; Marshal.StructureToPtr(mfd, (IntPtr)runptr, false); runptr += asize; } return(ptra); }
public MapiFileDesc GetMapiFileDesc() { var mapiFileDesc = new MapiFileDesc(); mapiFileDesc.Position = -1; mapiFileDesc.Path = _attachmentFilePath; mapiFileDesc.Name = Path.GetFileName(_attachmentFilePath); return mapiFileDesc; }
private static IntPtr GetAttachmentsData (List<string> attachments) { if (attachments.Count == 0) return IntPtr.Zero; IntPtr ptr = Native.AllocHGlobalArray<MapiFileDesc>(attachments.Count), iptr = ptr; var attachment = new MapiFileDesc { position = -1 }; foreach (string fileName in attachments) { attachment.name = Path.GetFileName(fileName); attachment.path = fileName; Native.StructureToPtrInc(attachment, ref iptr); } return ptr; }
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); }
private static IntPtr GetAttachmentsData(List <string> attachments) { if (attachments.Count == 0) { return(IntPtr.Zero); } IntPtr ptr = Native.AllocHGlobalArray <MapiFileDesc>(attachments.Count), iptr = ptr; var attachment = new MapiFileDesc { position = -1 }; foreach (string fileName in attachments) { attachment.name = Path.GetFileName(fileName); attachment.path = fileName; Native.StructureToPtrInc(attachment, ref iptr); } return(ptr); }
IntPtr GetAttachments(out int fileCount) { fileCount = 0; if (m_attachments == null) return IntPtr.Zero; if ((m_attachments.Count <= 0) || (m_attachments.Count > maxAttachments)) return IntPtr.Zero; int size = Marshal.SizeOf(typeof(MapiFileDesc)); IntPtr intPtr = Marshal.AllocHGlobal(m_attachments.Count * size); MapiFileDesc mapiFileDesc = new MapiFileDesc(); mapiFileDesc.position = -1; int ptr = (int)intPtr; foreach (string strAttachment in m_attachments) { mapiFileDesc.name = Path.GetFileName(strAttachment); mapiFileDesc.path = strAttachment; Marshal.StructureToPtr(mapiFileDesc, (IntPtr)ptr, false); ptr += size; } fileCount = m_attachments.Count; return intPtr; }
/// <summary> /// Creates and sends an e-mail message using the Simple MAPI protocol.</summary> /// <param name="subject"> /// The subject line of the e-mail message.</param> /// <param name="noteText"> /// The text of the e-mail message.</param> /// <param name="recipients"> /// An <see cref="Array"/> of <see cref="MapiAddress"/> instances holding the display names /// and SMTP addresses of all message recipients. The protocol identifier "smtp:" is /// automatically prepended to any non-empty addresses without this prefix.</param> /// <param name="attachments"> /// An <see cref="Array"/> of <see cref="MapiAddress"/> instances holding the display names /// and fully qualified local file paths of any attachment files sent to the <paramref /// name="recipients"/>.</param> /// <exception cref="MapiException"> /// <see cref="Mapi.MAPISendMail"/> indicated an error.</exception> /// <remarks><para> /// <b>SendMail</b> creates and sends an e-mail message with optional file attachments, /// using the Win32 API call <see cref="Mapi.MAPISendMail"/> which is part of the Simple /// MAPI protocol. The originator is left undefined which will cause Simple MAPI to assert /// the user’s default e-mail account as the originator. /// </para><para> /// The <paramref name="subject"/> and <paramref name="noteText"/> parameters may be a null /// reference or an empty string to leave the corresponding field blank. The <paramref /// name="recipients"/> and <paramref name="attachments"/> parameters may be null references /// or empty arrays to create a message without recipients or file attachments, /// respectively. /// </para><para> /// The e-mail message is presented to the user who can choose to edit (filling in any blank /// fields or adding text as desired), send, or cancel the message. User cancellation /// generates a <see cref="MapiException"/> whose <see cref="MapiException.Code"/> is <see /// cref="MapiException.Abort"/>.</para></remarks> public static void SendMail(string subject, string noteText, MapiAddress[] recipients, MapiAddress[] attachments) { // remember current working directory string currentDir = Directory.GetCurrentDirectory(); // construct MAPI message descriptor MapiMessage message = new MapiMessage(); message.lpszSubject = subject; message.lpszNoteText = noteText; try { // create any specified recipients if (recipients != null && recipients.Length > 0) { // store count of recipient descriptors int count = recipients.Length; message.nRecipCount = (uint)count; // allocate memory for recipient descriptors int size = Marshal.SizeOf(typeof(MapiRecipDesc)); message.lpRecips.AllocateHandle(count * size); // construct recipient descriptors MapiRecipDesc recip = new MapiRecipDesc(); for (int i = 0; i < count; i++) { // prepend "smtp:" to address if not present string address = recipients[i].Address; if (!String.IsNullOrEmpty(address) && !address.StartsWith("smtp:", StringComparison.OrdinalIgnoreCase)) { address = "smtp:" + address; } // create MAPI recipient descriptor recip.ulRecipClass = MapiRecipClass.MAPI_TO; recip.lpszName = recipients[i].Name; recip.lpszAddress = address; // copy recipient descriptor to unmanaged memory message.lpRecips.SetMemory(recip, i * size, false); } } // create any specified attachments if (attachments != null && attachments.Length > 0) { // store count of attachment descriptors int count = attachments.Length; message.nFileCount = (uint)count; // allocate memory for attachment descriptors int size = Marshal.SizeOf(typeof(MapiFileDesc)); message.lpFiles.AllocateHandle(count * size); // construct attachment descriptors MapiFileDesc fileDesc = new MapiFileDesc(); for (int i = 0; i < count; i++) { // create MAPI file attachment descriptor fileDesc.lpszFileName = attachments[i].Name; fileDesc.lpszPathName = attachments[i].Address; fileDesc.nPosition = 0xffffffff; // don’t embed files // copy attachment descriptor to unmanaged memory message.lpFiles.SetMemory(fileDesc, i * size, false); } } // invoke MAPISendMail to deliver this message MapiFlags flags = MapiFlags.MAPI_DIALOG | MapiFlags.MAPI_LOGON_UI; MapiError code = Mapi.MAPISendMail(UIntPtr.Zero, UIntPtr.Zero, message, flags, 0); // throw exception if MAPI reports failure if (code != MapiError.SUCCESS_SUCCESS) { ThrowMapiException(code); } } finally { // release unmanaged memory blocks message.Dispose(); // restore original working directory Directory.SetCurrentDirectory(currentDir); } }