Sendgrid-nodejs: 容易理解的例子

创建于 2016-06-28  ·  75评论  ·  资料来源: sendgrid/sendgrid-nodejs

您好,

最好在自述文件中提供一个易于理解的示例,例如https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/这样简单的示例,因为如果我想写30行,则为tbh的JavaScript代码来发送简单的电子邮件,我不会使用sendgrid。

即使对于有经验的开发人员,您的库也很难使用。

干杯,
为这个愤怒的咆哮而感到抱歉

ps:此示例正是我在寻找的https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html ,因此易于使用

help wanted community enhancement

最有用的评论

@thinkingserious我终于明白了v3中引入的所有Sendgrid helper类让我如此烦恼...它们太多了,它们使发送电子邮件变得不必要的复杂:P

我不想彻底检查Sendgrid的所有代码,因此我决定制作一个简单的包装, sendgrid-mailer

尽管Sendgrid的帮助程序类在后台很有用,但是对于创建和验证电子邮件模型而言,我认为不应仅仅为了与API交互而强迫我们使用它们。 我发现它使编写Node应用程序变得比应做的更为复杂,并且助手的命名可能非常混乱,例如Mail vs Email

我认为基本示例很好地说明了这个问题:

https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class

对于“我想发送电子邮件”这样的基本内容,这似乎太令人费解了。 它要求您加载8个不同的依赖项并编写15行代码,然后才能发送电子邮件。

但是,不使用帮助器类可能会更糟,因为那样一来,您就必须知道电子邮件JSON请求的必需结构并自己正确地填充它。 一个错误将很容易破坏请求。

因此,我从一个简单易用的API帮助程序中抽象了所有帮助程序类逻辑,以便再次使用Sendgrid发送电子邮件变得轻松又有趣:)

最基本的示例变​​为:

//Load mailer and set API key (only needed once)
const mailer = require('sendgrid-mailer').config(API_KEY);

//Create email data 
const email = {
  to: '[email protected]',
  from: 'Someone <[email protected]>',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: '<p>Hello HTML world!</p>',
};

//Send away 
mailer.send(email); //Returns promise 

该请求是在后台构造的,并且透明地使用Sendgrid的助手。

它还支持发送封电子邮件,在需要进一步自定义的情况下公开Sendgrid对象,还接受Sendgrid Mail实例,并接受to / from字段的多种格式,例如Name <[email protected]>或具有名称/电子邮件属性的对象。 有关更多详细信息,请参见自述文件

仍有改进的余地,但是我想在这里与那些希望使用Sendgrid API而又不被它淹没的人们分享这个解决方案。

希望它对某人有用,也许它可以提供一个更简单的API来为该库的未来提供一些指导:)

cc @julesbou有点晚,但是我希望您仍然可以找到它的用处。

所有75条评论

你好@julesbou

愤怒的咆哮对我很好,特别是如果他们附有解决方案:)

感谢您抽出宝贵的时间告诉我们。

我们目前正在计划下一次迭代的改进,因此您的时机很好!

如果您还有其他特殊要求,请在此主题中告知我们,或者打开其他问题。

谢谢!

我们如何使用助手类? 我想做的就是设置发件人姓名?

@jsgandalf

最简单的方法是: https : https : //github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example。 js#L4

您也可以按照以下步骤构建自己的json: https

谢谢!

非常有帮助! 这应该在自述文件中!!

@jsgandalf @thinkingserious我也觉得该库使用起来很令人沮丧。 我正在尝试发送模板电子邮件。 我发现这里的例子不是很有帮助。 我对如何设置“发件人”和“发件人”电子邮件地址感到困惑,该代码甚至不发送我的电子邮件。 在过去的三天里,我一直在挠头。 有什么帮助吗?

感谢您的反馈@bcootner。 您的请求有助于解决此问题。 这是我渴望解决的问题。

同时,希望该示例可以帮助您:

var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)

function helloTemplate(){
  var helper = require('sendgrid').mail

  from_email = new helper.Email("[email protected]")
  to_email = new helper.Email("[email protected]")
  subject = "Hello World from the SendGrid Node.js Library"
  content = new helper.Content("text/plain", "some text here")
  mail = new helper.Mail(from_email, subject, to_email, content)
  // The constructor above already creates our personalization object
  // -name- and -card- are substitutions in my template
  substitution = new helper.Substitution("-name-", "Example User")
  mail.personalizations[0].addSubstitution(substitution)
  substitution = new helper.Substitution("-card-", "Denver")
  mail.personalizations[0].addSubstitution(substitution)
  mail.setTemplateId("YOUR_TEMPLATE_ID")
  return mail.toJSON()
}

