web-dev-qa-db-ja.com

OutlookなしでOutlook会議出席依頼を送信しますか?

OutlookをサーバーにインストールせずにCOM相互運用機能を使用せずに会議出席依頼を送信できるかどうかは疑問です(サーバー上ではどうしても避けたい)。

Windows 2003ドメインにExchange 2003があり、すべてのユーザーはドメインユーザーです。ラウンドiCal/vCalなどを送信できると思いますが、Outlookを使用せずにExchange経由で会議出席依頼を送信するための適切な標準的な方法があるのでしょうか?

重要な場合、これはC#/。netです。

37
Michael Stum

Outlookに会議出席依頼を送信する(および認識させる)方法は次のとおりです。

  • iCalendarファイルを準備します。Outlookで必要になるため、これらの追加プロパティを必ず設定してください。
  • multipart/alternativeメールを準備します:
    • パート1:text/html(または好きなもの)-これは「通常の」メールリーダーに表示されるか、フォールバックとして表示され、人間が読める形式でイベントの概要が含まれます
    • パート2:text/calendar; method=REQUEST、icsファイルの内容を保持します(ヘッダーmethodパラメーターは、icsのメソッドと一致する必要があります)。正しいテキストエンコーディングに注意してください。charsetヘッダーパラメーターを宣言しても問題はありません。
    • パート3:オプションで、.icsファイル自体を添付して、通常のメールリーダーがユーザーにクリックするものを提供できるようにします。 Outlookは、text/calendar部分を読み取るだけなので、実際には添付ファイルを必要としません。
  • Outlookユーザーにメールを送信します。すべてが適切であれば、メールは会議出席依頼として表示され、出席ボタンと、承認時にユーザーカレンダーに自動的に入力されます。
  • 応答を処理するものをセットアップします(会議の開催者に送信されます)。イベントが開催者のカレンダーに存在しないため、Exchangeメールボックスを使用する自動出席者追跡を取得できませんでした。 Outlookは、期待どおりのUIDとシーケンスを必要としますが、UIDを使用してこれを構成してもほとんど機能しません。

Icsファイル形式の詳細と特性に関するヘルプについては、 iCalendar Specification Excerpts by Kanzaki Masahide にアクセスしてください。それらは暗闇の中の光であり、 RFC 2445 を通り抜けるよりもずっと良い。しかし、再び、.NET用の便利なライブラリが存在する可能性があります。

49
Tomalak

SourceforgeのDDay.iCal C#ライブラリを参照してください。
http://sourceforge.net/projects/dday-ical/

次に、このcodeprojectの記事を読んでください。
http://www.codeproject.com/Articles/17980/Adding-iCalendar-Support-to-Your-Program-Part-1

そしてこれを読んでください:
C#を含むイベントをiCalendarおよびvCalendar形式にエクスポート

8
Stefan Steiger

iCalendarは優れた汎用ソリューションであり、DDay.iCalライブラリは.NETからこれを行うための優れた方法ですが、 Exchange Webサービス (EWS)は、元の質問(Exchange、C#/。NET)。

また、C#などの.NET言語を使用している場合は、 EWS Managed API ラッパーを使用する必要があります。これにより、EWSでの作業が大幅に簡素化されます。

ドキュメント から、EWSマネージAPIを使用して会議を作成し、招待者にリクエストを送信する方法を次に示します。

// Create the appointment.
Appointment appointment = new Appointment(service);

// Set properties on the appointment. Add two required attendees and one optional attendee.
appointment.Subject = "Status Meeting";
appointment.Body = "The purpose of this meeting is to discuss status.";
appointment.Start = new DateTime(2009, 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]");

// Send the meeting request to all attendees and save a copy in the Sent Items folder.
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
5
Oran Dennison

以下のコードは、Outlookが承諾/辞退ボタンを表示するような方法で会議出席依頼を送信します。

UIDは会議ごとに一意である必要があることに注意してください。GUIDを使用しました。

また、CREATED、DTSTART、DTEND、DTSTAMP、LAST-MODIFIEDを置き換える必要があることに注意してください。これらはUTCの日付/時刻です。

    var m = new MailMessage();

    m.Subject = "Meeting";

    m.Body = "";

    string iCal = 
@"BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
CREATED:20140423T045933Z
DESCRIPTION:desc
DTEND:20140430T080000Z
DTSTAMP:20140423T045933Z
DTSTART:20140430T060000Z
LAST-MODIFIED:20140423T045933Z
LOCATION:location...
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=en-us:Summary...
TRANSP:OPAQUE
UID:D8BFD357-88A7-455C-86BC-C2CECA9AC5C6
X-Microsoft-CDO-BUSYSTATUS:BUSY
X-Microsoft-CDO-IMPORTANCE:1
X-Microsoft-DISALLOW-COUNTER:FALSE
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
BEGIN:VALARM
TRIGGER:-PT60M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR";

    using (var iCalView = AlternateView.CreateAlternateViewFromString(iCal, new System.Net.Mime.ContentType("text/calendar")))
    {
        m.AlternateViews.Add(iCalView);

        var c = new SmtpClient();

        // Send message
        c.Send(m);
    }

これは、構成ファイルでローカルSMTPサーバーが構成されていることを前提としています。

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="[email protected]">
        <network defaultCredentials="true" Host="smtp.example.local" />
      </smtp>
    </mailSettings>
  </system.net>
4
saille

iCal Standard(RFC 5545) を使用して、Outlookに会議出席依頼をメールで送信できます。

この方法でtodoアイテムを送信することはできません。 「予定」を送信できますが、これらはOutlookで.ics添付ファイルとして表示され、「盲目的に」受け入れられる必要があります。

会議出席依頼はOutlookに素敵なプレビューで表示され、受け入れたり、取り消したりすることができます。送信プログラムは、送信後に会議を変更またはキャンセルする場合があります。

DDay.iCal .Net Library で有効なiCalアイテムを作成するのは簡単です

以下のコードは完全な作業例です。有効なiCal会議出席依頼を含む文字列を作成し、メールで送信します。

このコードは次のメールを作成します:

  • 単純なメールクライアントのプレーンテキスト本文
  • 最新のメールクライアントで表示するためのHTML本文
  • alternateViewとしてのiCal会議出席依頼(Outlookに表示されます)
  • 添付ファイルとしてのiCal会議出席依頼(Outlook以外のメールクライアントで使用可能)

コードは追加する方法を示します。

  • 説明テキストをHTMLとして、Outlookでより見やすく
  • 優先度、可視性(パブリック/プライベート/機密)
  • オプションのオーガナイザー(メール送信者の代わりにOutlookに表示されます)
  • オプションの出席者
  • オプションのアラーム
  • 会議へのオプションの添付ファイル。 Outlookのカレンダーに表示されます

いくつかの重要な詳細:

  • outlookでこれを機能させるには、メール送信者(またはオプションのオーガナイザー)とメール受信者が異なる必要があります
  • .icsのMETHODとMime.ContentTypeのMETHODは一致する必要があります
  • この会議がOutlookで機能するようにするには、会議が将来嘘をつかなければなりません。
  • .ics部分は、MIMEメールの最後のalternateView部分でなければなりません

Outlookが.icsファイルを解釈する方法に関する正確な詳細は、 [MS-OXCICAL]:iCalendarからAppointmentオブジェクトへの変換アルゴリズム

これらのアセンブリを使用します。

using System;
using System.IO;
using System.Net.Mail;
using DDay.iCal;
using DDay.iCal.Serialization.iCalendar;

DDay.iCalの場合、 DDay.iCalバイナリファイル をダウンロードするのに十分です。いくつかの機能を追加したい場合は、ドキュメントが古く、ソースにはすべての機能を実行するかなり完全なテストが含まれているため、DDay.iCalのソースを参照するのが最善です。

const string filepath = @"C:\temp\ical.test.ics";
// use PUBLISH for appointments
// use REQUEST for meeting requests
const string METHOD = "REQUEST";

// Properties of the meeting request
// keep guid in sending program to modify or cancel the request later
Guid uid = Guid.Parse("2B127C67-73B3-43C5-A804-5666C2CA23C9");
string VisBetreff = "This is the subject of the meeting request";
string TerminVerantwortlicherEmail = "[email protected]";
string bodyPlainText = "This is the simple iCal plain text msg";
string bodyHtml = "This is the simple <b>iCal HTML message</b>";
string location = "Meeting room 101";
// 1: High
// 5: Normal
// 9: low
int priority = 1;
//=====================================
MailMessage message = new MailMessage();

message.From = new MailAddress("[email protected]");
message.To.Add(new MailAddress(TerminVerantwortlicherEmail));
message.Subject = "[VIS-Termin] " + VisBetreff;

// Plain Text Version
message.Body = bodyPlainText;

// HTML Version
string htmlBody = bodyHtml;
AlternateView HTMLV = AlternateView.CreateAlternateViewFromString(htmlBody,
  new System.Net.Mime.ContentType("text/html"));

// iCal
IICalendar iCal = new iCalendar();
iCal.Method = METHOD;
iCal.ProductID = "My Metting Product";            

// Create an event and attach it to the iCalendar.
Event evt = iCal.Create<Event>();
evt.UID = uid.ToString();

evt.Class = "PUBLIC";
// Needed by Outlook
evt.Created = new iCalDateTime(DateTime.Now);

evt.DTStamp = new iCalDateTime(DateTime.Now);
evt.Transparency = TransparencyType.Transparent;

// Set the event start / end times
evt.Start = new iCalDateTime(2014, 10, 3, 8, 0, 0); 
evt.End = new iCalDateTime(2014, 10, 3, 8, 15, 0); 
evt.Location = location;

//var organizer = new Organizer("[email protected]");
//evt.Organizer = organizer;

// Set the longer description of the event, plain text
evt.Description = bodyPlainText;

// Event description HTML text
// X-ALT-DESC;FMTTYPE=text/html
var prop = new CalendarProperty("X-ALT-DESC");
prop.AddParameter("FMTTYPE", "text/html");
prop.AddValue(bodyHtml);
evt.AddProperty(prop);

// Set the one-line summary of the event
evt.Summary = VisBetreff;
evt.Priority = priority;

//--- attendes are optional
IAttendee at = new Attendee("mailto:[email protected]");
at.ParticipationStatus = "NEEDS-ACTION";
at.RSVP = true;
at.Role = "REQ-PARTICIPANT";
evt.Attendees.Add(at);

// Let’s also add an alarm on this event so we can be reminded of it later.
Alarm alarm = new Alarm();

// Display the alarm somewhere on the screen.
alarm.Action = AlarmAction.Display;

// This is the text that will be displayed for the alarm.
alarm.Summary = "Upcoming meeting: " + VisBetreff;

// The alarm is set to occur 30 minutes before the event
alarm.Trigger = new Trigger(TimeSpan.FromMinutes(-30));

//--- Attachments
string filename = "Test.docx";

// Add an attachment to this event
IAttachment attachment = new DDay.iCal.Attachment();
attachment.Data = ReadBinary(@"C:\temp\Test.docx");
attachment.Parameters.Add("X-FILENAME", filename);
evt.Attachments.Add(attachment);

iCalendarSerializer serializer = new iCalendarSerializer();
serializer.Serialize(iCal, filepath);

// the .ics File as a string
string iCalStr = serializer.SerializeToString(iCal);

// .ics as AlternateView (used by Outlook)
// text/calendar part: method=REQUEST
System.Net.Mime.ContentType calendarType = 
  new System.Net.Mime.ContentType("text/calendar");
calendarType.Parameters.Add("method", METHOD);
AlternateView ICSview =
  AlternateView.CreateAlternateViewFromString(iCalStr, calendarType);

// Compose
message.AlternateViews.Add(HTMLV);
message.AlternateViews.Add(ICSview); // must be the last part

// .ics as Attachment (used by mail clients other than Outlook)
Byte[] bytes = System.Text.Encoding.ASCII.GetBytes(iCalStr);
var ms = new System.IO.MemoryStream(bytes);
var a = new System.Net.Mail.Attachment(ms,
  "VIS-Termin.ics", "text/calendar");
message.Attachments.Add(a);     

// Send Mail
SmtpClient client = new SmtpClient();
client.Send(message);

ここで、ReadBinary()関数:

private static byte[] ReadBinary(string fileName)
{
    byte[] binaryData = null;
    using (FileStream reader = new FileStream(fileName,
      FileMode.Open, FileAccess.Read))
    {
        binaryData = new byte[reader.Length];
        reader.Read(binaryData, 0, (int)reader.Length);
    }
    return binaryData;
}

このように設定ファイルでSmtpClientを設定するのが最も簡単です:

<configuration>
  ...
  <system.net>  
    <mailSettings>
      <smtp>
        <network Host="mysmtp.server.com" port="25" userName="mySmtpUserName" password="myPassword" />
      </smtp>
    </mailSettings>
  </system.net>
  ...
3
DrKoch