예제 #1
0
        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;
            }
        }
예제 #2
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;
            }
        }
예제 #3
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);
        }