function send(toSend){
  //console.log(JSON.stringify(toSend, null, 2))
  //console.log(JSON.stringify(toSend))

  var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY)

  var requestBody = toSend
  var emptyRequest = require('sendgrid-rest').request
  var requestPost = JSON.parse(JSON.stringify(emptyRequest))
  requestPost.method = 'POST'
  requestPost.path = '/v3/mail/send'
  requestPost.body = requestBody
  sg.API(requestPost, function (response) {
    console.log(response.statusCode)
    console.log(response.body)
    console.log(response.headers)
  })
}

send(helloTemplate())

如果您需要其他帮助,请与我们联系。

@thinkingserious感谢您的时间和周到的回复。 我有以下代码:

    var  sg = require('sendgrid').SendGrid("SG.**** .. ***6o");

    function welcomeTemplate() {
         console.log("template")
         var helper = require('sendgrid').mail
         from_email = new helper.Email("[email protected]")
         to_email = new helper.Email("[email protected]")
         subject = "Hello World from the SendGrid Node.js Library"
         content = new helper.Content("text/plain", "some text here")
         mail = new helper.Mail(from_email, subject, to_email, content)
         substitution = new helper.Substitution("-Name-", "bcootner")
         mail.personalizations[0].addSubstitution(substitution)
         mail.setTemplateId("5a****-*******-******-9")    //The ID of my Transactional Template
         return mail.toJSON()
}

function sendMail(toSend) {
     console.log("Send")
     var sg = require('sendgrid').SendGrid("SG.***....****o")
     var requestBody = toSend
     var emptyRequest = require('sendgrid-rest').request
     var requestPost = JSON.parse(JSON.stringify(emptyRequest))
     requestPost.method = 'POST'
     requestPost.path = '/v3/mail/send'
     requestPost.body = requestBody
     sg.API(requestPost, function (response) {
            console.log(response.statusCode)
            console.log(response.body)
            console.log(response.headers)
       })
}

然后,我用sendMail(welcomeTemplate())调用此代码,但这不起作用。 “模板”和“发送”出现在日志中,但没有显示statusCode,正文或标题,没有接收到电子邮件,并且仪表板上也没有任何显示。

requestPost.body = requestBody ,您可以做console.log(JSON.stringify(requestBody))然后告诉我您得到了什么。

@thinkingserious经过一些调试后,似乎在var emptyRequest = require('sendgrid-rest').request行之后没有任何内容打印到日志中。 首先记录“模板”,然后大约5分钟后打印“发送”(如果我取消注释您在send函数中注释的行,则可以正常工作)。 这个require语句我缺少什么吗,我只是做了npm install sendgrid

请尝试以下方法:

A.创建一个名为post.json的文件,其中包含以下负载:

{"content":[{"type":"text","value":"Hello, World!"}],"from":{"email":"[email protected]"},"personalizations":[{"subject":"Hello, World!","to":[{"email":"[email protected]"}]}]}

B.替换示例电子邮件

C.运行以下命令:

curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \
        -H "Authorization: Bearer $SENDGRID_API_KEY"  \
        -H "Content-Type: application/json" \
        -d @post.json

D.用您的API KEY替换$ SENDGRID_API_KEY,或将您的API密钥添加到名为SENDGRID_API_KEY的环境变量中

@thinkingserious我收到了该测试电子邮件,我也能够使Hello Test正常工作,只是这些模板不起作用。

编辑:所以我用var emptyRequest = sg.emptyRequest()代替了var emptyRequest = require('sendgrid-rest').request并发送了电子邮件,模板设计或图像中没有任何格式。

@bcootner

不幸的是,我无法重现您的错误,因此我尝试帮助逐步解决可能出现的问题。 由于您可以通过curl发送电子邮件,因此这意味着您的API密钥很好。 模板ID可能有问题?

如果删除mail.setTemplateId("5a****-*******-******-9")电子邮件会发送吗?

@thinkingserious因此,如果我删除setTemplateID,它将发送测试“ SendGrid Node.js库中的Hello World”。

我不确定您是否看到了我的编辑,但是通过将var emptyRequest = require('sendgrid-rest').request替换var emptyRequest = sg.emptyRequest()来发送模板中的文本,但是没有格式设置(没有字体,没有图像)。 我现在从控制台获得以下打印。

2016-07-13T00:01:07.514157+00:00 app[web.1]:   date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514159+00:00 app[web.1]:   connection: 'close',
2016-07-13T00:01:07.514157+00:00 app[web.1]:   date: 'Wed, 13 Jul 2016 00:01:07 GMT',
2016-07-13T00:01:07.514158+00:00 app[web.1]:   'content-type': 'text/plain; charset=utf-8',
2016-07-13T00:01:07.502390+00:00 app[web.1]: 202
2016-07-13T00:01:07.502454+00:00 app[web.1]: 
2016-07-13T00:01:07.514155+00:00 app[web.1]: { server: 'nginx',
2016-07-13T00:01:07.514159+00:00 app[web.1]:   connection: 'close',
2016-07-13T00:01:07.514161+00:00 app[web.1]:   'x-frame-options': 'DENY' }

