【问题标题】:Attach ics file in Sendgrid在 Sendgrid 中附加 ics 文件
【发布时间】:2015-10-07 12:18:18
【问题描述】:

如何在 C# 中使用 Sendgrid 发送日历邀请?

我可以将 ics 文件附加到邮件中,但是当我下载附件时出现“日历文件无效”的错误。

string CalendarContent = "BEGIN:VCALENDAR VERSION:2.0 PRODID:-//Meeter/meeter//NONSGML v1.0//EN CALSCALE:GREGORIAN METHOD:REQUEST BEGIN:VEVENT DTSTART:20141018T203000Z DTEND:20141018T210000Z UID:20141015T002813-223788868@meeter.com DTSTAMP:20141014T212813Z ORGANIZER;CN=\"snaggs@gmail.com\";SENT-BY=\"MAILTO:someapp@gmail.com\";LANGUAGE=se:MAILTO:snaggs@gmail.com ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=Fessy M;X-NUM-GUESTS=0:MAILTO:snaggs2@gmail.com DESCRIPTION:dddd mandrill LOCATION:dddddd mandrill SUMMARY:Can I lay low? Cook some yay-yo 2 TRANSP:OPAQUE SEQUENCE:0 STATUS:CONFIRMED END:VEVENT END:VCALENDAR";

using (MemoryStream ms = new MemoryStream(Encoding.ASCII.GetBytes(CalendarContent )))
                    {
                        _Message.AddAttachment(ms, "meeting.ics");
                    }
                    var Header = new Dictionary<string, string>();
                    Header.Add("Content-Type", "text/calendar");

【问题讨论】:

  • 您是尝试通过电子邮件发送日历邀请还是从网页下载?

标签: c# sendgrid


【解决方案1】:

如果您尝试发送日历,您需要执行以下操作:

// you already have the _Message & CalendarContent created above

// first thing, convert calendar content to byte array and then stream
byte[] calendarBytes = Encoding.UTF8.GetBytes(CalendarContent.ToString());
Stream calendarStream = new MemoryStream(calendarBytes);

// them create a attachment for your mail message
Attachment calendarAttachment = new Attachment(calendarStream, "calendar.ics", "text/calendar");
calendarAttachment.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;  

// now attach the calendar to your Mail Message
_Message.Attachments.Add(calendarAttachment);

// now send the message off

【讨论】:

  • 无法像上面那样添加附件。文档说您必须使用 AddAttachment() 方法。但是,我无法设置 MimeType
  • 这个答案似乎是使用 SMTPClient 和 System.Net.Mail 类使用 SendGrid 凭据发送电子邮件。最初的问题似乎是使用 SendGrid C# 客户端 API 库之一。这就是为什么 Belicosus 说文档说使用 AddAttachment() 而 Black Frog 提供的答案使用 _Message.Attachments.Add()
【解决方案2】:

一些事情。

首先,您的 CalendarContent 看起来无效,其中没有任何换行符。

第一次尝试:

string CalendarContent = @"BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Meeter/meeter//NONSGML v1.0//EN
CALSCALE:GREGORIAN
METHOD:REQUEST
BEGIN:VEVENT
DTSTART:20141018T203000Z
DTEND:20141018T210000Z
UID:20141015T002813-223788868@meeter.com
DTSTAMP:20141014T212813Z
ORGANIZER;CN=\"snaggs@gmail.com\";SENT-BY=\"MAILTO:someapp@gmail.com\";LANGUAGE=se:MAILTO:snaggs@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=Fessy M;X-NUM-GUESTS=0:MAILTO:snaggs2@gmail.com
DESCRIPTION:dddd mandrill
LOCATION:dddddd mandrill
SUMMARY:Can I lay low? Cook some yay-yo 2 
TRANSP:OPAQUE
SEQUENCE:0 
STATUS:CONFIRMED
END:VEVENT
END:VCALENDAR";

如果这不起作用,似乎以下内容不符合 RFC 5545 但我对此并不肯定,RFC 可能会造成混淆:

ORGANIZER;CN=\"snaggs@gmail.com\";SENT-BY=\"MAILTO:someapp@gmail.com\";LANGUAGE=se:MAILTO:snaggs@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=Fessy M;X-NUM-GUESTS=0:MAILTO:snaggs2@gmail.com

可能是:

ORGANIZER;LANGUAGE=se:SENT-BY=\"mailto:someapp@gmail.com\":mailto:snaggs@gmail.com
ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN=Fessy M;X-NUM-GUESTS=0:mailto:snaggs2@gmail.com

【讨论】:

    【解决方案3】:

    试试这个

    // 创建你的日历字符串

    string lsCalendar = CreateCalendar(loMessage, fsUID, fdtStartDateTime, fdtEndDateTime, fdtTimeStamp, fsTimeZone, fsLocation, fsRecurType, fsWeekdays, fsAction);
    byte[] calendarBytes = Encoding.UTF8.GetBytes(lsCalendar.ToString());
    Stream calendarStream = new MemoryStream(calendarBytes);
    loMessage.AddAttachment(calendarStream, "invite.ics");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 2017-08-21
      相关资源
      最近更新 更多