Sendgrid-nodejs: Substitusi tidak berfungsi

Dibuat pada 10 Apr 2018  ·  43Komentar  ·  Sumber: sendgrid/sendgrid-nodejs

Ringkasan Masalah

Mengikuti contoh penggunaan substitusi di email transaksional , tanpa melakukan perubahan apa pun. Tag substitusi dihapus, tetapi teks tidak dimasukkan. Berikut tangkapan layar dari email yang saya terima:

image

Langkah-langkah untuk Mereproduksi

  1. Klon https://github.com/panayi/test-sg/
  2. Salin badan template dari contoh dan buat template transaksional di SendGrid UI.
  3. Edit test.js untuk memasukkan kunci API Anda, alamat email Anda, dan templateId Anda buat di atas.
  4. Jalankan node test.js .

Detail teknis:

unknown or a help wanted question

Komentar yang paling membantu

Hai, setelah membaca komentar @himanshupnt , saya menguji dengan template lama dan berhasil. Terima kasih @himanshupnt .

Kemudian saya menemukan dokumentasi Sendgrid Pengiriman Surat dengan Template Transaksional Dinamis , saya sudah mendapatkan template baru (bukan yang lama) berfungsi. Saya menggunakan template HTML yang sama dan kode saya telah diperbarui menjadi:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Perhatikan bahwa saya mengganti "substitusi" dengan "dynamic_template_data", dan menempatkan "ke" di dalam "personalisasi" seperti yang diharuskan oleh dokumen. Dan saya juga memperlakukan subjek sebagai salah satu "dynamic_template_data" dan berhasil. (letakkan {{subject}} di bidang subjek template)

Terima kasih.

Semua 43 komentar

Halo @panayi ,

Beberapa hal yang perlu diperiksa:

  1. Pastikan ID Template sudah benar
  2. Verifikasi bahwa Template ditandai aktif di UI

Bisakah Anda juga membagikan seperti apa tampilan HTML Anda?

Terima kasih!

Salam hangat,

Elmer

Halo, @thinkingserious , saya dapat mereproduksi masalah yang sama seperti yang disebutkan @panayi .
Kode Html saya terlihat seperti ini

Halo first_name (Karyawan: employee_id)
Beberapa kode HTML

Kode

sgMail.setApiKey('apikey');
sgMail.setSubstitutionWrappers('{{', '}}'); // Triied sgMail.setSubstitutionWrappers('-', '-'); as well`

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  subject: 'Hello world',
  text: 'Hello plain world!',
  html: 'Hello HTML world!',
  templateId: 'template-id',
  substitutions: {
    first_name: 'Tejas',
    employee_id: 'emp123',
  },
};
sgMail.send(msg);

Catatan: Saya bahkan sudah mencoba menggunakan substitutionWrappers: ['{{', '}}']
dalam pesan tetapi tidak berhasil.

Detail teknis:

Bantuan / Perbaikan Apa Pun Dihargai karena saya telah menginvestasikan banyak waktu untuk masalah ini

Halo @tjlekr ,

Dalam kode HTML Anda, harap ubah first_name menjadi {{first_name}} dan employee_id menjadi {{employee_id}} .

Terima kasih!

Salam hangat,

Elmer

Halo @thinkingserious ,
Dengan kode HTML, Apakah yang Anda maksud adalah kode template?
Mengapa tag substitusi berfungsi dengan baik saat ditentukan dalam isi permintaan di sini , tetapi tidak saat menggunakan contoh yang telah ditentukan sebelumnya di halaman ?
Terima kasih!

Ya @tjstlekr , maksud saya kode template seperti yang dijelaskan dalam contoh ini .

Saya tidak dapat menjawab pertanyaan kedua Anda tanpa contoh konkret. (misalnya, tubuh permintaan dan kode template).

Salam hangat,

Elmer

Dengan sedih! Saya tidak memiliki akses ke kode template. Saya akan tetap menggunakan versi lain.
Terima kasih lagian @thinkingserious

Sudahkah Anda mencoba:

substitutions: {
    'first_name': 'Tejas',
    'employee_id': 'emp123',
  },

Ya, @thinkingserious mencobanya. Saya juga mencoba cara-cara berikut


substitutions: {
    '-first_name-': 'Tejas',
    '-employee_id-': 'emp123',
  },

substitutions: {
    '%first_name%': 'Tejas',
    '%employee_id%': 'emp123',
  },

