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);
        }
Пример #2
0
        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;
 }
Пример #4
0
        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;
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
        }
Пример #8
0
        /// <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);
            }
        }