6

vCalendarとHTML本文部分を含むC#から送信したい電子メールがあります。

を作成し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部分の両方がWebメールに表示されますが、Outlookには表示されません。

このような2つの異なる部分を、異なるコンテンツタイプで表示するにはどうすればよいですか?私が探しているのは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

属性を次Attachmentのように設定して、VCALENDARをとして送信してみてください。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

Outlookの添付ファイルとしてvCalendear(* .vcs)またはiCalendar(* .ics)ファイルを送信して、それをどう処理するかを知る必要があると思います。

次に、受信者は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

私も同じ問題を抱えていました。

2つのAlternateViewをMailMessageに追加してみてください。1つはコンテンツタイプtext/calendar、icsファイル、もう1つはコンテンツタイプtext / html、メール本文です。

私のために働いた:)

于 2016-07-20T04:33:33.027 に答える
0

これらの提案はどれも私にはうまくいきません。

これまでのところ、最も近いのは、MIMEタイプとして「text/calendar」を使用してMemoryStreamをアタッチすることです。ただし、GMailは、.ICSファイルの概要を表示しないという意味でこのファイルを認識しません。また、「カレンダーに追加」することもできません。

ただし、GMailでまったく同じメールを自分(または他の人)に転送すると、GMailは.ICSコンテンツを表示します。私はここでさまざまなソリューションをテストしようと夢中になっています。

于 2014-09-23T09:47:19.323 に答える