ICalendar標準を使用して、MicrosoftOutlookカレンダーにイベントを作成しようとしています。コンテンツタイプが「text/calendar」のメールを.NETアプリケーションからExchangeメールボックスに送信しました。会議出席依頼としてOutlookに届きます。受信した会議出席依頼をクリックするまで、Outlookはそれを空のカレンダービューとして次のテキストとともに表示します:「会議はカレンダーに見つかりません」。理由がわかりません–イベントを作成したかったのですが、既存のものを見つけようとしていますか?
主催者以外の会議の参加者にまったく同じメールを送信すると、カレンダーにイベントが作成され、すべて問題がないように見えます。 「ORGANIZER」プロパティが原因であることがわかりました。主催者のメールアドレス(自分のメールアドレス)に設定されていて、自分に会議出席依頼を送信した場合、「カレンダーに会議が見つかりません」という情報でイベントが作成されません。
では、なぜ主催者向けのイベントが作成されないのでしょうか。主催者は、他の参加者が会議を承認またはキャンセルした場合に通知されるように、そのイベントを作成する必要があります。
これがiCalendarです。
BEGIN:VCALENDAR
PRODID:-//Company//Product 3.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20130225T200000Z
DTEND:20130225T203000Z
DTSTAMP:20130225T143039Z
ORGANIZER;CN="John Doe":mailto:[email protected]
UID:[email protected]
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;RSVP=TRUE;CN="John Smith"
;X-NUM-GUESTS=0:mailto:[email protected]
CLASS:PUBLIC
CREATED:20130225T143039Z
DESCRIPTION:
LAST-MODIFIED:20130225T143039Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:Booking test
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR
主催者が2人の参加者のための会議を作成したいとします。彼は予約システムのフォームに記入します。予約システムは、iCalendar標準を含む電子メールを自分自身と2人の会議出席者に送信します。
このシナリオは機能しません。
主催者のカレンダーでイベント(キャンセル可能な会議オブジェクト)を作成することはできません。クライアントは、iCalendar形式を含む電子メールは、主催者カレンダーですでに作成されている会議の出席者への単なる通知であると考えています。そのようなメールが主催者のメールボックスに届いた場合、クライアントアプリは主催者のカレンダーにイベントを作成しません。イベントは主催者自身が作成したものと想定しています。例:Outlookは、その場合、「会議がカレンダーに見つかりません」と通知します。
それについてマイクロソフトのサポートに尋ねると、彼らはオープンスタンダードをサポートしていないとだけ言っています: http://support.Microsoft.com/kb/2269506
この問題の実用的な解決策は、プラットフォームサービス( Exchange Webサービス または GoogleカレンダーAPI )を使用して、主催者のカレンダーにイベントを作成することです。 iCalendar標準を忘れてください。サービスは、出席者に通知を自動的に送信するように構成できます。したがって、EWSを使用している場合は、「SendInvitationsMode.SendToAllAndSaveCopy」を渡すだけで十分です。
Appointment appointment = new Appointment(service);
appointment.Subject = "Status Meeting";
appointment.Body = "The purpose of this meeting is to discuss status.";
appointment.Start = new DateTime(2014, 3, 1, 9, 0, 0);
appointment.End = appointment.Start.AddHours(2);
appointment.Location = "Conf Room";
appointment.RequiredAttendees.Add("[email protected]");
appointment.RequiredAttendees.Add("[email protected]");
appointment.OptionalAttendees.Add("[email protected]");
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
または、Google Calendar APIの場合は、「sendNotifications」パラメータをtrueに設定します。
特定の参加者全員にメールを送信する必要はありません。
これは少し古い問題ですが、METHOD:REQUESTを使用したことが原因だと思います。これは、新しいアイテムではなく、icalを更新する必要があることを示しています。代わりに、METHOD:PUBLISHを使用してください
これがDDay.iCalおよびOutlookカレンダーで機能することを確認できます。
これは私を一週間怒らせたので、他の誰かが私が疑ったことを確認するのを見るのはうれしいです。あまりエレガントではありませんが、実際には比較的単純な解決策があり、問題を解決します。外部からオーガナイザーの役割を果たせない理由は理解できますが、できないのは面倒です。
2つの招待状を送信します。 1つは自分自身(または主催者は誰でも)に、次に別の1つは他のすべての人に。
あなた自身のものは、オーガナイザーとしてあなた以外の何かを持っている必要があります。主催者:[email protected]
他のすべての人への1つは、主催者としてあなたの電子メールをダウンさせる必要があります。
このアプローチを機能させるには、METHOD:REQUESTを設定する必要があります。 PUBLISHに設定すると、更新時に重複が発生します。
このアプローチは、会議を日記に入れ、返信も受け取ることを意味します(返信を受け取るには、出席者ごとに次の行を含める必要があります:ATTENDEE; CN = "The Name"; RSVP = TRUE:mailto:[email protected] 。)
UIDはファイルの両方のバージョンで同じであることに注意してください。主催者が最初に招待を取得して、返信を受け取る前にそれを受け入れることができるようにすると役立ちます。そうしないと、効果的にまだ存在していないものに返信することになります。それは彼らが招待を受け入れるのを止めることはありませんが、それは主催者にとって少し混乱するかもしれません。これを支援するために、私は電子メール1と2の間にわずかな遅延を入れました。
ここ数ヶ月、私たちのサービスもあなたと同じ問題に直面しています:私たちのサービスは主催者と出席者のための会議カレンダーを作成します、出席者が主催者を含む場合、主催者(アテネディーとして)はカレンダーの電子メールを受け取ることができますが、どちらも受信することはできません/会議を拒否する(ボタンが無効になっている)か、カレンダーに表示されない(カレンダーイベントがない)。
最後に、次の条件下でのみこれが発生することに気付きました。1。mail.From = Organizer 2. Ateendees.contains(organizer)//大文字と小文字を区別しません。
したがって、コードを次のように変更するだけで、すべての参加者(主催者を含む)に対して正常に機能します。
if (!attendeeEmail.ToLower().Contains(organizer.Address.ToLower()))
{
message.From = organizer;
}
else
{
//such as your actual email sender, in our case, our mail sender use another email,
//say ActualSender,and if leave empty, then our mail sender will fill as:
message.From = ActualSenderEmail;
}
電子メールで送信されるイベント招待の動作は、icalendar RFC(RFC5545)をさらに拡張するrfc6047で説明されています。
セクション2 および セクション セキュリティについて、2つのなりすましの脅威を要約します。
「主催者」のなりすまし、「参加者」のなりすまし
あれは
[email protected]は、a @ example.comが主催した会議を変更またはキャンセルすることはできません。
あなたのケースに:1。あなたはあなたの交換と同じ電子メールアドレスから招待状を送りましたか(メールのFrom:
について話しますかOrganizer:mailto
ではありませんか?そうでなければそれを経由して送ることを試みる価値があるかもしれません交換アドレス。2。上記が機能しない場合、主催者がカレンダーに招待状を含める必要性に対処するには、CUA(カレンダーユーザーエージェント)またはCUA(カレンダーユーザーエージェント)である可能性が高いため、主催者のアジェンダにプログラムで追加する必要があります。 Exchangeでは、サードパーティのメーラーがエンドユーザーのUIを使用せずにアジェンダにイベントを追加することはできません。
あなたの問題は、Exchangeがイベントの主催者がイベントの発信者でもあると想定しているためだと思います。それは十分に公平に思えます。そうでなければ、会議を主催者にする人々に会議を送るのは子供の遊びであり、彼らはその人のカレンダーに自動的に追加されます。
とはいえ、問題を回避する方法がわかりません。