Sendgrid-nodejs: Erro inesperado ao tentar enviar e-mail transacional

Criado em 31 ago. 2017  ·  23Comentários  ·  Fonte: sendgrid/sendgrid-nodejs

Resumo do problema

Obtendo um erro de 'Solicitação inválida' com a carga útil a seguir.

Solicitação

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)

Resposta

{
        "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"
                    }
                ]
            }
        }
    }

Notas

Na documentação diz templateId mas na mensagem de erro diz template_id . Tentei os dois e recebi a mesma mensagem de erro. Anexei uma captura de tela da minha tela de modelo como uma verificação de sanidade para ter certeza de que a tenho configurado corretamente no sendgrid.

Detalhes técnicos:

  • Versão sendgrid-nodejs: master (commit mais recente: [número do commit])
  • Versão Node.js: 6.10.3
  • Executando em uma função AWS Lambda

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

help wanted bug

Comentários muito úteis

Obrigado pela ajuda peeps. Eu estava literalmente perdendo minha cabeça. Eu finalmente descobri uma solução alternativa na noite passada e estava vindo aqui para relatar mais informações, mas parece que todos vocês já estão trabalhando nisso :-)

Todos 23 comentários

@onesien, o novo nó JS mailer API é templateId ou template_id . O caso do camelo é mais comum em terras JS, portanto, adicionamos suporte para isso, enquanto a própria API consome o caso da cobra.

Vou dar uma olhada para ver o que está acontecendo com o ID do modelo

Olá @onesien ,

Você também pode querer verificar com o suporte . Acho que o problema pode estar relacionado ao antigo editor de modelos.

Você também pode tentar fazer um novo modelo e usar esse ID?

Obrigado pela atenção,

Elmer

@thinkingserious você pode verificar isso do seu lado? Parece que estamos enviando corretamente o parâmetro template_id com a solicitação. Acabei de criar um novo modelo e também estou conseguindo esse problema.

@adamreisnz ,

Meus testes locais estão funcionando, mas só tenho novos modelos em nossa conta.

Vou verificar novamente

Não, usei um novo modelo, recém-criado, obtendo o mesmo problema

O seguinte funciona para mim (usando a versão v6.1.1) seguindo o exemplo aqui :

// 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);

Ah, acho que temos um antigo bug ressurgindo, onde a API está exigindo um bloco de conteúdo em todos os casos. Então isso funciona:

// 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);

mas não este:

// 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);

Verificando internamente ...

Tive que adicionar o bloco de conteúdo para que o modelo fosse enviado. Eu estava recebendo um _Bad Request (400) "A menos que um template_id válido seja fornecido, o parâmetro de conteúdo é necessário. Deve haver pelo menos um bloco de conteúdo definido ..." _ ao usar o modelo criado no novo editor de html.

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

Se eu adicionar o bloco de conteúdo, o email do modelo é enviado formatado no editor de 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)

OK, estou deixando isso aberto como um bug.

Meu palpite é que este SDK está adicionando um objeto de conteúdo vazio quando não está definido. Acho que precisamos pular essas funções quando html e txt não estão definidos.

Por enquanto, a solução alternativa acima fará o que você precisa.

@thinkingserious Acho que você está certo. Eu li a documentação da API e achei o campo obrigatório. Ele só tem um comentário bem escondido (que tem um estilo incrível!) Que eu perdi:

image

Vou criar um PR para resolver isso!

Hehe, obrigado Adam!

PR está ativo, isso deve resolver o problema e não enviar o campo de conteúdo com a solicitação se não houver conteúdo fornecido.

Obrigado pela ajuda peeps. Eu estava literalmente perdendo minha cabeça. Eu finalmente descobri uma solução alternativa na noite passada e estava vindo aqui para relatar mais informações, mas parece que todos vocês já estão trabalhando nisso :-)

Desculpe por isso @onesien ,

A correção acaba de ser enviada para npm (v6.1.2).

Usei o código literalmente da resposta de @thinkingserious e ainda estou tendo problemas.

Estou apenas tentando fazer com que as substituições mais básicas em um modelo que criei no sengrid sejam enviadas. A resposta no CloudWatch (uma vez que está sendo executado no Lambda) é exibida como 202, mas o e-mail que recebo é: 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.

O que estou fazendo de errado aqui, pessoal? Estou tentando vasculhar os documentos do sendgrid, mas tudo parece realmente fragmentado.

Como você está enviando o ID do modelo? É por meio de uma variável ambiental quando o lambda é chamado?

obrigado pela resposta rápida @cbilliau - não, no meu caso, a string do modelo está codificada, pois estou apenas tentando obter o andaime funcional entre a frente e o back-end. Meu exemplo literal é:

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 Verifique minha resposta acima, adicionei content: [{"type":"text/html","value":"0"}], à minha função e funcionou. Desconhecido por quê.

acabei de experimentar, infelizmente não alterou o resultado final @cbilliau :(. Recebi o mesmo e-mail de volta:

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 

uau, deixe-me sair por um segundo @cbilliau 🤣 eu só estava correndo atrás das coisas e não prestei mais atenção. Percebi que estava pegando a ID exclusiva de um modelo que fiz em "marketing", mas não em "modelos transacionais". Eu não uso muito a IU do sendgrid e simplesmente estraguei tudo isso lol

Palma do rosto total, fixando-se na minha extremidade e então esperando que funcione.

kk - confirmando seu funcionamento agora, especialmente usando a linha content: [{ type: "text/html", value: "0" }] que @cbilliau mencionou 👍

Esta página foi útil?
0 / 5 - 0 avaliações