有些事情使我认为“文本/纯文本”有问题,但我不确定。 再次感谢!

@bcootner ,我也遇到了同样的问题,

_Params_

  • 来自(例如“ [email protected]”)
  • 到(例如“ [email protected]”)
  • 主题(例如“测试主题”)
  • 消息(例如“测试消息”)
  • 模板(您要使用的模板ID)
  • templateVariables(对象,电子邮件中的key-variable,替换为value-value的值) { ":name": "someName", ":email": "someEmail" } 。 请注意, :email:name是我在电子邮件模板中设置变量的方式,可以是-email-或其他任何形式
  • 成功回调
  • 错误回调
    let sendTemplateMail =  (from, to, subject, message, template, templateVariables, successCallback, errorCallback) => {
        var sg = require('sendgrid').SendGrid(process.env.SENDGRID_API_KEY),
            helper = require('sendgrid').mail,
            content_text = new helper.Content("text/plain", message),
            content_html = new helper.Content("text/html", message),
            request = sg.emptyRequest(),
            email_to = new helper.Email(to),
            email_from = new helper.Email(from),
            mail = new helper.Mail(email_from, subject, email_to, content_text),
            personalization = new helper.Personalization();

        personalization.addTo(email_to);
        personalization.setSubject(subject);

        mail.setTemplateId(template);
        mail.addContent(content_html);

        for(var key in templateVariables) {
            if(templateVariables.hasOwnProperty(key)) {
                var substitution = new helper.Substitution(key, templateVariables[key]);
                personalization.addSubstitution(substitution);
            }
        }

        mail.addPersonalization(personalization);

        request.method = 'POST';
        request.path = '/v3/mail/send';
        request.body = mail.toJSON();

        sg.API(request, (json) => {
            if(json.statusCode >= 300) {
                errorCallback(json);
            } else {
                successCallback(json);
            }
        });
    }

该文档确实需要一些重构,包括基本的简单示例。 希望我的功能可以帮助您:)

@ByEmke感谢您的支持! 您能否通过[email protected]给我们发送电子邮件,

关于文档,重构以及邮件帮助程序本身都是这样。 我们一直在收集您的所有反馈,并对下一次迭代感到很兴奋。

另外,一个很大的困惑是您在使用模板时仍然需要设置内容。 幸运的是,这种情况很快就会改变。

@bcootner我想你钉了它。 您需要content_html = new helper.Content("text/html", message) 。 幸运的是,这一要求将在几天后消失,我们的团队目前正在更改此行为,因此,当您指定模板时,您将不再需要设置内容。

@ByEmke @thinkingserious感谢您在此问题上的帮助,昨晚我设法将其与以下代码一起使用:

 var sg = require('sendgrid').SendGrid("SendGrid API Key" or <environment variable>)

function sendEmail(tempID){
    var helper = require('sendgrid').mail;
    from_email = new helper.Email("[email protected]")
    to_email = new helper.Email("[email protected]")
    subject = "Dummy Subject"
    content = new helper.Content("text/html", "dummy content")
    mail = new helper.Mail(from_email, subject, to_email, content)

    substitution = new helper.Substitution("-name-", "User's Name")
    mail.personalizations[0].addSubstitution(substitution)
    mail.setTemplateId(tempID)
    var requestBody = mail.toJSON()
    var requestPost = JSON.parse(JSON.stringify(sg.emptyRequest()))
    requestPost.method = 'POST'
    requestPost.path = '/v3/mail/send'
    requestPost.body = requestBody
    sg.API(requestPost, function (response) {
       console.log(response.statusCode)
       console.log(response.body)
       console.log(response.headers)
  })
}

再次感谢!

我也觉得文档很难遵循,特别是在使用模板和其他功能时。

我更喜欢使用request.body = {}语法而不是helper()语法,因为这会使事情变得更加冗长且不易阅读(至少对我而言)。

我花了很多时间浏览文档,测试更改,查看示例,然后再次尝试来到这里,发现使用模板时您需要设置内容,尽管文档另有说明。 啊这样的东西会让你发疯。 无论如何, @@ ByEmke都提供了一个有效的示例,

@peterkuiper (或者我应该说亚当:))

感谢您的反馈,我们对如何使库文档变得更好非常感兴趣。

明确地说,您是指这些吗? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md

关于内容问题(我们所有人都听说过:)),这几乎是固定的。 我们将向API部署一个发行版,该发行版在使用模板时不需要设置内容。 我们希望更改将使模板体验更好。

