在SendGrid C#中将电子邮件作为日历邀请/约会发送 [英] Send email as calendar invite/appointment in SendGrid C#

查看:123
本文介绍了在SendGrid C#中将电子邮件作为日历邀请/约会发送的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向Outlook以及非Outlook客户端(例如gmail/yahoo)发送带有日历邀请/约会的电子邮件.我的应用程序托管在Azure上,并且我正在使用SendGrid发送电子邮件.电子邮件部分工作正常,但我还没有找到可同时与Outlook和其他电子邮件客户端一起使用的完全有效的解决方案.这是我用来发送电子邮件的代码段:

I would like to send an email with calendar invite/appointment to both Outlook as well as non-Outlook client like gmail/yahoo. My application is hosted on Azure and I am using SendGrid for sending emails. Emails part is working just fine but I haven't found any fully working solution that works with both Outlook and other email clients. Here's the code snippet I am using to send email:

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 来自形成日历邀请字符串的另一个代码段:

The htmlContent comes from another coding snippet that forms the calendar invite string:

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();
    }

这似乎不起作用.有指针吗?

This does not seem to work. Any pointers?

推荐答案

根据您的描述,我检查了此问题,并尝试发送带有日历附件的电子邮件.您可以参考以下代码段:

According to your description, I checked this issue and tried to send a email with the calendar attachment. You could refer to the following code snippet:

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();
}

结果:

这篇关于在SendGrid C#中将电子邮件作为日历邀请/约会发送的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