6

我有一封要从 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-Typeof的消息multipart/alternative

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

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

编辑

当我使用@Chris Haas 的方法时,我很接近但没有呈现标记。好像无视MailMessage.IsBodyHtml = true

html不显示

不太确定如何在 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
4

5 回答 5

6

尝试将 VCALENDAR 作为属性设置Attachment为:Inlinetrue

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 文件。更新顶部的字符串和SmtpClient必要时的字符串,否则保持代码不变。ICS 来自本页的中间。

  String mailFrom = "xyz@example.com";
  String mailTo = "xyz@example.com";
  String mailSubject = "This is a test";
  String mailBody = "<p><strong>Hello</strong> world</p>";
  String smtpServer = "mail.example.com";

  using (var mm = new MailMessage()) //Pick whatever constructor you want
  {
      mm.To.Add(mailFrom);
      mm.From = new MailAddress(mailTo);
      mm.Subject = mailSubject;
      mm.Body = mailBody;
      mm.IsBodyHtml = true;
      String t = "BEGIN:VCALENDAR\r\n" +
                 "METHOD:REQUEST\r\n" +
                 "BEGIN:VEVENT\r\n" +
                 "DTSTAMP:20080325T202857Z\r\n" +
                 "DTSTART:20080325T200000Z\r\n" +
                 "DTEND:20080325T220000Z\r\n" +
                 "SUMMARY:Test meeting request\r\n" +
                 "UID:040000008200E00074C5B7101A82E00800000000B2BB07349575C80100000000000000001000000019BF8D0149C50643A81325C54140C093\r\n" +
                 "ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=\"Dan\":MAIL\r\n" +
                 " TO:myuser@mydom.com\r\n" +
                 "ORGANIZER;CN=\"Administrator\":MAILTO:administrator@mydom.com\r\n" +
                 "LOCATION: Here\r\n" +
                 "DESCRIPTION:Test Request\r\n" +
                 "SEQUENCE:0\r\n" +
                 "PRIORITY:5\r\n" +
                 "CLASS:\r\n" +
                 "CREATED:20080321T190958Z\r\n" +
                 "STATUS:CONFIRMED\r\n" +
                 "TRANSP:OPAQUE\r\n" +
                 "END:VEVENT\r\n" +
                 "END:VCALENDAR";
      Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(t);
      using (var ms = new System.IO.MemoryStream(bytes))
      {
          using (var a = new Attachment(ms, "meeting.ics", "text/calendar")) //Either load from disk or use a MemoryStream bound to the bytes of a String
          {
              a.ContentDisposition.Inline = true;             //Mark as inline
              mm.Attachments.Add(a);                          //Add it to the message
              using (SmtpClient s = new SmtpClient(smtpServer))    //Send using normal
              {
                  s.Send(mm);
              }
          }
      }

  }
于 2013-01-02T20:18:03.607 回答
2

我相信您必须将 vCalendar (*.vcs) 或 iCalendar (*.ics) 文件作为附件发送,以便 Outlook 知道如何处理它。

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

于 2013-01-02T19:15:27.733 回答
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);

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

于 2013-04-22T16:12:08.157 回答
1

我有同样的问题。

尝试向 MailMessage 添加两个 AlternateView,一个具有内容类型文本/日历,具有 ics 文件,一个具有内容类型文本/html,具有电子邮件正文。

为我工作:)

于 2016-07-20T04:33:33.027 回答
0

这些建议都不适合我。

到目前为止,我最接近的是附加一个带有“文本/日历”作为 MIME 类型的 MemoryStream。但是,GMail 无法识别此文件,因为它不显示 .ICS 文件中的摘要,也不允许我“添加到日历”。

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

于 2014-09-23T09:47:19.323 回答