Sendgrid-nodejs: Неожиданная ошибка при попытке отправить транзакционное письмо

Созданный на 31 авг. 2017  ·  23Комментарии  ·  Источник: sendgrid/sendgrid-nodejs

Резюме проблемы

Получение ошибки «неверный запрос» со следующей полезной нагрузкой.

Запрос

cosnt msg = {
        "to": "[email protected]",
        "from": "[email protected]",
        "subject": "Support Pay Transparency at PayCheck",
        "templateId": "24ae3147-4faa-4380-8613-c5be144f4542",
        "customArgs": {
            "ally_id": "cj6zlh7yd000001qir4r5suuk"
        }
};
sgMail.send(msg)

отклик

{
        "message": "Bad Request",
        "code": 400,
        "response": {
            "headers": {
                "server": "nginx",
                "date": "Wed, 30 Aug 2017 22:30:41 GMT",
                "content-type": "application/json",
                "content-length": "365",
                "connection": "close",
                "access-control-allow-origin": "https://sendgrid.api-docs.io",
                "access-control-allow-methods": "POST",
                "access-control-allow-headers": "Authorization, Content-Type, On-behalf-of, x-sg-elas-acl",
                "access-control-max-age": "600",
                "x-no-cors-reason": "https://sendgrid.com/docs/Classroom/Basics/API/cors.html"
            },
            "body": {
                "errors": [
                    {
                        "message": "Unless a valid template_id is provided, the content parameter is required. There must be at least one defined content block. We typically suggest both text/plain and text/html blocks are included, but only one block is required.",
                        "field": "content",
                        "help": "http://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/errors.html#message.content"
                    }
                ]
            }
        }
    }

Заметки

В документации написано templateId но в сообщении об ошибке написано template_id . Я пробовал оба и получил такое же сообщение об ошибке. Я прикрепил снимок экрана с моим шаблоном для проверки работоспособности, чтобы убедиться, что он правильно настроен в sendgrid.

Технические подробности:

  • sendgrid-nodejs Версия: master (последняя фиксация: [номер фиксации])
  • Node.js Версия: 6.10.3
  • Запуск в функции AWS Lambda

screen shot 2017-08-30 at 6 43 57 pm

help wanted bug

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

Спасибо за помощь пищит. Я буквально терял рассудок. Вчера поздно вечером я наконец придумал обходной путь и приходил сюда, чтобы сообщить больше информации, но похоже, что вы все уже используете это :-)

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

@onesien API почтовой программы JS нового узла не зависит от регистра, поэтому вы можете использовать как templateId и template_id . Случай верблюда более распространен в области JS, поэтому мы добавили его поддержку, в то время как сам API использует случай змеи.

Я посмотрю, что происходит с идентификатором шаблона

Привет @onesien!

Вы также можете обратиться в службу поддержки . Я думаю, проблема может быть связана со старым редактором шаблонов.

Можете ли вы также попробовать создать новый шаблон и использовать этот идентификатор?

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

Элмер

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

@adamreisnz ,

Мои локальные тесты работают, но у меня в аккаунте только новые шаблоны.

Я дважды проверю

Нет, я использовал новый шаблон, только что созданный, возникла та же проблема

Следующее работает для меня (с использованием версии v6.1.1), следуя приведенному здесь примеру:

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    personalizations:[{
      to: '[email protected]',
      substitutions: {'name':'John', 'city':'Denver'}
    }],
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    html: 'email text goes here',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932'
  };

//send 
sendGridMail.send(mailOptions);

Ах, я думаю, что у нас есть старая ошибка, когда API требует блокировать контент во всех случаях. Итак, это работает:

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    to: '[email protected]',
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932',
    html: ' ',
    substitutions: {
      name: 'Some One',
      city: 'Denver',
    }
  };

//send 
sendGridMail.send(mailOptions);

но не это:

// Setup sendgrid api
const sendGridMail = require('@sendGrid/mail');
sendGridMail.setApiKey(process.env.SENDGRID_API_KEY);
sendGridMail.setSubstitutionWrappers('-', '-');

//build object 
var mailOptions = {
    to: '[email protected]',
    from: '[email protected]',
    reply_to: '[email protected]',
    subject: 'Hello',
    templateId: '13b8f94f-bcae-4ec6-b752-70d6cb59f932',
    substitutions: {
      name: 'Some One',
      city: 'Denver',
    }
  };

