Sendgrid-nodejs: Легко понять пример

Созданный на 28 июн. 2016  ·  75Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Здравствуйте,

Было бы здорово предоставить простой для понимания пример в вашем readme, например, что-нибудь простое, например https://sendgrid.com/blog/migrating-app-sendgrids-template-engine/ , потому что tbh, если бы я хотел написать 30 строк кода javascript для отправки простого электронного письма я бы не стал использовать sendgrid.

Ваша библиотека довольно неприятна в использовании даже для опытного разработчика.

Привет,
и извините за эту гневную тираду

ps: этот пример - именно то, что я ищу https://sendgrid.com/docs/Integrate/Code_Examples/v2_Mail/nodejs.html , настолько простой в использовании

help wanted community enhancement

Самый полезный комментарий

@thinkingserious Я наконец понял, что меня так беспокоит во всех вспомогательных классах Sendgrid, представленных в v3 ... их слишком много, и они делают отправку электронных писем излишне сложной: 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]> или объект со свойствами имени / адреса электронной почты. Смотрите README для более подробной информации.

Вероятно, еще есть возможности для улучшения, но я хотел бы поделиться этим решением здесь для людей, которые хотят использовать API Sendgrid, не будучи перегруженными им.

Надеюсь, что это пригодится кому-то, и, возможно, это может дать какое-то направление для будущего этой библиотеки, предлагая более простой API :)

cc @julesbou немного опоздал, но я надеюсь, что вы все еще можете найти ему применение.

Все 75 Комментарий

Привет @julesbou ,

Злые тирады меня устраивают, особенно если к ним прилагаются решения :)

Спасибо, что нашли время сообщить нам об этом.

В настоящее время мы планируем улучшения для следующей итерации, так что вы хорошо успели!

Если у вас есть какие-либо другие конкретные запросы, сообщите нам об этом в этой теме или откройте дополнительные вопросы.

Спасибо!

Как мы используем вспомогательный класс? Все, что я хочу сделать, это установить от имени ??

@jsgandalf ,

Самый простой способ: https://github.com/sendgrid/sendgrid-nodejs#hello -email, в частности: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail/example. js # L4

Вы также можете просто создать свой собственный json следующим образом: https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/mail/mail.js#L31 (вот обзор json: https: / /sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html)

Спасибо!

Очень полезно! Это должно быть в ридми !!

@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()) но это не работает. «Шаблон» и «отправить» появляются в журналах, но код состояния, тело или заголовки не отображаются, электронные письма не принимаются, и на моей панели управления ничего не отображается.

После 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]"}]}]}

Б. Замените примеры писем

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. Либо замените $ SENDGRID_API_KEY своим КЛЮЧОМ API, либо добавьте свой Ключ API в переменную среды с именем SENDGRID_API_KEY.

@thinkingserious Я получил это тестовое письмо, мне также удалось получить тест Hello Test, который работает нормально, просто эти шаблоны не хотят работать.

РЕДАКТИРОВАТЬ: Итак, я заменил var emptyRequest = require('sendgrid-rest').request на var emptyRequest = sg.emptyRequest() и это отправляет электронное письмо, просто нет никакого форматирования из дизайна шаблона или каких-либо изображений.

@bcootner ,

К сожалению, я не могу воспроизвести вашу ошибку, поэтому я пытаюсь помочь разобраться, где может быть проблема. Поскольку вы можете отправить электронное письмо через curl, это означает, что ваш ключ API в порядке. Возможно, проблема с идентификатором шаблона?

Если вы удалите mail.setTemplateId("5a****-*******-******-9") ли отправлено письмо?

@thinkingserious Итак, если я удалю setTemplateID, он отправит тест «Hello World из библиотеки SendGrid Node.js».

Я не уверен, видели ли вы мою правку, но при замене 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' }

Что-то заставляет меня думать, что это проблема с 'text / plain', но я не уверен. Спасибо еще раз!

Привет, @bcootner , я только что столкнулся с той же проблемой и

