【问题标题】:Sending email with image using C# and Outlook Interop vs copy paste image in email使用 C# 和 Outlook Interop 发送带有图像的电子邮件与在电子邮件中复制粘贴图像
【发布时间】:2018-03-18 00:19:03
【问题描述】:

我制作了小型 C# WFP 应用程序,该应用程序使用 C# 和 Outlook 互操作发送带有嵌入图像的电子邮件。与使用 CTRL+V 直接粘贴图像的手动创建的电子邮件相比,许多邮件客户端似乎对从此应用程序发送的电子邮件做出不同的反应。

我曾尝试使用 OutlookSpy 比较两封电子邮件,但我看不出任何可能导致电子邮件处理方式不同的差异。

Iphone 上的 Outlook 应用程序 收到从 C# 应用程序发送的电子邮件时,图像是空白的。当手动创建图像并使用 CTRL+V 粘贴图像时,它可以正常工作。

1) 如何确保从我的应用程序发送的电子邮件的处理方式与我在 Outlook 中手动创建电子邮件并使用 CTRL+V 复制图像时的处理方式相同? 如果我可以完成这项工作,那么应该可以使图像在 Outlook for Iphone 中正确显示。

2) 使用CTRL+V粘贴图片时outlook如何处理?它似乎使用了 Cid,与我在应用程序中使用的方式相同,但是如果没有附加它,它如何引用图像?

这是示例应用程序的代码:

    private void SendEmailButton_OnClick(object sender, RoutedEventArgs e)
    {
        SendMail();
    }

    public void SendMail()
    {
        var application = GetOutlookApplication();
        MailItem newMail = (MailItem)application.CreateItem(OlItemType.olMailItem);
        newMail.To = "!!!EnterValidEmailAddress!!!";
        newMail.Subject = "Image test";

        //Create image as embedded attachment
        Attachment attachment1 = newMail.Attachments.Add(@"C:/SomeImage1.png", OlAttachmentType.olByValue);
        string imageCid1 = "SomeImage_1";

        //The property Accessor to be able to refer to the image from Email HTML Body using CID
        attachment1.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001E", imageCid1);
        //Set property Accesor to hide attachment
        attachment1.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x7FFE000B", true);

        //Refer the attachment using cid
        newMail.HTMLBody = String.Format("<a href=\"{0}\"><img src=\"cid:{1}\"></a>", "google.dk", imageCid1);
        newMail.Save();
        newMail.Display();
    }

    public static OutlookApplication GetOutlookApplication()
    {
        // Start outlook process if it is not startet already
        if (!IsOutlookRunning())
        {
            using (Process p = new Process())
            {
                p.StartInfo.FileName = "OUTLOOK.EXE";
                p.Start();

                if (!p.WaitForInputIdle(10000))
                    Thread.Sleep(5000);
            }
        }

        // Start the outlook application (API)
        OutlookApplication oApp = null;
        if (Process.GetProcessesByName("OUTLOOK").Any())
        {
            try
            {
                oApp = Marshal.GetActiveObject("Outlook.Application") as OutlookApplication;

            }
            catch (System.Exception)
            {
                if (oApp == null)
                    oApp = new OutlookApplication();
            }
            return oApp;
        }
        oApp = new OutlookApplication();
        return oApp;


    }

    private static bool IsOutlookRunning()
    {
        Process[] p = Process.GetProcessesByName("Outlook");
        return p.Length != 0;
    }

【问题讨论】:

    标签: c# email outlook office-interop


    【解决方案1】:

    确保最终获得格式良好的 HTML 标记。以下代码行只是将&lt;a&gt; 标签添加到正文字符串的末尾:

    newMail.HTMLBody += String.Format("<a href=\"{0}\"><img src=\"cid:{1}\"></a>", "google.dk", imageCid1);
    

    相反,您需要在&lt;body&gt;&lt;/body&gt; 标记之间为图像找到合适的位置。

    【讨论】:

    • 感谢尤金的回复。这是一个很好的观点。不幸的是,它并没有解决问题。 :(
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2015-03-15
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2018-01-07
    相关资源
    最近更新 更多