substitutions: {
    '=first_name=': 'Tejas',
    '=employee_id'=: 'emp123',
  },

@tokopedia

Saya pikir solusi Anda adalah meminta siapa pun yang dapat mengubah kode template HTML untuk membungkus variabel dengan karakter pengganti.

Salam hangat,

Elmer

@thinkingserious benar. Variabel template HARUS dibungkus dengan tanda kurung ganda {{name}}. Jika tidak, SendGrid tidak akan tahu ke mana harus menjatuhkan substitusi yang Anda kirim.

variabel benar-benar membutuhkan tanda kurung ganda? saya akan melanjutkan dan mencobanya tetapi posting yang berbeda oleh orang yang sama menunjukkan pergantian pemain dengan tanda hubung, bukan tanda kurung ganda:
screenshot 2018-06-26 14 08 12

Halo @tetreault ,

Secara default kami menggunakan tanda kurung ganda. setSubstitutionWrappers memungkinkan Anda untuk memodifikasinya seperti yang Anda tunjukkan.

Terima kasih!

Salam hangat,

Elmer

Saya mengalami masalah yang sama dengan @panayi .

Saya mengikuti contoh template-transaksional . Saya telah menetapkan pembungkus substitusi dan dalam templatnya, membungkus substitusi dalam tanda kurung ganda. Namun, email yang saya terima telah menghapus semua substitusi tanpa menggantinya dengan yang saya berikan.

Saya mencoba dengan editor Kode dan editor Desain untuk template.

Detail teknis:

Terima kasih!

Halo @nrator ,

Jika substitusi diganti dengan string kosong, saya akan memeriksa ulang bahwa variabel yang Anda iterasi tidak kosong. Jika Anda memverifikasi bahwa mereka tidak kosong, dapatkah Anda membagikan cuplikan kode bersama dengan HTML yang relevan sehingga saya dapat mencoba dan mereproduksi?

Terima kasih!

Salam hangat,

Elmer

Hai @serius

Saya tidak menggunakan variabel tetapi string sehingga tidak kosong. Di bawah ini adalah cuplikan kode, HTML dan hasil yang saya dapatkan:

Kode

const sgMail = require("@sendgrid/mail");
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

const msg = {
  from: "[email protected]", // my personal email
  to: "[email protected]", // my another personal email
  subject: "Hello world",
  text: "Hello plain world!",
  html: "<p>Hello HTML world!</p>",
  templateId: "d-27e7d954368c46519eddc806e5cf8156",
  substitutions: {
    name: "Some One",
    city: "Denver"
  }
};

  sgMail.send(msg).catch(err => console.error(err.message));

Template HTML

<html>
<head>
    <title></title>
</head>
<body>
Hello {{name}},
<br /><br/>
I'm glad you are trying out the template feature!
<br /><br/>
<%body%>
<br /><br/>
I hope you are having a great day in {{city}} :)
<br /><br/>
</body>
</html>

Email yang saya dapatkan

Hello , 

I'm glad you are trying out the template feature! 

<%body%> 

I hope you are having a great day in :) 

Detail teknis
sendgrid-nodejs Versi: @ sendgrid / [email protected]
Versi Node.js: 8.11.2

Salam Hormat,
Jason

Hai, saya mengalami masalah yang sama dengan template transaksional. Variabel tidak akan diambil. Menggunakan data uji untuk melihat pratinjau template di dasbor SG, semuanya terlihat benar.
Email dikirim ke orang yang tepat, dan dengan template yang benar kecuali, nilai variabel tidak ada.
Saya membuat template lama 2 hari yang lalu yang berfungsi dengan baik dan hari ini saya beralih ke yang lebih baru
template transaksional dan tidak berfungsi. Saya baru saja menduplikasi template lama yang dulu
bekerja dengan baik.
"@ sendgrid / mail": "6.3.1" | Node.js 8.10
Ini kode saya:

async function sendEmail({ email, firstName, password }) {
  const msg = {
    to: [{ email, firstName }],
    from: {
      email: "[email protected]",
      name: "name"
    },
    asm: {
      group_id: 1234
    },
    templateId: "d-64b15a042b2d41d7a4b5b6a4eea649c5",
    substitutions: {
      userName: firstName,
      email,
      password
    }
  }
  try {
    await sgMail.send(msg);
  } catch(e){
    e.message
  }

  };

Dan inilah template html-nya:

<h3>Hi {{userName}},</h3>

<div><span style="font-size:16px;">Your account has been setup. To login please use</span></div>

<div><span style="font-size:16px;">the credentials below.</span></div>

<div>&nbsp;</div>

<div><span style="font-size:16px;"><strong>Email:</strong>&nbsp;{{email}}</span></div>

<div><strong><span style="font-size:16px;">Password:&nbsp;</span></strong><span style="color: rgb(0, 0, 0); font-family: arial; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400;">{{password}}</span></div>

<div><span style="font-weight: 600; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-family: arial; font-size: 14px; color: rgb(0, 0, 0);"><span style="font-size: 16px;">SignIn Url: <a href="https://a.abc.com">https://a.abc.com/</a></span></span></div>

<div>&nbsp;</div>

<div>&nbsp;</div>

<div><span style="font-size:16px;">Please let us know if you need any help, email us at <a href="mailto:[email protected]">[email protected]</a></span></div>

Bersulang

Saya baru saja beralih ke template lama dengan kode html yang sama dan berhasil. Bisakah itu karena perubahan baru di V3 API?

Hai, setelah membaca komentar @himanshupnt , saya menguji dengan template lama dan berhasil. Terima kasih @himanshupnt .

Kemudian saya menemukan dokumentasi Sendgrid Pengiriman Surat dengan Template Transaksional Dinamis , saya sudah mendapatkan template baru (bukan yang lama) berfungsi. Saya menggunakan template HTML yang sama dan kode saya telah diperbarui menjadi:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Perhatikan bahwa saya mengganti "substitusi" dengan "dynamic_template_data", dan menempatkan "ke" di dalam "personalisasi" seperti yang diharuskan oleh dokumen. Dan saya juga memperlakukan subjek sebagai salah satu "dynamic_template_data" dan berhasil. (letakkan {{subject}} di bidang subjek template)

Terima kasih.

@nrator Itu melakukannya untuk saya juga. Terima kasih telah mempostingnya!

Saya mengalami masalah yang sama dan saya juga membuka masalah (Setelah mencoba solusi yang disebutkan di awal). Namun saya bisa menambahkan name dan city ke template berikut yang disebutkan oleh @nrator . Tetapi tidak dapat mengganti <%subject%> dan <%body%> karena sudah termasuk dalam email yang saya terima. Bagaimana cara mengganti <%body%> dan <%subject%> ? @himanshupnt bagaimana Anda mengatasi ini?

Hai @ pankaja92 , saya juga tidak bisa membuat <% subject%> bekerja. Sekarang cara saya menangani subjek adalah memperlakukannya sebagai salah satu "dynamic_template_data", yang berarti saya membungkusnya dalam {{}} bukan <%%> dan menanganinya di dalam "dynamic_template_data".

Saya telah menemukan dokumen sendgrid ini yang mungkin membantu. Parameter subjek tampaknya tidak berfungsi.

@ator Terima kasih. Berhasil. Jadi, tidak perlu <% body%> juga kan (karena itu juga tidak akan berfungsi seperti contoh yang diberikan).

Ngomong-ngomong, bukan masalah spesifiknya - tetapi, apakah Anda memiliki pengalaman atau contoh untuk mengirim daftar detail melalui pustaka ini? Saya mencari sesuatu yang dapat membantu saya membangun aplikasi saya :)

@ pankaja92 Saya tidak yakin apa yang Anda maksud dengan mengirimkan daftar detil. Anda dapat membaca postingan blog sendgrid ini tentang fitur-fitur baru dari template dinamis, pada dasarnya Anda sekarang dapat mengulang daftar item atau menggunakan persyaratan dasar untuk menghasilkan konten dinamis.

Untuk kode sebenarnya, Anda dapat merujuk ke repo ini .

Semoga membantu!

Halo semuanya, menghabiskan beberapa jam untuk masalah ini juga.

Alih-alih menggunakan substitutions , gunakan dynamicTemplateData di objek msg sebagai gantinya:

const sgMail = require('@sendgrid/mail')

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referensi: https://github.com/sendgrid/sendgrid-nodejs/pull/691

Menurut PR tersebut, ketika templateId adalah template dinamis (diawali dengan d- ), substitutions tidak dikirim sama sekali, jadi dynamicTemplateData objek harus digunakan.

Mereka telah membuat masalah di sini untuk meningkatkan penggunaan templat dinamis tambahan ke dokumen, tetapi sampai saat itu saya harap ini membantu. 🎉

Harap ikuti masalah ini: # 703

ubah 'substitusi' menjadi 'dynamic_template_data'

@jseyfert bukankah seharusnya dynamic_template_data ?

@aroach Anda benar. Saya telah memperbarui komentar saya.

Pada awalnya itu juga tidak berhasil di pihak saya.
Saya perhatikan bahwa versi saya agak ketinggalan zaman (saya menggunakan @ sendgrid / mail @ 6.2.1)
Saya telah memperbarui paket, mengubah kode saya dan sekarang berfungsi:

menggunakan @ sendgrid / [email protected]

const result = await this.sgMail.send({
                personalizations: [{
                    to: this._to
                }],
                dynamicTemplateData: {
                    test: 'test' <== working (code in template: {{ test }})
                },
                templateId: this._templateId,
            });

Saya harus mencatat bahwa kode di bawah ini tidak berfungsi:

const result = await this.sgMail.send({
                personalizations: [{
                    to: this._to,
                dynamicTemplateData: {
                    test: 'test' <== NOT working (code in template: {{ test }})
                }
                }],
                templateId: this._templateId,
            });

Ya, Anda perlu menggunakan v6.3.1 untuk dukungan dynamic_template_data.

Pada Sel, 11 Des 2018 pukul 4:15, Roy Milder [email protected] menulis:

Pada awalnya itu juga tidak berhasil di pihak saya.
Saya perhatikan bahwa versi saya agak ketinggalan zaman (saya menggunakan
@ sendgrid / mail @ 6.2.1)
Saya telah memperbarui paket, mengubah kode saya dan sekarang berfungsi:

menggunakan @ sendgrid / [email protected]

hasil const = tunggu this.sgMail.send ({
personalisasi: [{
ke: this._to
}],
dynamicTemplateData: {
tes: 'test' <== bekerja (kode dalam template: {{test}})
},
templateId: this._templateId,
});

-
Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/sendgrid/sendgrid-nodejs/issues/676#issuecomment-446166152 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ACL-sjFRFP8txUETNWFVLs0chW5yyL1Nks5u35OzgaJpZM4TOB5l
.

Hai jangan lupa
bukan membuat template transaksional, membuat template lama, dan menyalinnya.
maka setiap langkah yang Anda lakukan akan berhasil.

dynamicTemplateData

Bekerja untuk saya. Saya memiliki versi terbaru pustaka SendGrid, dan saya menggunakannya melalui Firebase (Functions). Masalah utama sekarang adalah kurangnya dukungan TypeScript - dan dokumentasinya.

@roymilder , terima kasih banyak. Jawaban Anda membuat hari saya menyenangkan - penggantian template dinamis sangat tidak jelas.
Pujian!

Halo @OleksiiM ,

Apakah contoh ini membantu?

@ darren-dev,

Terima kasih telah membantu! Sehubungan dengan kurangnya dukungan dan dokumentasi TypeScript, apakah Anda mengacu pada sisi Firebase?

@septianjoko_

Terima kasih telah membantu!

Salam hangat,

Elmer

@thinkingserious , ya benar. Terima kasih.

@Oleksi ,

Di mana Anda melihat pertama kali? Saya mencoba mencari cara untuk memastikan orang-orang yang perlu menggunakan template dinamis membuka tautan yang saya kirimkan kepada Anda terlebih dahulu.

@serius
Dimulai dari sini .

Ia mengatakan:
"Mengirim Template Transaksional
Anda dapat mengirim template transaksional menggunakan salah satu dari tiga cara berikut:
Menggunakan Relai SMTP
Menyertakan ID template dalam parameter template titik akhir Pengiriman Email API Web v3
Menggunakan parameter x-smtpapi di titik akhir Pengiriman Email API Web v2 "

Jadi saya melompat ke "Memasukkan ID template dalam parameter template dari titik akhir Pengiriman Email API Web v3 ".

Mengapa tidak jelas:
halaman terakhir menampilkan daftar kemungkinan "Minta parameter tubuh" yang menampilkan template_id tetapi tidak menyebutkan apa pun tentang kolom "dynamic_template_data". Saya telah mencoba menggunakan "personalisasi" + "substitusi" + "template_id" dan tidak berhasil.
Selain itu, karena saya adalah pengguna Sendgrid baru, saya tidak mengetahui template "lama" dan template "baru" (dinamis) dan perbedaan di antara keduanya (halaman doc sendgrid dari atas tidak mengatakan apa-apa tentang itu).

Terima kasih telah bertanya dan membuat dokumen menjadi lebih baik. Saya berharap orang lain akan menghindari masalah seperti ini.

@thinkingserious jika saya boleh menambahkan:
Saat ini saya menggunakan dokumen ini: https://sendgrid.com/docs/API_Reference/api_v3.html

Petunjuk pengiriman email (https://sendgrid.api-docs.io/v3.0/mail-send) tidak menyebutkan dynamic_template_data sama sekali dalam personalisasi.

Jadi itu juga tidak jelas.

Semoga membantu!

@Whatefan

Terima kasih @OleksiiM & @roymilder! Kami menghargai kontribusi Anda kembali ke komunitas Twilio SendGrid :)

Halo semuanya, menghabiskan beberapa jam untuk masalah ini juga.

Alih-alih menggunakan substitutions , gunakan dynamicTemplateData di objek msg sebagai gantinya:

const sgMail = require('@sendgrid/mail')

sgMail.setApiKey(process.env.SENDGRID_API_KEY)
sgMail.setSubstitutionWrappers('{{', '}}')

const msg = {
  to: '[email protected]',
  from: '[email protected]',
  templateId: 'd-27e7d954368c46519eddc806e5cf8156',
  dynamicTemplateData: {
    name: 'Some One',
    city: 'Denver',
  },
}

sgMail.send(msg)

Referensi: # 691

Menurut PR tersebut, ketika templateId adalah template dinamis (diawali dengan d- ), substitutions tidak dikirim sama sekali, jadi dynamicTemplateData objek harus digunakan.

Mereka telah membuat masalah di sini untuk meningkatkan penggunaan templat dinamis tambahan ke dokumen, tetapi sampai saat itu saya harap ini membantu. 🎉

Bergegas sejak 2 hari saya melihat ini dan membuat ini berfungsi.

Halo @Travotics ,

Dokumentasi apa yang Anda mulai sebelum Anda menemukan yang di atas? Saya mencoba meningkatkan pengalaman ini. Terima kasih!

Salam hangat,

Elmer

@thinkingserious https://github.com/sendgrid/sendgrid-nodejs/blob/master/use-cases/kitchen-sink.md

Tidak memiliki dynamicTemplateData tetapi memiliki substitutionWrappers dan substitutions .

Selain memperbarui dokumen, sebaiknya perbarui antarmuka jenis MailData (https://github.com/sendgrid/sendgrid-nodejs/blob/master/packages/helpers/classes/ mail.d.ts # L117). Untuk rilis @ sendgrid / mail yang tidak mendukung substitutions , mereka harus mengharapkan parameter V2MailData yang bidang substititons dan substitutionWrappers dihilangkan.

Hai, setelah membaca komentar @himanshupnt , saya menguji dengan template lama dan berhasil. Terima kasih @himanshupnt .

Kemudian saya menemukan dokumentasi Sendgrid Pengiriman Surat dengan Template Transaksional Dinamis , saya sudah mendapatkan template baru (bukan yang lama) berfungsi. Saya menggunakan template HTML yang sama dan kode saya telah diperbarui menjadi:

  const sgMail = require("@sendgrid/mail");
  sgMail.setApiKey(process.env.SENDGRID_API_KEY);
  sgMail.setSubstitutionWrappers("{{", "}}"); // Configure the substitution tag wrappers globally

  const msg = {
    from: "[email protected]",
    templateId: "d-27e7d954368c46519eddc806e5cf8156",
    personalizations: [
      {
        to: [
          {
            email: "[email protected]"
          }
        ],
        dynamic_template_data: {
          name: "Someone",
          city: "Somewhere",
          subject: "Hello new world"
        }
      }
    ]
  };

  sgMail.send(msg).catch(err => console.error(err.message));

Perhatikan bahwa saya mengganti "substitusi" dengan "dynamic_template_data", dan menempatkan "ke" di dalam "personalisasi" seperti yang diharuskan oleh dokumen. Dan saya juga memperlakukan subjek sebagai salah satu "dynamic_template_data" dan berhasil. (letakkan {{subject}} di bidang subjek template)

Terima kasih.

Terima kasih banyak untuk ini! Saya telah menghabiskan banyak waktu untuk men-debug untuk ini. : /

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

thinkingserious picture thinkingserious  ·  4Komentar

egges picture egges  ·  3Komentar

danielflippance picture danielflippance  ·  4Komentar

polkhovsky picture polkhovsky  ·  3Komentar

Loriot-n picture Loriot-n  ·  4Komentar