@thinkingserious我正在检出sendgrid.com上的文档(即https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html),而我应该直接去Github。 我跳过了此仓库的自述文件,查看了示例,完全错过了USAGE.md(我很糟糕)。 USAGE.md文件应该是应该放在sendgrid.com上的文件,因为它具有我的首选格式:)仍不确定使用模板时的一些最佳做法,但我希望自己能弄清楚或在文件中找到它。文档。

我正在浏览该文件,并且发现了一个使我感到困惑的随机例子:

var request = sg.emptyRequest()
request.queryParams["start_time"] = '1'
request.queryParams["limit"] = '1'
request.queryParams["end_time"] = '1'
request.queryParams["offset"] = '1'
request.method = 'GET'
request.path = '/v3/suppression/blocks'
sg.API(request, function (response) {
    console.log(response.statusCode)
    console.log(response.body)
    console.log(response.headers)
  })

起始时间,限制,结束时间和偏移量是什么类型,它们是什么意思? 还有更多queryParams吗? 而且为什么它不是request.body?

有一个指向用户指南的链接(完全没有帮助),而应有一个指向API文档的链接,该链接可以清除https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html。

因此,您必须反复尝试找出在哪里可以找到所需的信息。

优秀的反馈@peterkuiper!

我也想吐给你。 请将您的T恤尺寸和邮寄地址发送给我们[email protected]

我们将更新USAGE.md文档,以包括查询和响应主体的描述。

关于模板,计划是像我们对邮件端点所做的那样创建一个助手,并附有常见用例的示例。 此外,还有一个修复程序可以解决,该问题使您在使用模板时不必指定内容。 这是造成混乱的主要原因。

@thinkingserious很酷,谢谢:)发送电子邮件!

当我在使用它时,我发现还有其他东西也与最佳实践有关(这给我的团队造成了一些混乱)。 我的一个团队成员为某些功能(例如,验证电子邮件)创建了模板,并添加了verify-nl,verify-en等。因此,每个模板基本上都是相同的,唯一的区别是文本(不同的语言)。 我已经看到<%subject%>和<%body%>并找不到任何引用(可能是我自己的TL; DR),所以我认为这是使用API​​时发生的内部替换。

我很好奇什么是“正常”的做法:

  • 使用不同的语言为每个功能创建一个模板,并且仅做一些次要的替换(即名称)

当您更改模板的某些部分时,似乎使用这种方法可能会导致很多工作。 不知道您是否能够创建“模板模板”(即页眉/页脚/任何部分)。 另外,当您使用多种不同的语言时,可以轻松达到300个模板的限制(在我们的情况下这不是问题)。

  • 为每个功能创建一个模板,并使用<%body%>从您的应用程序中设置正文,只有一个“主”模板(或使用on子标签)

希望这个问题有意义:)

@peterkuiper

我不知道,但是我已经塞了一些塞子。 我会以发现的结果回应。 谢谢!

@thinkingserious我最终使用了2.0.0 ,我非常喜欢它的工作方式:

var client = require("sendgrid")("key");

client.send({
  to: "[email protected]",
  from: "[email protected]",
  subject: "subject",
  text:  "hello"
  // Or using the html property:
  // html: "Hello <strong>World!</strong>!"
}, fn);

我正在寻找版本3.x.x样子。 我发现当前的示例确实令人困惑。

很好的反馈@IonicaBizau!

我们一定会考虑您对下一次迭代的想法。

@thinkingserious太好了! 不过,我想知道在3.x.x会是什么样子。

由于此客户端是从头开始重新创建以与v2邮件终结点分离并允许访问v3终结点的,因此没有一对一的映射。

就是说,邮件帮助程序的目的是使呼叫可以像使用v2一样容易。 我们还不存在,我们回到开始并期待更多的迭代。

@thinkingserious我确实看到了,但是我不喜欢以下几点:

  1. 因为存在全局变量(没有varlet或类似的关键字声明),所以令人困惑。 例如: from_email = new helper.Email("[email protected]")而不是var from_email = ...
  2. 仅将new helper.Email用作电子邮件资源是非常不友好的。 可以将其包装在模块内部的较低级功能中。 ContentMail等也是如此。
  3. 手动设置methodpathbody还是很不友好。
  4. 回调函数应采用err, data, ...格式(而不是响应)。

简而言之,恕我直言,_quick start_是用于发送电子邮件的底层实现。 对于更深层次的功能,它可能很有用,但对于快速入门来说绝对不是。 😁


非常感谢您提供的出色服务和模块。 ✨

@IonicaBizau

很棒的反馈,谢谢!

在构建邮件帮助程序的下一个迭代时,我们一定会参考您的想法。

没错,第一个版本是API的精简包装。 该计划是根据社区反馈逐步改善其功能,就像您所做的一样!

为了您对社区的支持和贡献,我们想给您一些赃物。 请给我们发送电子邮件至[email protected]其中包含您的T恤尺寸和邮寄地址。

