在 SendGrid C# 中将电子邮件作为日历邀请/约会发送

2023-11-27

我想向 Outlook 以及非 Outlook 客户端(例如 gmail/yahoo)发送一封包含日历邀请/约会的电子邮件。我的应用程序托管在 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);

The html内容来自形成日历邀请字符串的另一个代码片段:

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

这似乎不起作用。有什么指点吗?


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

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

Result:

enter image description here

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 SendGrid C# 中将电子邮件作为日历邀请/约会发送 的相关文章

随机推荐

  • 在 Angular 组件的模板中使用“this”关键字

    假设我们有一个prop组件类中的变量 我们通过模板中的插值使用它 堆栈闪电战演示 组件类 Component export class AppComponent prop Test 模板 p this prop p p prop p 为什么
  • 禁用一点工具提示?

    我的图表是这样的 http jsfiddle net gh get jquery 1 9 1 highslide software highcharts com tree master samples highcharts demo 3d
  • 通过 XHR Request 下载 PDF 文件

    通过 XHR 请求下载 pdf 文件是完全不可能的吗 我知道已经有很多关于这个主题的其他讨论 但遗憾的是 我仍然对它们不满意 我正在使用 AngularJs 并使用其发出请求 Http方法 它不会返回任何文件下载弹出窗口 但是 如果我在新的
  • 在 PowerShell 中关闭所有资源管理器窗口

    我正在编写以下代码来使用 PowerShell 关闭所有资源管理器窗口 New Object comObject Shell Application Windows FullName ne null FullName toLower End
  • Flutter:从 GestureDetector 获取本地位置

    我正在使用 GestureDetector 来获取此事件 onHorizontalDragStart onDragStart onHorizontalDragUpdate onDragUpdate 但如何才能将全球位置转变为本地位置呢 被移
  • 使用 twitter4j 库拥有多个 Twitter 实例。

    我需要能够做出不同的事情Twitter实例与相同的消费者密钥和秘密 但不同的用户级别访问令牌 我已经使用标准 Twitter OAuth 登录协议根据我的应用程序的消费者凭据获取了 10 个用户的访问令牌 现在 我想创建一个 Twitter
  • T4 文本模板 - 是否可以从主机获取编译符号?

    背景 我有一个用 C 编写的开源游戏库 它使用不安全代码 指针算术等对性能进行了高度调整 我最近将该库移植到了 Windows Phone 不幸的是 Windows Phone 根本不支持不安全代码 因此我不得不在源代码中添加如下预处理器指
  • 返回上一屏幕而不创建新实例

    正如图中所解释的 流程是这样的 因此 每当用户单击徽标按钮时 都应该调用 Activity A 作为简单的解决方案 我们可以使用这种方法 Intent intent new Intent activity activityToStart s
  • 如何并行化一个简单的 Python 循环?

    这可能是一个微不足道的问题 但是如何在 python 中并行化以下循环 setup output lists output1 list output2 list output3 list for j in range 0 10 calc i
  • 类型...不可分配给类型“从不”。(2322)

    下面的代码片段报错Type string is not assignable to type never 2322 在行中obj prop value我很难理解为什么 interface fooType s string n number
  • 为什么 vector::push_back 和 emplace_back 调用 value_type::constructor 两次?

    我有这门课 class Foo public Foo Foo const Foo cout lt lt constructed by lvalue reference lt
  • 如何使用 httr 发布多部分/相关内容(适用于 Google Drive API)

    我使用 httr 将简单的文件上传到 Google Drive 问题是每个文档都作为 无标题 上传 我必须修补元数据才能设置标题 PATCH 请求有时会失败 根据API 我应该能够进行分段上传 允许我将标题指定为上传文件的同一 POST 请
  • 递归方法最长路径算法的计算复杂度

    我编写了一个代码段来确定图中的最长路径 以下是代码 但由于中间的递归方法 我不知道如何获得其中的计算复杂度 由于找到最长的路径是一个 NP 完全问题 我认为它是这样的O n or O 2 n 但我怎样才能真正确定它呢 public stat
  • 部分类模板特化是这个设计问题的答案吗?

    假设您有一个类 其工作是连接到远程服务器 我想抽象这个类以提供两个版本 一个通过UDP连接 另一个通过TCP连接 我想构建尽可能精简的运行时代码 而不是使用多态性 我正在考虑模板 这是我的设想 但我不确定这是最好的方法 class udp
  • 当组不互斥时,功能类似于 group_by

    我想在 R 中创建一个函数 类似于dplyr s group by函数 当与summarise可以给出数据集的汇总统计数据 其中组成员身份并不相互排斥 即 观察结果可以属于多个组 考虑这个问题的一种方法可能是考虑标签 观察结果可能属于一个或
  • 在 Git 中维护“服务器版本”(仅更改配置文件)的正确方法是什么?

    我有时使用 Codeigniter 在本地站点上完成开发后 我需要将文件迁移到服务器 中的所有文件 config 需要更改文件夹以匹配服务器设置 对这些更改进行完整提交是不对的 我是否只是让 Git 完全忽略这些文件 或者有没有办法跟踪这些
  • C# 可为空字符串错误

    private string typeOfContract get return string ViewState typeOfContract set ViewState typeOfContract value 稍后在代码中我这样使用它
  • Spring REST - RestTemplate 可以使用多部分/混合吗?

    我想编写一个 REST 服务 它响应一个 zip 文件和一些 json 数据 所有内容都在一个多部分 混合请求中 服务器部分工作正常 我正在使用 Firefox 的 REST 客户端对其进行测试 我的服务器发送这样的多部分 k dXaXvC
  • 实体框架不适用于没有标识列的表

    我有下表 create table tbl id int identity 1 1 val varchar 100 现在 当我使用实体框架将对象映射到该表时 它可以工作 但是当我按如下方式更改表定义时 create table tbl1 i
  • 在 SendGrid C# 中将电子邮件作为日历邀请/约会发送

    我想向 Outlook 以及非 Outlook 客户端 例如 gmail yahoo 发送一封包含日历邀请 约会的电子邮件 我的应用程序托管在 Azure 上 我使用 SendGrid 发送电子邮件 电子邮件部分工作得很好 但我还没有找到任