_Params_

  • от (например, '[email protected]')
  • в (например, '[email protected]')
  • субъект (например, "испытуемый")
  • сообщение (например, "тестовое сообщение")
  • шаблон (идентификатор шаблона, который вы хотите использовать)
  • templateVariables (объект, где ключ - переменная в письме, значение - значение, на которое нужно ее заменить) { ":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 спасибо за вашу поддержку! Не могли бы вы написать нам на

Что касается документации, то в процессе рефакторинга, как и самого почтового помощника. Мы собираем все ваши отзывы и очень ждем следующей итерации.

Кроме того, большая путаница заключается в том, что вам все равно нужно установить контент при использовании шаблона. К счастью, это изменится очень скоро (дни).

@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 (), поскольку он делает вещи более подробными и менее удобными для чтения (по крайней мере, для меня).

Я потратил довольно много времени на просмотр документации, тестирование изменений, просмотр ваших примеров и повторную попытку только для того, чтобы прийти сюда и узнать, что вам _do_ нужно устанавливать контент при использовании шаблонов, хотя в документации указано иное. Ага. Подобные вещи могут свести с ума. В любом случае, спасибо @ByEmke за рабочий пример.

@peterkuiper (или лучше сказать Адам :))

Спасибо за отзыв, мы очень заинтересованы в том, чтобы улучшить документацию библиотеки.

Для ясности, вы имеете в виду это? https://github.com/sendgrid/sendgrid-nodejs/blob/master/USAGE.md

Что касается проблемы с контентом (мы все слышали :)), она почти решена. Мы развернем выпуск в API, который не требует установки содержимого при использовании шаблона. Мы надеемся, что это изменение сделает работу с шаблоном намного лучше.

@thinkingserious Я

Я просматривал этот файл и только что нашел случайный пример того, что меня смущает:

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

Какие типы это start_time, limit, end_time и offset и что они означают? Есть ли еще queryParams? И почему это не request.body?

Есть ссылка на Руководство пользователя (которое совсем не помогает), хотя должна была быть ссылка на документы API, которые проясняют ситуацию https://sendgrid.com/docs/API_Reference/Web_API_v3/blocks.html.

Таким образом, вам приходится ходить взад и вперед, пытаясь выяснить, где найти нужную информацию.

Отличный отзыв @peterkuiper!

Я бы тоже хотел тебя развлечь. Отправьте нам свой размер футболки и почтовый адрес на [email protected].

Мы обновим документацию USAGE.md, включив в нее описания тел запроса и ответа.

Что касается шаблонов, мы планируем создать помощника, как мы сделали для конечной точки почты, с примерами распространенных вариантов использования. Кроме того, в ближайшее время будет исправлено, что вам не нужно будет указывать контент при использовании шаблонов. Это большой источник путаницы.

@thinkingserious круто, спасибо :) письмо отправлено!

Пока я занимаюсь этим, я заметил кое-что еще, что также относится к лучшим практикам (и вызывает некоторую путаницу в моей команде). Один из моих товарищей по команде создал шаблоны для некоторых функций (например, для проверки электронной почты) и добавил verify-nl, verify-en и т. Д. Таким образом, все шаблоны были в основном одинаковыми, с той лишь разницей, что текст (на другом языке). Я видел <% subject%> en <% 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. Это сбивает с толку, потому что существуют глобальные переменные (объявленные без var или let или аналогичного ключевого слова). Например: from_email = new helper.Email("[email protected]") вместо var from_email = ...
  2. Использование new helper.Email только для ресурса электронной почты очень недружелюбно. Возможно, это может быть заключено в более низкоуровневую функциональность внутри модуля. То же самое для Content , Mail и т. Д.
  3. Установка вручную method , path и body снова довольно недружелюбна.
  4. Функция обратного вызова должна быть в формате err, data, ... (вместо ответа).

Короче говоря, IMHO, _quick start_ - это реализация низкого уровня для отправки электронной почты. Это может быть полезно для более глубоких функций, но определенно не для _быстрого старта_. 😁


Большое спасибо за отличный сервис и модуль. ✨

@IonicaBizau ,

Отличный отзыв, спасибо!

Мы обязательно обратимся к вашим мыслям при разработке следующей итерации почтового помощника.