请随时根据需要添加其他反馈。 再次感谢!

@IonicaBizau

您还可以执行以下操作:

var sg = require('sendgrid').SendGrid('API_KEY');
var request = sg.emptyRequest()

request.body = {
  "content": [
    {
      "type": "text/html",
      "value": "<html><p>Hello, world!</p></html>"
    }
  ],
  "from": {
    "email": "[email protected]",
    "name": "My Name"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "[email protected]",
          "name": "John Doe"
        }
      ]
    }
  ],
  "template_id": "TEMPLATE_ID",
};

request.method = 'POST'
request.path = '/v3/mail/send'
sg.API(request, function (response) {
  console.log(response.statusCode)
  console.log(response.body)
  console.log(response.headers)
});

我更喜欢这种语法而不是辅助语法。 看一下示例,它们对我有很大帮助。

https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js

高温超导

@thinkingserious哇! 一定会的。 谢谢,很高兴为您提供帮助! 😁

@peterkuiper我也尝试过,但是我想我将text/html替换html出错了,内容显示为附件。 然后,我决定降级该版本。

但是,这仍然看起来很底层( request.method = ... ,在content数组中发送MIME类型,在回调中发送response参数,等等)。

谢谢@peterkuiper!

我上周在自述文件中添加了示例样式:)

@IonicaBizau

是的,这些低级的东西将很快被隐藏。

@thinkingserious很高兴听到请求的内容即将被隐藏👍

在遵循@IonicaBizau的伟大建议之后,如果可能的话,另一个建议是隐藏“个性化”的实现细节。 例如,执行以下操作:

var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x);
sg.addBcc(email);
sg.addBcc(email);
sg.addHeader(header);

似乎没有必要通过SDK公开此级别的详细信息。

同样,不确定这是否已经是一个功能,但是能够链接这些调用会很棒:

var sg = require('sendgrid').SendGrid('API_KEY');
sg.addTo(x)
  .addBcc(email)
  .addBcc(email)
  .addHeader(header)
  .send();

谢谢并保持良好的工作👍

@jamesdixon

感谢您的其他反馈!

直到我们增强邮件帮助程序以隐藏更多实现之前,请查看@adambuczynski的出色拉取请求: https :

@thinkingserious您提到低级要求的内容将很快被隐藏,你们是否已经为此计划了什么? 我昨天在考虑这个问题,尽管可以很好地访问整个API,但是您也可以使用sendgrid-rest 。 这样,该库所需要做的就是允许您发送电子邮件,因此仅公开电子邮件发送API。

那是您分开的关注点,并稍微缩小了此程序包的范围,从而允许使用链接等更简洁的API,例如

@adambuczynski

我们的计划是通过助手执行抽象层。 邮件是第一个,但是在不久的将来,我们计划为子用户管理和模板添加一个。 但是首先,我们需要完善邮件助手,并使其成为标准。

没错,该库只是sendgrid-rest上的一个非常薄的层,仅添加示例,USAGE文件和单元测试(这些都是使用Swagger定义自动完成的[我们也希望开源)。 从长远来看,我们设想为所有端点实施帮助程序代码,并通过两种方式均进行数据验证,并且该功能的核心也将自动实现。 工作流程和用例将是手工制作的。

在接下来的几周/几个月内,我们将在GitHub上公开此路线图,以获取更多反馈。

同样,到8月底,我们将在此库中增加对传入解析Webhook的支持。

感谢您提出这个问题,并希望我的答复能引起您和社区的更多反馈。 我们希望这是一个由社区驱动的库,由SendGrid支持和领导。

感谢更新@thinkingserious。 我很乐意在sendgrid nodejs库中扮演一个角色。

为什么在此阶段要添加Parse支持? 我以为Parse服务将于明年1月停用。

@thinkingserious我忘了提一下,如果有什么我可以帮忙的,就ping我吧。 如果可以的话,我很乐意破解。 :微笑:

@adambuczynski真是个好消息! 另外,您的拉取请求越来越接近顶部。 我想我可以在下周初将其合并。

关于Parse,我们尚未决定正式退休。 在库中添加支持是我们测试的一部分,以确定我们是否继续进行下去。

@IonicaBizau

谢谢! 您的支持是极大的赞赏!

有没有一种使用邮件助手来设置多个收件人的方法?
我注意到helper.Mail(from_email, subject, to_email, content)使用personalization.addTo来设置接收者。.我相信这仅适用于1个接收者,而不是一组接收者(也许我错了),并且助手没有提供setTo函数(理想的设置方法)。

我看到如果我自己用let personalization = new helper.Personalization();设置个性化设置,我可以做personalization.tos = [email, email]//email=new helper.Email(email_address, name) ,这样安全吗? 在将来的版本中可能会更改吗?

@ albert-the-creator我按如下方式使用它:

  //Helpers
  const Mail = sendgrid.mail.Mail;
  const Email = sendgrid.mail.Email;
  const Personalization = sendgrid.mail.Personalization;

  //Create new mail object
  let mail = new Mail();

  //Create recipients
  let recipients = new Personalization();
  recipients.addTo(new Email(data.to, data.toname));

  //Set recipients
  mail.addPersonalization(recipients);

我认为您可以通过重复recipients.addTo行来添加多个收件人,例如在循环中。

我确实发现这种方法很冗长,分为Email和Personalization类。 有时,您只想添加一个电子邮件地址并将其发送出去,感觉就像您需要很多代码行才能完成该任务。

@ albert-the-creator,

创建该构造函数是为了帮助人们更轻松地发送一封电子邮件,基本上这是一个“问候电子邮件”功能。

对于多封电子邮件,您可能希望遵循此示例(因为您已经通过自己设置个性化设置来开始使用此路径): https :

阅读有关个性化设置可能也很有用: https :

帮手肯定会发展,但是任何重大更改都将通过发布主要要点来表示。 我不希望API发生太大变化。

@adambuczynski

感谢您参与! 我们需要更新帮助程序以解决诸如此类的其他常见用例,并例如发送带有模板的电子邮件。

@thinkingserious helpers API是我也很感兴趣的东西,当我再次有空的时候可以重构/改善它:)

