我想向Outlook以及gmail / yahoo等非Outlook客户端发送包含日历邀请/约会的电子邮件。我的应用程序托管在Azure上,我使用SendGrid发送电子邮件。电子邮件部分工作正常但我还没有找到任何适用于Outlook和其他电子邮件客户端的完全可用的解决方案。这是我用来发送电子邮件的代码段:
var client = new SendGridClient(this.apiKey);
var msg = MailHelper.CreateSingleEmailToMultipleRecipients(
new EmailAddress(Sender, SenderName),
recipients, subject, textcontent, htmlcontent);
if (isMeetingRequest)
{
Attachment attachment = new Attachment();
attachment.Filename = "calendar.ics";
attachment.Content = htmlcontent;
attachment.Type = "text/calendar";
msg.Attachments = new List<Attachment> { attachment };
}
await client.SendEmailAsync(msg);
htmlContent 来自另一个形成日历邀请字符串的编码代码段:
private static string MeetingRequestString(string from, List<string> toUsers, string subject, string desc, DateTime startTime, DateTime endTime)
{
StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN");
str.AppendLine("VERSION:2.0");
str.AppendLine(string.Format("METHOD:REQUEST"));
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", startTime));
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmss}", DateTime.Now));
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", endTime));
str.AppendLine(string.Format("UID:{0}", Guid.NewGuid().ToString()));
str.AppendLine(string.Format("DESCRIPTION:{0}", desc.Replace("\n", "<br>")));
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", desc.Replace("\n", "<br>")));
str.AppendLine(string.Format("SUMMARY:{0}", subject));
str.AppendLine(string.Format("ORGANIZER;CN=\"{0}\":MAILTO:{1}", from, from));
str.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", string.Join(",", toUsers), string.Join(",", toUsers)));
str.AppendLine("BEGIN:VALARM");
str.AppendLine("TRIGGER:-PT15M");
str.AppendLine("ACTION:DISPLAY");
str.AppendLine("DESCRIPTION:Reminder");
str.AppendLine("END:VALARM");
str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");
return str.ToString();
}
这似乎不起作用。有什么指针吗?
答案 0 :(得分:5)
根据您的说明,我检查了此问题并尝试发送包含日历附件的电子邮件。您可以参考以下代码段:
static async Task SendGridAsync()
{
var client = new SendGridClient("your-api-key");
var msg = new SendGridMessage()
{
From = new EmailAddress("{sender-email}", "{sender-name}"),
Subject = "Hello World from the SendGrid CSharp SDK!",
HtmlContent = "<strong>Hello, Email using HTML!</strong>"
};
var recipients = new List<EmailAddress>
{
new EmailAddress("{recipient-email}", "{recipient-name}")
};
msg.AddTos(recipients);
string CalendarContent = MeetingRequestString("{ORGANIZER}", new List<string>() { "{ATTENDEE}" },"{subject}","{description}", "{location}", DateTime.Now, DateTime.Now.AddDays(2));
byte[] calendarBytes = Encoding.UTF8.GetBytes(CalendarContent.ToString());
SendGrid.Helpers.Mail.Attachment calendarAttachment = new SendGrid.Helpers.Mail.Attachment();
calendarAttachment.Filename = "invite.ics";
//the Base64 encoded content of the attachment.
calendarAttachment.Content = Convert.ToBase64String(calendarBytes);
calendarAttachment.Type = "text/calendar";
msg.Attachments = new List<SendGrid.Helpers.Mail.Attachment>() { calendarAttachment };
var response = await client.SendEmailAsync(msg);
}
private static string MeetingRequestString(string from, List<string> toUsers, string subject, string desc, string location, DateTime startTime, DateTime endTime, int? eventID = null, bool isCancel = false)
{
StringBuilder str = new StringBuilder();
str.AppendLine("BEGIN:VCALENDAR");
str.AppendLine("PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN");
str.AppendLine("VERSION:2.0");
str.AppendLine(string.Format("METHOD:{0}", (isCancel ? "CANCEL" : "REQUEST")));
str.AppendLine("BEGIN:VEVENT");
str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", startTime.ToUniversalTime()));
str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmss}", DateTime.Now));
str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", endTime.ToUniversalTime()));
str.AppendLine(string.Format("LOCATION: {0}", location));
str.AppendLine(string.Format("UID:{0}", (eventID.HasValue ? "blablabla" + eventID : Guid.NewGuid().ToString())));
str.AppendLine(string.Format("DESCRIPTION:{0}", desc.Replace("\n", "<br>")));
str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", desc.Replace("\n", "<br>")));
str.AppendLine(string.Format("SUMMARY:{0}", subject));
str.AppendLine(string.Format("ORGANIZER;CN=\"{0}\":MAILTO:{1}", from, from));
str.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", string.Join(",", toUsers), string.Join(",", toUsers)));
str.AppendLine("BEGIN:VALARM");
str.AppendLine("TRIGGER:-PT15M");
str.AppendLine("ACTION:DISPLAY");
str.AppendLine("DESCRIPTION:Reminder");
str.AppendLine("END:VALARM");
str.AppendLine("END:VEVENT");
str.AppendLine("END:VCALENDAR");
return str.ToString();
}
<强>结果:强>
答案 1 :(得分:0)
我也面临着同样的问题 它在Gmail上可以很好地工作,但是在Outlook中,我在电子邮件中看到了邀请文件。当我尝试通过电子邮件打开Invitation.ics时,它会显示“将此Internet日历添加到Outlook”对话框,其中包含一些警告内容。如果单击“是”,它将添加到日历中。因此,默认情况下,邀请不会添加到Outlook中的日历中