使用 C# 和 Outlook Interop 发送带有图像的电子邮件与在电子邮件中复制粘贴图像
Sending email with image using C# and Outlook Interop vs copy paste image in email
我制作了小型 C# WFP 应用程序,它使用 C# 和 Outlook Interop 发送带有嵌入式图像的电子邮件。与使用 CTRL+V 直接粘贴图像的手动创建的电子邮件相比,似乎许多邮件客户端对此应用程序发送的电子邮件的反应不同。
我曾尝试使用 OutlookSpy 比较这两封电子邮件,但我看不出任何可能导致电子邮件处理方式不同的差异。
在 Iphone 上的 Outlook 应用程序中收到从 C# 应用程序发送的电子邮件时,图像为空白。当手动创建图像并使用 CTRL+V 粘贴图像时,它工作得很好。
1) 如何确保从我的应用程序发送的电子邮件的处理方式与我在 Outlook 中手动创建电子邮件并使用 CTRL+V 复制图像时的处理方式相同?
如果我可以完成这项工作,那么应该可以使 Iphone.
的图像在 Outlook 中正确显示
2) CTRL+V 粘贴图片时,outlook 是如何处理的?好像是用了Cid,和我的application一样,但是如果没有附上图片怎么引用呢?
这是示例应用程序的代码:
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>
标签之间为图像找到合适的位置。
我制作了小型 C# WFP 应用程序,它使用 C# 和 Outlook Interop 发送带有嵌入式图像的电子邮件。与使用 CTRL+V 直接粘贴图像的手动创建的电子邮件相比,似乎许多邮件客户端对此应用程序发送的电子邮件的反应不同。
我曾尝试使用 OutlookSpy 比较这两封电子邮件,但我看不出任何可能导致电子邮件处理方式不同的差异。
在 Iphone 上的 Outlook 应用程序中收到从 C# 应用程序发送的电子邮件时,图像为空白。当手动创建图像并使用 CTRL+V 粘贴图像时,它工作得很好。
1) 如何确保从我的应用程序发送的电子邮件的处理方式与我在 Outlook 中手动创建电子邮件并使用 CTRL+V 复制图像时的处理方式相同? 如果我可以完成这项工作,那么应该可以使 Iphone.
的图像在 Outlook 中正确显示2) CTRL+V 粘贴图片时,outlook 是如何处理的?好像是用了Cid,和我的application一样,但是如果没有附上图片怎么引用呢?
这是示例应用程序的代码:
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>
标签之间为图像找到合适的位置。