@adambuczynski

太棒了,当您决定开始时,请ping我。 或者,如果我们在您之前开始讨论,那么我会ping您。

我使用了@bcootner的代码,效果很好。 但是,有一个正确的官方示例说明如何与此节点插件一起使用模板,将是非常不错的。

@otmezger

感谢您的跟进!

我本周正在处理该示例,您将在README中找到它的链接。

我不使用模板帮助器,但是我将分享通过帮助器load方法加载HTML和文本格式模板以及部分信息的方法:

  /**
   * Load an email (both plain text and html)
   */
  load(email, data, req) {

    //Get filenames
    const PARTIAL_HTML = path.resolve('./app/components/' + email + '.html');
    const PARTIAL_TEXT = path.resolve('./app/components/' + email + '.txt');

    //Append some globals
    if (req) {
      Object.assign(data, {
        app: {
          title: req.app.locals.APP_TITLE,
          version: req.app.locals.APP_VERSION,
          url: req.app.locals.APP_BASE_URL,
        },
        date: {
          year: moment().format('YYYY'),
          date: moment().format('DD-MM-YYYY'),
        },
      });
    }

    //Return promise
    return Promise.all([
      Promise.all([
        readFile(TEMPLATE_TEXT, 'utf8'),
        readFile(PARTIAL_TEXT, 'utf8'),
      ]).spread((template, partial) => {
        return template.replace('{{partial}}', partial);
      }),
      Promise.all([
        readFile(TEMPLATE_HTML, 'utf8'),
        readFile(PARTIAL_HTML, 'utf8'),
      ]).spread((template, partial) => {
        return template.replace('{{partial}}', partial);
      }),
    ]).then(result => result.map(contents => replaceData(contents, data)));
  },

然后可以按如下方式使用它来获取准备好与Sendgrid一起使用的对象:

  let email = mailer.load('user/emails/verify-email-address', data, req)
    .spread((text, html) => ({
      to: user.email,
      from: req.app.locals.EMAIL_IDENTITY_NOREPLY,
      subject: 'Verify your email address',
      text, html,
    }));

您可以轻松地修改示例以使用类似Handlebars模板的东西。 在上面的示例中, replaceData帮助器是一个简单的函数,它用提供的数据替换了类似车把的标签。

我不确定这是否相关,但是通过不使用“邮件帮助程序”,我节省了无数的时间。 这是在感到沮丧之后,我故意降级到2.0。 我只是使用一种工厂类型的函数来生成有效的V3 JSON,现在对V3 API的改进感到非常兴奋(因为我现在可以实际使用它们了)。

一开始我也为此感到困惑。 我觉得
帮助程序可能会变得更加高效,并且更易于使用。 我会
甚至争论说也许他们不应该成为核心sendgrid模块的一部分,
为了分离问题并允许人们选择使用它们。

我再看看它们,看看是否可以提出一些具体建议
建议。

2016年8月26日星期五,05:48肖恩·林多[email protected]写道:

我不确定是否通过示例,但是不使用“邮件助手”
我为自己节省了不可估量的时间。 这是这样后
沮丧我故意降级到2.0。


您收到此邮件是因为有人提到您。
直接回复此电子邮件,在GitHub上查看
https://github.com/sendgrid/sendgrid-nodejs/issues/252#issuecomment -242479491,
或使线程静音
https://github.com/notifications/unsubscribe-auth/AAd8Qu5iRLFQwoKlRd2fP5oioT1uLqB6ks5qjdV2gaJpZM4JAiac

