使用MailMessage的多部分电子邮件

时间:2013-01-02 18:51:43

标签: c# email mime-types content-type

我想要从C#发送一封电子邮件,其中包含vCalendar和HTML正文部分。

我创建了MailMessage,并设置了2个备用视图:

AlternateView avCal  = new AlternateView("VCALENDAR:...", null, "text/calendar");
AlternateView avHtml = new AlternateView("<p>some html</p>", null, "text/html");

mailMessage.AlternateViews.Add(avCal);
mailMessage.AlternateViews.Add(avHtml);

这会向我发送Content-Type multipart/alternative的消息。

这将在我的网络邮件上显示日历约会和HTML部分,但不显示Outlook。

如何使用不同的内容类型显示两个不同的部分?我正在寻找的更像是Content-Type: multipart/mixed,其中“替代视图”出现。

修改

当我使用@Chris Haas的方法时,我会接近,但标记不会呈现。它似乎忽略了MailMessage.IsBodyHtml = true

html not showing up

不确定如何在Outlook中查看原始内容但只是标题...

Return-Path: <*****@****.com>
X-Footer: ZWJyaWRnZS5jb20=
Received: from localhost ([127.0.0.1])
    by mail.foo.com
    for *****@****.com;
    Wed, 2 Jan 2013 17:20:14 -0500
MIME-Version: 1.0
From: "George Washington" <*****@****.com>
To: "George Washington" <*****@****.com>
Date: 2 Jan 2013 17:29:14 -0500
Subject: To-Do: test test - test
Content-Type: multipart/mixed; 
boundary=--boundary_0_4fbc08b4-2198-45b1-bf2e-9659179aad84

5 个答案:

答案 0 :(得分:3)

尝试将Attachment属性设置为Inline的{​​{1}}发送VCALENDAR:

true

修改

好的,我已将代码更新为不依赖于文件,因此我们使用完全相同的ICS文件。如果需要,更新顶部的字符串和using (MailMessage mm = new MailMessage("...", "...", "Subject here", "Body here")) //Pick whatever constructor you want { using (Attachment a = new Attachment("c:\\test.ics", "text/calendar")) //Either load from disk or use a MemoryStream bound to the bytes of a String { a.Name = "meeting.ics"; //Filename, possibly not required a.ContentDisposition.Inline = true; //Mark as inline mm.Attachments.Add(a); //Add it to the message using (SmtpClient s = new SmtpClient("...")) //Send using normal { s.Send(mm); } } } ,否则将完全保留原样。 ICS来自this page的中间。

SmtpClient

答案 1 :(得分:2)

我相信您必须将您的vCalendear(* .vcs)或iCalendar(* .ics)文件作为Outlook的附件发送,以了解如何处理它。

然后,收件人需要在Outlook中打开电子邮件,然后双击附件将其导入Outlook / Exchange日历。

答案 2 :(得分:1)

我有同样的问题;我无法在不显示标签的情况下获得显示HTML的邀请。我能用类似的东西解决问题(变量f包含所有“BEGIN:VCALENDAR”的东西):

System.Net.Mime.ContentType calendarType = new System.Net.Mime.ContentType("text/calendar");
AlternateView ICSview = AlternateView.CreateAlternateViewFromString(f.ToString(), calendarType);
AlternateView HTMLV = AlternateView.CreateAlternateViewFromString(body, new System.Net.Mime.ContentType("text/html"));
MailMessage email = new MailMessage("from@example.com", "to@example.com", "subject", "body");
email.AlternateViews.Add(ICSview);
email.AlternateViews.Add(HTMLV);
SmtpClient client = new SmtpClient();
client.Send(email);

我确信代码可以整理......

答案 3 :(得分:1)

我遇到了同样的问题。

尝试将两个AlternateViews添加到MailMessage,一个包含内容类型文本/日历,一个包含ics文件,一个包含内容类型text / html,包含电子邮件正文。

为我工作:)

答案 4 :(得分:0)

这些建议都不适合我。

最近,我到目前为止已经使用&#34; text / calendar&#34;附加了一个MemoryStream。作为MIME类型。 但是,GMail无法识别此文件,因为它不显示.ICS文件中的摘要,也不允许我“添加到日历”。

但是,当我向GMail上的同事(或其他人)转发完全相同的电子邮件时,GMail会显示.ICS内容。我在这里试图测试不同的解决方案。