Здравствуйте,
Было бы здорово предоставить простой для понимания пример в вашем 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 , настолько простой в использовании
Привет @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_
{
":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 шаблонов может быть легко достигнуто, если у вас много разных языков (в нашем случае это не проблема).
Надеюсь, вопрос имеет смысл :)
@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 Я видел это, но мне не нравятся следующие моменты:
var
или let
или аналогичного ключевого слова). Например: from_email = new helper.Email("[email protected]")
вместо var from_email = ...
new helper.Email
только для ресурса электронной почты очень недружелюбно. Возможно, это может быть заключено в более низкоуровневую функциональность внутри модуля. То же самое для Content
, Mail
и т. Д.method
, path
и body
снова довольно недружелюбна.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 для получения обновлений, спасибо!
Самый полезный комментарий
@thinkingserious Я наконец понял, что меня так беспокоит во всех вспомогательных классах Sendgrid, представленных в v3 ... их слишком много, и они делают отправку электронных писем излишне сложной: P
Я не хотел переделывать весь код Sendgrid, поэтому решил вместо этого сделать простую оболочку sendgrid-mailer .
Хотя вспомогательные классы Sendgrid полезны за кулисами для создания и проверки моделей электронной почты, я не думаю, что их следует заставлять нас просто взаимодействовать с API. Я считаю, что это делает написание приложений для Node более сложным, чем должно быть, и название помощников может быть довольно запутанным, например,
Mail
vsEmail
.Я думаю, что основной пример хорошо иллюстрирует проблему:
https://github.com/sendgrid/sendgrid-nodejs#with -mail-helper-class
Это кажется слишком запутанным для такой простой вещи, как «Я хочу отправить электронное письмо». Перед отправкой электронного письма вам необходимо загрузить 8 различных зависимостей и написать 15 строк кода.
Не использовать вспомогательные классы, пожалуй, еще хуже, поскольку тогда вам нужно знать требуемую структуру запроса JSON электронной почты и правильно ее заполнить. Одна ошибка легко сломает запрос.
Поэтому я абстрагировал всю логику вспомогательных классов за простым и легким в использовании помощником API, так что отправка писем с помощью Sendgrid снова стала простой и увлекательной :)
Самый простой пример:
Запрос создается за кулисами и прозрачно использует помощников Sendgrid.
Он также поддерживает отправку нескольких электронных писем, предоставляет объект Sendgrid в случае необходимости дальнейшей настройки, также принимает экземпляры Sendgrid
Mail
и принимает широкий спектр форматов для полей to / from, напримерName <[email protected]>
или объект со свойствами имени / адреса электронной почты. Смотрите README для более подробной информации.Вероятно, еще есть возможности для улучшения, но я хотел бы поделиться этим решением здесь для людей, которые хотят использовать API Sendgrid, не будучи перегруженными им.
Надеюсь, что это пригодится кому-то, и, возможно, это может дать какое-то направление для будущего этой библиотеки, предлагая более простой API :)
cc @julesbou немного опоздал, но я надеюсь, что вы все еще можете найти ему применение.