Obtendo um erro de 'Solicitação inválida' com a carga útil a seguir.
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"
}
]
}
}
}
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.
@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:
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 👍
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 :-)