Sendgrid-nodejs: Erreur inattendue lors de la tentative d'envoi d'un e-mail transactionnel

Créé le 31 août 2017  ·  23Commentaires  ·  Source: sendgrid/sendgrid-nodejs

Résumé de la question

Obtention d'une erreur 'Bad Request' avec la charge utile suivante.

Demande

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)

Réponse

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

Remarques

Dans la documentation, il dit templateId mais dans le message d'erreur, il dit template_id . J'ai essayé les deux et j'ai reçu le même message d'erreur. J'ai joint une capture d'écran de mon écran de modèle en guise de vérification de cohérence pour m'assurer de l'avoir configuré correctement dans sendgrid.

Détails techniques:

  • sendgrid-nodejs Version: master (dernier commit: [numéro de commit])
  • Version de Node.js: 6.10.3
  • Exécution dans une fonction AWS Lambda

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

help wanted bug

Commentaire le plus utile

Merci pour l'aide peeps. J'étais littéralement en train de perdre la tête. J'ai finalement trouvé une solution de contournement tard la nuit dernière et je venais ici pour rapporter plus d'informations, mais il semble que vous soyez tous déjà dessus :-)

Tous les 23 commentaires

@onesien, le nouveau nœud JS mailer API est templateId ou template_id . Le cas de chameau est plus courant dans JS land, c'est pourquoi nous avons ajouté un support pour cela, tandis que l'API elle-même consomme un cas de serpent.

Je vais jeter un œil pour voir ce qui se passe avec l'ID de modèle

Salut @onesien ,

Vous voudrez peut-être également vérifier auprès de l' assistance . Je pense que le problème peut être lié à l'ancien éditeur de modèles.

Pouvez-vous également essayer de créer un nouveau modèle et d'utiliser cet identifiant?

Meilleures salutations,

Elmer

@thinkingserious pouvez-vous vérifier cela de votre côté? Il semble que nous envoyions correctement le paramètre template_id avec la requête. Je viens de créer un nouveau modèle et je reçois également ce problème.

@adamreisnz ,

Mes tests locaux fonctionnent, mais je n'ai que de nouveaux modèles sur notre compte.

Je vais vérifier

Non, j'ai utilisé un nouveau modèle, fraîchement créé, ayant le même problème

Ce qui suit fonctionne pour moi (en utilisant la version v6.1.1) en suivant l'exemple ici :

// 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, je pense que nous avons un vieux bug resurfaçant, où l'API nécessite un bloc de contenu dans tous les cas. Donc cela fonctionne:

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

mais pas ça:

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

Vérification en interne ...

J'ai dû ajouter le bloc de contenu pour que le modèle soit envoyé. Je recevais une _Bad Request (400) "Sauf si un template_id valide est fourni, le paramètre de contenu est requis. Il doit y avoir au moins un bloc de contenu défini ..." _ lors de l'utilisation du modèle créé dans le nouvel éditeur html.

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

Si j'ajoute le bloc de contenu, le modèle de courrier électronique est envoyé tel que formaté dans l'éditeur 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, je laisse cela ouvert comme un bug.

Je suppose que ce SDK ajoute un objet de contenu vide lorsqu'il n'est pas défini. Je pense que nous devons ignorer ces fonctions lorsque html et txt ne sont pas définis.

Pour l'instant, la solution de contournement ci-dessus fera ce dont vous avez besoin.

@thinkingserious je pense que vous avez raison. J'ai lu la documentation de l'API et j'ai pensé que le champ était obligatoire. Il n'a qu'un commentaire bien caché (qui est incroyablement stylé!) Que j'ai manqué:

image

Je vais créer un PR pour résoudre ce problème!

Héhé, merci Adam!

PR est en place, cela devrait résoudre le problème et ne pas envoyer le champ de contenu avec la demande s'il n'y a pas de contenu fourni.

Merci pour l'aide peeps. J'étais littéralement en train de perdre la tête. J'ai finalement trouvé une solution de contournement tard la nuit dernière et je venais ici pour rapporter plus d'informations, mais il semble que vous soyez tous déjà dessus :-)

Désolé pour ça @onesien ,

Le correctif vient d'être poussé vers npm (v6.1.2).

J'ai utilisé le code textuellement de la réponse de @thinkingserious et je rencontre toujours des problèmes.

J'essaie juste d'obtenir les substitutions les plus élémentaires dans un modèle que j'ai créé dans sengrid pour être envoyé. La réponse dans CloudWatch (car elle s'exécute dans Lambda) s'affiche comme 202 mais l'e-mail que je reçois est: 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.

Qu'est-ce que je fais de mal ici les gars? J'essaie de passer au crible les documents sendgrid mais tout semble vraiment fragmentaire.

Comment envoyez-vous l'ID du modèle? Est-ce via une variable d'environnement lorsque le lambda est appelé?

merci pour la réponse rapide @cbilliau - non dans mon cas, la chaîne de modèle est codée en dur car j'essaie juste de mettre l'échafaudage fonctionnel entre l'avant et l'arrière. Mon exemple textuel est:

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 Checkout ma réponse ci-dessus, j'ajoute content: [{"type":"text/html","value":"0"}], à ma fonction et cela a fonctionné. Je ne sais pas pourquoi.

juste essayé, malheureusement n'a pas changé le résultat final @cbilliau :(. J'ai reçu le même e-mail:

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 

wow laissez-moi m'incliner pendant une seconde @cbilliau 🤣 je me précipitais juste à travers des trucs et je n'ai pas fait plus attention. J'ai réalisé que je saisissais l'identifiant unique d'un modèle que j'avais créé sous "marketing" mais pas sous "modèles transactionnels". Je n'utilise pas beaucoup l'interface utilisateur de sendgrid et j'ai complètement bâclé celui-ci lol

Paume totale du visage, fixant de mon côté et espérant que cela fonctionne.

kk - confirmant son fonctionnement maintenant, en particulier en utilisant la ligne content: [{ type: "text/html", value: "0" }] que @cbilliau a mentionnée 👍

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

prasoonjalan picture prasoonjalan  ·  3Commentaires

danielflippance picture danielflippance  ·  4Commentaires

umarhussain15 picture umarhussain15  ·  3Commentaires

kiranshashiny picture kiranshashiny  ·  4Commentaires

egges picture egges  ·  3Commentaires