使用C#和Outlook Interop将图像发送到电子邮件与在电子邮件中复制粘贴图像

使用C#和Outlook Interop将图像发送到电子邮件与在电子邮件中复制粘贴图像

问题描述:

我制作了一个小型C#WFP应用程序,使用C#和Outlook Interop发送带有嵌入图像的电子邮件。看起来,许多邮件客户端反应不同,从这个应用程序发送的电子邮件相比,手动创建的电子邮件,其中图像直接粘贴使用CTRL + V。使用C#和Outlook Interop将图像发送到电子邮件与在电子邮件中复制粘贴图像

我试图用OutlookSpy比较这两封电子邮件,但是我看不到任何可能导致电子邮件处理方式不同的差异。

当通过Iphone上的Outlook应用程序接收到C#应用程序发送的电子邮件时,图像为空白。当手动创建图像并使用CTRL + V粘贴图像时,它工作得很好。

1)如何确保从我的应用程序发送的电子邮件的处理方式与在Outlook中手动创建电子邮件并使用CTRL + V复制图像时的处理方式相同? 如果我能做到这一点,那么应该可以在Outlook中为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; 
    } 

确保你得到一个结构良好的HTML标记最后。下面的代码行只是增加<a>标签体字符串的结尾:

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

相反,你需要找到的<body></body>标签之间的图像的正确的地方。

+0

谢谢你的回复尤金。这是一个好点。不幸的是,这并没有解决问题。 :( –