Вы правы, эта первая версия представляет собой тонкую оболочку API. План состоит в том, чтобы постепенно улучшать его функциональность на основе отзывов сообщества, как и то, что вы сделали!

За вашу поддержку и вклад в сообщество, мы хотели бы отправить вам немного подарков. Отправьте нам электронное письмо на адрес [email protected] с

Не стесняйтесь добавлять дополнительные отзывы по своему усмотрению. Спасибо еще раз!

@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

HTH

@thinkingserious Ух ты! Обязательно сделаю. Спасибо - рад помочь! 😁

@peterkuiper Я тоже пробовал это, но я думаю, что сделал ошибку, заменив text/html на html и содержимое появилось как вложение. Тогда я просто решил понизить версию.

Но опять же , это все еще выглядит низкоуровневый ( request.method = ... , посылая тип MIME в content массива, response аргумент в обратный вызов и т.д.).

Спасибо @peterkuiper!

Я добавил этот стиль примера в README на прошлой неделе :)

@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 ,

Спасибо за дополнительный отзыв!

Пока мы не доработаем почтовый помощник, чтобы включить еще несколько замечательный запрос на вытягивание https://github.com/sendgrid/sendgrid-nodejs/pull/261. Он не обращается напрямую к вашей конкретной идее, но это шаг в правильном направлении.

@thinkingserious, вы упомянули, что запросы низкого уровня будут скоро скрыты, ребята, вы уже что-то запланировали для этого? Я думал об этом вчера, и хотя иметь доступ ко всему API приятно, вы также можете использовать sendgrid-rest для этого. Таким образом, все, что должна делать эта библиотека, - это позволять вам отправлять электронную почту и, таким образом, предоставлять только API отправки электронной почты.

Это было вы разделите проблемы и немного сузили фокус этого пакета, допуская более чистый API с цепочкой и т. Д., Как предложил

@adambuczynski ,

Наш план состоит в том, чтобы выполнить уровень абстракции с помощью помощников. Почта - первая, но в ближайшем будущем мы планируем добавить ее для управления субпользователями и шаблонов. Но сначала нам нужно отполировать почтовый помощник и сделать его стандартом.

Вы правы, эта библиотека представляет собой очень тонкий слой по сравнению с sendgrid-rest и просто добавляет примеры, файл USAGE и модульные тесты (все они автоматизированы [мы также надеемся открыть исходный код] с использованием нашего определения Swagger ). В долгосрочной перспективе мы планируем реализовать вспомогательный код для всех конечных точек с двусторонней проверкой данных и автоматизацией ядра этой функции. Рабочие процессы и варианты использования будут созданы вручную.

В течение следующих нескольких недель / месяцев мы опубликуем дорожную карту здесь, на GitHub, для получения дополнительных отзывов.

Кроме того, к концу августа мы добавим в эту библиотеку поддержку Incoming Parse Webhook.

Спасибо, что задали этот вопрос, и надеюсь, что мой ответ вызовет дальнейшие отзывы от вас и сообщества. Мы хотим, чтобы это была библиотека, управляемая сообществом, поддерживаемая и возглавляемая SendGrid.

Спасибо за обновление @thinkingserious. Я буду счастлив сыграть роль в библиотеке sendgrid nodejs в будущем.

Почему вы добавляете поддержку Parse на этом этапе? Я думал, что в январе следующего года сервис Parse будет закрыт.

@thinkingserious Я забыл упомянуть, что если я могу чем-то помочь, просто напишите мне. Я был бы счастлив взломать вещи, если смогу. :улыбка:

@adambuczynski , это отличные новости! Кроме того, ваш запрос на перенос становится все ближе к вершине. Я думаю, что смогу объединить его в начале следующей недели.

Что касается Parse, то мы пока не решили официально отказаться от него. Добавление поддержки в библиотеки - это часть нашего теста, чтобы определить, продолжим ли мы это делать или нет.

@IonicaBizau ,

Спасибо! Ваша поддержка очень ценится!