@seanlindo

感谢您抽出宝贵的时间提供反馈!

这是不使用邮件助手的情况下使用此库的示例: https :

Mail Helper是第一个版本,我们依靠您的反馈来帮助我们改进下一个版本。 您是否介意分享您遇到的特定问题,以便我们创建故障单以解决它们?

另外,我还要对我们的积压任务进行投票,以改进“邮件助手”,以帮助将其排入队列。 谢谢!

@adambuczynski

我看到你的威力还在继续:)

我期待您的反馈,我知道这会很棒!

@julesbou

我们已经启动了USE_CASES.md文件,我们将在其中提供常见用例的示例。 首先是交易模板:)

我期待您的反馈,我知道这会很棒!

👻

@thinkingserious好的! 给我一天左右的时间,我将为您提供一个具体的例子。

这是我最喜欢的线程之一:)

我认为您的反馈对于该库的下一个迭代至关重要,这可能是一个重大变化。 如果您有时间,请看看我们的建议吗? https://github.com/sendgrid/sendgrid-nodejs/issues/290

谢谢!

@thinkingserious我终于明白了v3中引入的所有Sendgrid helper类让我如此烦恼...它们太多了,它们使发送电子邮件变得不必要的复杂:P

我不想彻底检查Sendgrid的所有代码,因此我决定制作一个简单的包装, sendgrid-mailer

尽管Sendgrid的帮助程序类在后台很有用,但是对于创建和验证电子邮件模型而言,我认为不应仅仅为了与API交互而强迫我们使用它们。 我发现它使编写Node应用程序变得比应做的更为复杂,并且助手的命名可能非常混乱,例如Mail vs Email

我认为基本示例很好地说明了这个问题:

https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class

对于“我想发送电子邮件”这样的基本内容,这似乎太令人费解了。 它要求您加载8个不同的依赖项并编写15行代码,然后才能发送电子邮件。

但是,不使用帮助器类可能会更糟,因为那样一来,您就必须知道电子邮件JSON请求的必需结构并自己正确地填充它。 一个错误将很容易破坏请求。

因此,我从一个简单易用的API帮助程序中抽象了所有帮助程序类逻辑,以便再次使用Sendgrid发送电子邮件变得轻松又有趣:)

最基本的示例变​​为:

//Load mailer and set API key (only needed once)
const mailer = require('sendgrid-mailer').config(API_KEY);

//Create email data 
const email = {
  to: '[email protected]',
  from: 'Someone <[email protected]>',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: '<p>Hello HTML world!</p>',
};

//Send away 
mailer.send(email); //Returns promise 

该请求是在后台构造的,并且透明地使用Sendgrid的助手。

它还支持发送封电子邮件,在需要进一步自定义的情况下公开Sendgrid对象,还接受Sendgrid Mail实例,并接受to / from字段的多种格式,例如Name <[email protected]>或具有名称/电子邮件属性的对象。 有关更多详细信息,请参见自述文件

仍有改进的余地,但是我想在这里与那些希望使用Sendgrid API而又不被它淹没的人们分享这个解决方案。

希望它对某人有用,也许它可以提供一个更简单的API来为该库的未来提供一些指导:)

cc @julesbou有点晚,但是我希望您仍然可以找到它的用处。

@adamreisnz认真,谢谢。

我通过sendgrid发送电子邮件的后台工作是使用v4.0.7,它已经足够复杂了。 我升级到最新版本,可惜一切都坏了。 发送电子邮件的复杂性令我感到沮丧,我什至不去更新。

综上所述,这正是我所寻找的。 周末我会试一试。

干杯!

@jamesdixon我仍然停留在v3.xx上,也不想升级:)

希望您会发现它有用。 让我知道它如何为您工作,如果有任何重大遗漏,谢谢!

@adamreisnz

这真是太棒了,感谢您与我们的社区分享它:)

tldr; 我们的助手课程尚未结束,您已经击败了我们,前往了我们的目的地:)

我们完全同意您的想法,这是v3库更新的阶段,当前我们正在所有7个SDK中进行开发。 请参阅此处的Mail Helper Enhancement项目

目前,我们正在完善C#库。 要获得有关我们对该Node.js库计划的具体示例,请参阅this 。 我们希望在几天之内将其释放。

因此,我有一个建议:

您介意将解决方案添加到这里的Mail Helper中(类似于我们在C#中所做的事情)吗? 我认为在这种情况下,您的工作将会取得更大的影响。 如果没有,那就没有问题。 由于您已按照MIT许可发布项目,因此,如果我们从您的良好工作中借来了一点,希望您能原谅我们。

如果您决定分开进行工作,请在“社区库”部分下的此处添加链接?

感谢您一直以来的大力支持。 你摇滚!

@thinkingserious很高兴听到您正在考虑以相同的方式前进。 C#的示例看起来更好,但是我认为对于JS实现来说仍然有些复杂。 制作所有类不一定总是使用JS的最佳方法。

至于您的建议,由于我仍在使用内部帮助类,因此我不知道将其移植到官方库中实际上有多少有用。 我可能会更倾向于帮助进行大型重写(例如v5),并从头开始,从用户和Node社区中获取意见,并提出一个很棒的API,该API既易于使用,又在需要时具有灵活性。

但是,如果与此同时您想从我的包装器中借用一些代码以在官方库中使用,则一定要这样做:)我将在该页面中将链接添加到我的包装器中🎉

实际上,我认为将项目分成两个包可能是个好主意,一个较低的级别包括与API交互的请求逻辑,一个较高的级别仅用于发送电子邮件,类似于我创建的。

较低级别的包可用于需要完全访问API的人员,而邮件程序包则适合仅希望发送电子邮件的人员。 当然,在后台,邮件程序将使用API​​包。

@thinkingserious

@adamreisnz

与往常一样,感谢您的周到反馈。

我不确定目前是否需要拆分项目。 我认为,使用当前的帮助器模型可以达到类似的结果。 也就是说,我愿意在将来的版本中探索新的体系结构,我很乐意让您参与其中。

希望社区中的其他一些人能够参与进来。

我将对此进行更深入的考虑,并在需要实施更新的Mail Helper时重新参与。

再次感谢您的支持以及将链接添加到我们的文档中!

这是分离关注点的问题。 您可以在主库中包括一个帮助程序/包装程序,以便于邮寄,但我认为这是将两个单独的问题混合在一起,导致两者可能造成的损害或不必要的麻烦。 将它们分开可以使消费者选择他们需要的库(或两者都选),并且由于边界明确,可能会使两个库的开发更加容易。

我认为Node和npm模块的本质是尽可能地将关注点分离,并让每个包都执行特定任务(并擅长于此!)。 刚开始使用Node时,我也必须习惯这一点,但是一旦我做到了,我就喜欢开发它提供的干净,简单的程序包的自由和能力。

期待听到社区的一些意见。

好吧,你绝对有说服力的说服力:)

非常感谢您抽出宝贵的时间来阐述。

我已经很期待回到这个库的工作,现在,您让我非常兴奋,可以重新与您和社区一起使用此SDK。

太好了,让我知道您什么时候打算去做:)
我要休假4周,这意味着我最终将有一些空闲时间来做一些开源项目上的工作🌴

@adamreisnz

恭喜!

更高层次的“邮件程序包”正是我们想要的。 只需发送一些电子邮件。

在最后一个版本中,它简直太简单了,而现在却变得一团糟。 “基本”示例当前定义了8个var ,需要特殊的构造函数。 在易用性方面向后退了一大步。

应该像

sendgrid.send({
  from: fromEmail,
  fromName: fromName,
  to: toEmail,
  subject: 'Hello'
  ...
})
.then(...)
.catch(...)
.finally(...)

零文档是必需的,这只是我们可以复制粘贴并继续进行复制的一个示例。 这是SendGrid对我们团队的主要价值,不幸的是,现在它已经丢失了。

@adamreisnz看起来很棒; 非常明显的设计决策。 希望您能使用SendGrid工资单!

@thinkingserious,请认真考虑将主要文档指向@adamreisnz项目,因为它极大地简化了所有操作,如果我今天早些时候知道它,那么使用imho是一种过度设计的Java- JS中的启发式api。 请给您的用户他们想要的,而不是您认为他们想要的:-)

另外,请注意,由于V2 API已经失效,如果其他开发人员开始更频繁地出现在这里,我也不会感到惊讶,因为新帐户将被迫使用V3 API。 就个人而言,我尝试的第一件事是使用nodemailer(其sendgrid传输仍可使用v2进行工作)过去曾对数十个项目有意义,但这次却花了很多时间。 如果我不得不考虑到nodemailer在node社区中的流行,我将不会是唯一在接下来的几个月中最终会遇到这种情况的人。

@ fisch0920感谢您的反馈,在接下来的几周中,我将与@thinkingserious一起改善Sendgrid API。 希望我们会提出一些易于使用但在需要时仍足够灵活的东西。

大家好,

我认为您可能对SendGrid Node.js邮件助手上的重新设计感兴趣: https :

您的反馈将不胜感激!

最诚挚的问候,

埃尔默

请转到#378获取更新,谢谢!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

egges picture egges  ·  3评论

mikemaccana picture mikemaccana  ·  4评论

wooyah picture wooyah  ·  4评论

thinkingserious picture thinkingserious  ·  4评论

danielflippance picture danielflippance  ·  4评论