//send 
sendGridMail.send(mailOptions);

Внутренняя проверка ...

Мне пришлось добавить блок содержимого, чтобы отправить шаблон. Я получал _Bad Request (400) "Если не указан действительный template_id, параметр содержимого обязателен. Должен быть хотя бы один определенный блок содержимого ..." _ при использовании шаблона, созданного в новом редакторе html.

sgMail.setApiKey(sgKey);
sgMail.setSubstitutionWrappers('-', '-');
var msg: any = {
  to: email,
  from: '[email protected]',
  templateId: 'xxxxxxx',
  substitutions: {
     verifyUrl: createAccountLink
  }
};
sgMail.send(msg)

Если я добавлю блок содержимого, электронное письмо с шаблоном будет отправлено в редакторе html в формате.

sgMail.setApiKey(sgKey);
sgMail.setSubstitutionWrappers('-', '-');
var msg: any = {
  to: email,
  from: '[email protected]',
  content: [{"type":"text/html","value":"0"}],
  templateId: 'xxxxxx',
  substitutions: {
     verifyUrl: createAccountLink
  }
};
sgMail.send(msg)

Хорошо, я оставляю это открытым как ошибку.

Я предполагаю, что этот SDK добавляет пустой объект содержимого, если он не установлен. Я думаю, нам нужно пропустить эти функции, когда html и txt не установлены.

На данный момент вышеуказанный обходной путь сделает то, что вам нужно.

@thinkingserious Думаю, ты прав. Я прочитал документацию по API и подумал, что это поле является обязательным. В нем есть только хорошо скрытый комментарий (который великолепно оформлен!), Который я пропустил:

image

Я создам PR для решения этой проблемы!

Хе-хе, спасибо Адаму!

PR установлен, это должно решить проблему, а не отправлять поле содержимого с запросом, если контент не предоставлен.

Спасибо за помощь пищит. Я буквально терял рассудок. Вчера поздно вечером я наконец придумал обходной путь и приходил сюда, чтобы сообщить больше информации, но похоже, что вы все уже используете это :-)

Извините за @onesien ,

Исправление только что было отправлено в npm (v6.1.2).

Я использовал дословный код из ответа @thinkingserious, и у возникают проблемы.

Я просто пытаюсь получить самые простые замены в шаблоне, который я создал в sengrid, для отправки. Ответ в CloudWatch (поскольку он работает в Lambda) отображается как 202, но я получаю электронное письмо: A message was received from this address by our systems that had errors in the smtpapi header, and cannot be processed. The error detected was: The template id must be a valid template id for your account.

Что я здесь делаю не так, ребята? Я пытаюсь просеять документы sendgrid, но все кажется действительно разрозненным.

Как вы отправляете идентификатор шаблона? Это через переменную окружения при вызове лямбды?

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

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(
  "XXXXX"
);
sgMail.setSubstitutionWrappers("%", "%"); // Configure the substitution tag wrappers globally
  const msg = {
    to: formFields.toEmail,
    from: formFields.fromEmail,
    subject: "Hello world",
    text: "test",
    html: "<p>test</p>",
    templateId: "be2cc0da-5b2c-428f-8e45-c140f6cfb6eb",
    substitutions: {
      name1: formFields.fromName,
      name2: formFields.fromName,
      date: formFields.date
    }
  };

  sgMail.send(msg);

@tetreault Ознакомьтесь с моим ответом выше, я добавляю content: [{"type":"text/html","value":"0"}], в свою функцию, и это сработало. Неизвестно почему.

просто попробовал, к сожалению, не изменил конечный результат @cbilliau :(. Получил то же письмо:

A message was received from this address by our systems that had errors in the smtpapi header, and cannot be processed. 
The error detected was: The template id must be a valid template id for your account. You provided be2cc0da-5b2c-428f-8e45-c140f6cfb6eb 

вау, позволь мне поклониться на секунду @cbilliau 🤣 я просто торопился с вещами и не обращал больше внимания. Я понял, что получаю уникальный идентификатор для шаблона, который я создал в разделе «маркетинг», а не в «шаблонах транзакций». Я не очень часто использую интерфейс sendgrid и просто напортачил с этим lol

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

кк - подтверждение его работа в настоящее время, особенно с помощью content: [{ type: "text/html", value: "0" }] линии, @cbilliau упомянутого 👍

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