Есть ли способ установить несколько получателей с помощью почтового помощника?
Я заметил, что helper.Mail(from_email, subject, to_email, content) использует personalization.addTo для установки получателя. Я считаю, что это работает только с 1 получателем, а не с массивом получателей (возможно, я ошибаюсь), а помощник не предоставляет setTo function (идеальный способ установить значения).

Я вижу, что если бы я сам настраивал персонализацию с помощью 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 , например, в цикле.

Я нахожу этот подход довольно многословным с разделением на классы электронной почты и персонализации. Иногда вы просто хотите добавить адрес электронной почты и отправить его, и возникает ощущение, что для этого вам нужно много строк кода.

@ Альберт-Творец,

Этот конструктор был создан, чтобы упростить отправку одного электронного письма, в основном это функция «приветственное письмо».

Для нескольких электронных писем вы, вероятно, захотите следовать этому примеру (поскольку вы уже начали этот путь, установив персонализацию самостоятельно): https://github.com/sendgrid/sendgrid-nodejs/blob/master/examples/helpers/mail /example.js#L15

Также может быть полезно прочитать о персонализации: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html

Помощник определенно будет развиваться, но любые критические изменения будут обозначены выпуском основной версии. Однако я не ожидаю, что API сильно изменится.

@adambuczynski ,

Спасибо за участие! Нам нужно обновить помощник, чтобы учесть дополнительные распространенные варианты использования, такие как, например, отправку электронных писем с шаблонами.

@thinkingserious API помощников был чем-то, что меня также интересует, возможно, рефакторинг / улучшение, когда у меня снова будет время :)

@adambuczynski ,

Это здорово, когда вы решите начать, пожалуйста, свяжитесь со мной. Или, если мы начнем раньше вас, я пингую вас.

Я использовал код @bcootner, и он работал нормально. Однако было бы здорово иметь правильный и официальный пример того, как использовать шаблон с этим плагином узла.

@otmezger ,

Спасибо за продолжение!

Я работаю над этим примером на этой неделе, вы найдете его ссылкой в ​​README.

