można wysyłać wezwania na spotkania za pośrednictwem poczty do programu Outlook za pomocą iCal Standard (RFC 5545)
You nie można wysyłać w ten sposób elementów todo. Możesz wysłać "Nominacje", ale te pojawiają się w widoku jako załączniki .ics, które muszą być zaakceptowane "na ślepo".
Żądania spotkań pojawiają się w widoku z dobrym podglądem i można je zaakceptować lub odrzucić. Program wysyłający może zmodyfikować lub anulować spotkanie po jego wysłaniu.
To easieset stworzyć ważny element iCal z DDay.iCal .Net Library
Poniższy kod jest kompletnym przykładem pracy. Tworzy ciąg znaków z ważnym wezwaniem na spotkanie iCal i wysyła je pocztą.
Kod tworzy mail z:
- zwykłego ciała tekstu dla prostych klientów pocztowych
- ciało HTML diplay w nowoczesnych klientów pocztowych
- iCal wezwanie na spotkanie jako AlternateView (wyświetla w Outlooku)
- iCal wezwanie na spotkanie jako załącznik (nadające się do klientów pocztowych innych niż Outlook)
kodu pokazuje, jak dodać:
- opis tekst w formacie HTML, wygląda ładniej w Outlook
- Priorytet, widoczność (publiczne/prywatne/poufne)
- opcjonalnie organizator (pokaże w programie Outlook zamiast nadawcy poczty)
- opcjonalne uczestnicy
- opcjonalny alarm
- opcjonalne załączniki do spotkania. pojawi się w kalendarzu Outlooka
kilka ważnych szczegółów:
- mail nadawcy (lub opcjonalnie organizatora) oraz odbiornik mail musi być inny do tej pracy w programie Outlook
- metody w .ics i metoda w Mime.ContentType musi pasować
- spotkanie musi leżeć w przyszłości do tej pracy w programie Outlook
- część .ics musi być ostatnią częścią alternateView w mailu MIME
Dokładne szczegóły na temat perspektyw sposób interpretuje pliki .ics są wyszczególnione w [MS-OXCICAL]: iCalendar to Appointment Object Conversion Algorithm
Użyjemy tych zespołów:
using System;
using System.IO;
using System.Net.Mail;
using DDay.iCal;
using DDay.iCal.Serialization.iCalendar;
Dla DDay.iCal jej wystarczająco, aby pobrać DDay.iCal binary Files. Jeśli chcesz dodać niektóre funkcje, najlepiej przyjrzeć się źródłom DDay.iCal, ponieważ dokumentacja jest nieaktualna, a źródła zawierają całkiem kompletne testy, które wykorzystują wszystkie jej funkcje.
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);
Tutaj ReadBinary() funkcja:
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;
}
Jego najłatwiej skonfigurować smtpclient w pliku konfiguracyjnym jak ten:
<configuration>
...
<system.net>
<mailSettings>
<smtp>
<network host="mysmtp.server.com" port="25" userName="mySmtpUserName" password="myPassword" />
</smtp>
</mailSettings>
</system.net>
...
Ilość czasu wybrania czekać czyni mnie myślę, że moja sugestia nie jest dokładnie tym, o czym myślałeś. Czy przynajmniej zmusiłeś go do działania? – Tomalak
Po prostu nie miałem czasu, aby przetestować go wcześniej. Wydawało się, że szybki test zadziałał, i wysłałem zaproszenie na konferencję Outlook na konto z włączonym protokołem POP3, aby uzyskać "surowy zrzut".Te dwa bity są wystarczająco dobre, bym mógł wymyślić resztę, ponieważ muszę tylko wysyłać spotkania, ale nie dbam o odpowiedź. –
W każdym razie twoja odpowiedź była ogromnie pomocna, wielkie dzięki! –