Я не использую помощник по шаблонам, но поделюсь своим подходом к загрузке шаблонов и частичных файлов как HTML, так и текстового формата с помощью вспомогательного метода load :

  /**
   * 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,
чтобы разделить проблемы и позволить людям использовать их.

Я еще раз посмотрю на них и посмотрю, смогу ли я придумать какой-нибудь конкретный
предложения.

Пт, 26 августа 2016 г., 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 ,

Спасибо, что нашли время оставить отзыв!

Вот пример использования этой библиотеки без Mail Helper: https://github.com/sendgrid/sendgrid-nodejs#without -mail-helper-class

Mail Helper - это первая версия, и мы зависим от отзывов, подобных вашим, чтобы помочь нам улучшить следующую версию. Не могли бы вы поделиться конкретными проблемами, с которыми вы столкнулись, чтобы мы могли создать заявки на их исправление?

Кроме того, я добавляю ваш голос к нашей задаче невыполненной работы, чтобы улучшить Mail Helper, чтобы помочь переместить его в очередь. Спасибо!

@adambuczynski ,

Я вижу, что твое великолепие продолжается :)

Я с нетерпением жду ваших отзывов, я знаю, что это будет здорово!

@julesbou ,

Мы запустили файл USE_CASES.md, в котором мы предоставим примеры для типичных случаев использования. Первым были шаблоны транзакций :)

Я с нетерпением жду ваших отзывов, я знаю, что это будет здорово!

👻

@thinkingserious Конечно! Дайте мне день или около того, и я приведу вам конкретный пример.

Это одна из моих любимых тем :)

Я думаю, что ваши отзывы будут иметь решающее значение для следующей итерации этой библиотеки, которая, вероятно, будет критическим изменением. Если у вас есть минутка, не могли бы вы взглянуть на наше предложение? https://github.com/sendgrid/sendgrid-nodejs/issues/290

Спасибо!

@thinkingserious Я наконец понял, что меня так беспокоит во всех вспомогательных классах Sendgrid, представленных в v3 ... их слишком много, и они делают отправку электронных писем излишне сложной: 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]> или объект со свойствами имени / адреса электронной почты. Смотрите README для более подробной информации.

Вероятно, еще есть возможности для улучшения, но я хотел бы поделиться этим решением здесь для людей, которые хотят использовать API Sendgrid, не будучи перегруженными им.

Надеюсь, что это пригодится кому-то, и, возможно, это может дать какое-то направление для будущего этой библиотеки, предлагая более простой API :)

cc @julesbou немного опоздал, но я надеюсь, что вы все еще можете найти ему применение.

@adamreisnz серьезно, спасибо.

В моем фоновом задании по отправке писем через sendgrid использовалась версия 4.0.7, которая и без того была достаточно сложной. Я обновился до последней версии и, к сожалению, все сломалось. Я был так разочарован тем, насколько сложно было отправить электронное письмо, что даже не стал обновлять.

С учетом всего сказанного, простота - это именно то, что я искал. Я попробую на выходных.

Ура!

@jamesdixon Я все еще застрял на v3.xx и тоже не хотел обновляться :)

Надеюсь, вы найдете это полезным. Сообщите мне, как это работает для вас, и если чего-то не хватает, спасибо!

@adamreisnz ,

Это УДИВИТЕЛЬНО, спасибо, что поделились этим с нашим сообществом :)

tldr; наши вспомогательные классы не закончены, и вы уже опередили нас туда, куда мы направляемся :)

Мы полностью согласны с вашими мыслями, и это этап обновления библиотеки v3, над которым мы сейчас работаем для всех 7 наших SDK. Пожалуйста, ознакомьтесь с проектом Mail Helper Enhancement здесь, чтобы получить более подробную информацию о проекте Node.js.

В настоящее время мы дорабатываем библиотеку C #. Чтобы получить пример бетонного того , что мы планируем для этой библиотеки Node.js, пожалуйста , см это . Мы надеемся выпустить его в ближайшие дни.

Итак, у меня есть предложение:

Не могли бы вы добавить здесь свое решение в Mail Helper (аналогично тому, что мы сделали в C #)? Я думаю, что в этом случае ваша работа будет намного шире. Если нет, то вообще никаких проблем. Поскольку вы разместили свой проект под лицензией MIT, я надеюсь, что вы простите нам, если мы немного позаимствовали у вас из вашей хорошей работы;) И, конечно же, мы позаботимся о том, чтобы вы получили признание за свой вклад.

Если вы решите сохранить свою работу отдельно, не могли бы вы добавить ссылку здесь, в разделе «Библиотеки сообщества»?

Спасибо за вашу потрясающую постоянную поддержку. Ты жжешь!

@thinkingserious рад слышать, что ты думаешь о том же. Пример C # выглядит лучше, но я думаю, что все еще несколько запутан для реализации JS. Создание всех классов - не всегда лучший способ использовать JS.

Что касается вашего предложения, поскольку я все еще использую вспомогательные классы под капотом, я не знаю, сколько из них было бы полезно перенести в официальную библиотеку. Я, вероятно, был бы более склонен помочь с серьезным переписыванием (например, v5) и начать все сначала, принимая мнения пользователей и сообщества Node, и придумать потрясающий API, который одновременно прост в использовании, но при необходимости гибок.

Но если тем временем вы хотите позаимствовать часть кода из моей оболочки для использования в официальной библиотеке, обязательно сделайте это :) Я добавлю ссылку на свою оболочку на этой странице 🎉

Я действительно думаю, что было бы неплохо разделить проект на два пакета: один более низкий уровень, который включает логику запроса для взаимодействия с API, и один более высокий уровень только для отправки электронных писем, аналогично тому, что я создал.

Пакет нижнего уровня может использоваться для людей, которым нужен полный доступ к API, в то время как пакет почтовой программы будет подходить для людей, просто желающих отправлять электронные письма. И, конечно же, под капотом почтовая программа будет использовать пакет API.

@thinkingserious, что ты

@adamreisnz ,

Спасибо за вдумчивый отзыв, как всегда.

Я не уверен, нужно ли нам сейчас разделять проект. Я думаю, что мы можем достичь аналогичных результатов с текущей вспомогательной моделью. Тем не менее, я открыт для изучения новой архитектуры в будущей версии, и я хотел бы, чтобы вы были в этом деле.

Надеюсь, что некоторые другие участники сообщества поддержат это.

Я подумаю об этом глубже и снова подключусь, когда придет время внедрить обновленный Mail Helper.

Еще раз спасибо за вашу поддержку и за добавление ссылки на наши документы!

Это вопрос разделения опасений. Вы можете включить помощник / оболочку для удобной рассылки внутри основной библиотеки, но, на мой взгляд, это смешивает две отдельные проблемы с вероятным ущербом или ненужным усложнением обоих. Их разделение позволит потребителям выбрать нужную им библиотеку (или обе) и, вероятно, упростит разработку обеих библиотек из-за четко определенных границ.

Я думаю, что природа модулей Node и npm состоит в том, чтобы максимально разделять задачи и чтобы каждый пакет выполнял определенную задачу (и был в этом хорош!). Мне тоже пришлось к этому привыкнуть, когда я впервые начал работать с Node, но как только я это сделал, мне понравилась свобода и возможность разрабатывать чистые, простые пакеты, которые он предоставляет.

С нетерпением ждем комментариев от сообщества.

Что ж, вы однозначно убедительны с вескими аргументами :)

Я очень ценю, что вы нашли время уточнить.

Я уже с нетерпением ждал возможности вернуться к работе над этой библиотекой, и теперь вы очень взволновали меня, чтобы вернуться к работе над этим SDK вместе с вами и сообществом.

Отлично, дайте мне знать, когда будете над этим работать :)
Я в отпуске на 4 недели, так что у меня наконец- то появится свободное время, чтобы поработать над проектами с открытым исходным кодом 🌴

@adamreisnz ,

Поздравляю!

«Пакет почтовой программы» гораздо более высокого уровня - это именно то, что нам нужно. Просто нужно отправить несколько писем.

С последней версией все было очень просто, а теперь это ужасный беспорядок. В « Базовом » примере в настоящее время

Должно быть так же просто, как

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

Никаких документов не требуется, просто пример, который мы можем скопировать и вставить в путь. Это основная ценность SendGrid для нашей команды, и, к сожалению, сейчас она отсутствует.

@eeosk посмотрите https://github.com/sendgrid/sendgrid-nodejs/issues/252#issuecomment -265934147 👍

@adamreisnz Отлично выглядит; очень очевидные дизайнерские решения. Я надеюсь, что вы получаете зарплату в SendGrid!

@thinkingserious, пожалуйста, серьезно подумайте о том, чтобы указать основные документы на проект @adamreisnz , поскольку он значительно упрощает все, и если бы я знал об этом ранее сегодня, это сэкономило бы мне часы головной боли, пытаясь использовать то, что imho является чрезмерно разработанным, Java- вдохновил api на JS. Пожалуйста, дайте своим пользователям то, что они хотят, а не то, что, по вашему мнению, они хотят :-)

Кроме того, просто отметим, что я не удивлюсь, если другие разработчики начнут появляться здесь чаще теперь, когда API V2 был закрыт, и новые учетные записи будут вынуждены использовать API V3. Лично я первым делом попробовал использовать nodemailer (чей транспорт sendgrid все еще работает с v2), который имел смысл для десятков проектов в прошлом, но на этот раз потребовалось целую вечность, чтобы начать работать. Если бы мне пришлось угадывать, учитывая популярность nodemailer в сообществе узлов, я не единственный, кто в ближайшие месяцы будет так себя чувствовать.

@ fisch0920 благодарим за отзыв. В ближайшие недели я буду работать вместе с @thinkingserious над улучшением API Sendgrid. Надеюсь, мы придумаем что-то простое в использовании, но при этом достаточно гибкое.

Здравствуйте все,

Я подумал, что вас может заинтересовать переработка почтового помощника SendGrid Node.js: https://github.com/sendgrid/sendgrid-nodejs/pull/378

Будем признательны за ваш отзыв!

С наилучшими пожеланиями,

Элмер

Пожалуйста, перейдите на # 378 для получения обновлений, спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги