Cara Mengirim Email Menggunakan Gmail API Dan Node.js – Kamu tidak dapat menggunakan akun layanan untuk meniru akun Gmail, tetapi Kamu dapat menggunakan GMail API dengan Node.js dan Nodemailer untuk mengirim email dari akun Gmail atau akun Google Workspace.

“Namun, Kamu dapat menggunakan layanan pihak ketiga seperti SES Amazon atau SendGrid Twilio untuk mengirim email dari akun layanan Kamu.”

Tutorial ini menunjukkan cara mengirim email dari akun Gmail Kamu menggunakan API Gmail dan aplikasi Node.js. Gmail memberlakukan batas pengiriman 2.000 pesan per hari dengan total batas penerima 10.000 per hari. Kuota email otomatis direset pada tengah malam Waktu Pasifik.

1. Buat Google Cloud Project

Buka cloud.google.com dan buat proyek Google Cloud baru. Beri nama proyek kamu, ubah ID proyek, dan klik tombol Create.

Buat Proyek Google Cloud

2. Aktifkan Google API

Aktifkan API Gmail dengan memilih APIs & Services dari menu sebelah kiri dan klik Enable APIs and Services. API Gmail memungkinkan Kamu melihat dan mengelola data kotak surat Gmail seperti string, pesan, dan label.

Enable APIs and Services

3. Konfigurasi OAuth Consent Screen

Di bagian APIs and Services, klik OAuth Consent Screen dan setel Jenis Pengguna ke Internal. Ini memungkinkan aplikasi untuk mengakses API Gmail tanpa melalui proses validasi OAuth ekstensif yang dapat memakan waktu berminggu-minggu. Klik Save and Continue.

4. OAuth 2.0 Scopes

Di layar otorisasi, masukkan nama untuk aplikasi Kamu dan berikan alamat email agar Google dapat menghubungi Kamu jika ada perubahan di layar otorisasi.

Di layar berikutnya, Kamu harus menyediakan setidaknya satu OAuth 2.0 Scopes untuk Google API Kamu. Klik tombol Add Or Remove dan tambahkan https://www.googleapis.com/auth/gmail.send ke daftar domain. Ini karena Gmail hanya mengirim email dan tidak membaca data pengguna. Klik Save and Continue.

5. Buat Gmail OAuth Client

Di bagian APIs & Services, klik Credentials > Buat Kredensial > OAuth Client Id untuk membuat ID Klien baru yang akan digunakan untuk mengidentifikasi aplikasi Kamu ke server OAuth Google.

6. Application Type

Setel Jenis Aplikasi ke Desktop App, beri klien OAuth nama yang dapat dikenali, dan klik Create untuk menghasilkan kredensial. Nama OAuth 2.0 client hanya digunakan untuk mengidentifikasi klien di Google Cloud Console dan tidak dapat dilihat oleh pengguna aplikasi Kamu.

Download credentials ke komputer Kamu dengan mengeklik tombol Download JSON. Kami menyarankan Kamu menggunakan variabel lingkungan node untuk menyimpan kredensial Kamu dan tidak memasukkan file-file ini ke repositori Github.

{
  "installed": {
    "client_id": "4181097263-eqfdl92e3r.apps.googleusercontent.com",
    "project_id": "developer-playground",
    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
    "token_uri": "https://oauth2.googleapis.com/token",
    "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
    "client_secret": "GOCSPX-KW_5UbfcvCW9LeNsO-gD7T",
    "redirect_uris": ["http://localhost"]
  }
}

7. Dapatkan kode verifikasi

OAuth authorization sequence dimulai saat aplikasi Kamu mengalihkan pengguna ke URL Google yang berisi OAuth Client ID dan domain yang diperlukan. Google menangani autentikasi pengguna dan mengembalikan token autentikasi yang dapat ditukar aplikasi dengan token akses dan menyegarkan token.

// auth.js

const { google } = require('googleapis');
const credentials = require('./credentials.json');

const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);

const GMAIL_SCOPES = ['https://www.googleapis.com/auth/gmail.send'];

const url = oAuth2Client.generateAuthUrl({
  access_type: 'offline',
  prompt: 'consent',
  scope: GMAIL_SCOPES,
});

console.log('Authorize this app by visiting this url:', url);

Buka command prompt dan jalankan perintah berikut. Kamu akan diarahkan ke halaman verifikasi Google.

$ node auth.js

Authorize this app by visiting this url:

https://accounts.google.com/o/oauth2/v2/auth?access_type=offline&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.send&response_type=code&client_id=4181097263-eqfdl92e3r.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost

8. Buat Authorized OAuth2 Client

Browser menghasilkan token autentikasi yang dapat ditempelkan ke token.js untuk menghasilkan token akses dan menyegarkan token. Token akses berlaku selama satu jam dan aplikasi menggunakan token penyegaran untuk mendapatkan token akses baru saat token penyegaran kedaluwarsa.

// token.js

const { google } = require('googleapis');
const path = require('path');
const fs = require('fs');
const credentials = require('./credentials.json');

// Replace with the code you received from Google
const code = '4/0AX4XfWjz8e2q81iC9TFzgHCn1tdTmQyMjA';
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);

oAuth2Client.getToken(code).then(({ tokens }) => {
  const tokenPath = path.join(__dirname, 'token.json');
  fs.writeFileSync(tokenPath, JSON.stringify(tokens));
  console.log('Access token and refresh token stored to token.json');
});

Hasilkan token akses dan perbarui token dengan menjalankan perintah berikut:

$ node token.js
Access token and refresh token stored to token.json

Ini akan menambahkan file token.json baru ke direktori proyek Kamu yang berisi token akses dan token penyegaran.

$ node token.js
Access token and refresh token stored to token.json

9. Perpustakaan Pengirim Email

Hasilkan email RFC822 yang dapat dialirkan melalui SMTP menggunakan pustaka Nodemailer yang populer. Kamu juga dapat membuat pesan Mime secara manual, tetapi yang pertama lebih mudah digunakan.

// gmail.js

const { google } = require('googleapis');
const MailComposer = require('nodemailer/lib/mail-composer');
const credentials = require('./credentials.json');
const tokens = require('./tokens.json');

const getGmailService = () => {
  const { client_secret, client_id, redirect_uris } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(client_id, client_secret, redirect_uris[0]);
  oAuth2Client.setCredentials(tokens);
  const gmail = google.gmail({ version: 'v1', auth: oAuth2Client });
  return gmail;
};

const encodeMessage = (message) => {
  return Buffer.from(message).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
};

const createMail = async (options) => {
  const mailComposer = new MailComposer(options);
  const message = await mailComposer.compile().build();
  return encodeMessage(message);
};

const sendMail = async (options) => {
  const gmail = getGmailService();
  const rawMessage = await createMail(options);
  const { data: { id } = {} } = await gmail.users.messages.send({
    userId: 'me',
    resource: {
      raw: rawMessage,
    },
  });
  return id;
};

module.exports = sendMail;

10. Kirim email menggunakan Gmail API

Ini adalah langkah terakhir. Membuat objek mailOptions yang menentukan berbagai bidang untuk pesan, termasuk nama pengirim, penerima, lampiran, isi HTML, dan subjek. Kamu juga dapat menambahkan header ke pesan yang berguna untuk menambahkan informasi pelacakan pesan.

Untuk lampiran file, Kamu dapat melampirkan file langsung dari sistem file lokal ke pesan Gmail, atau Kamu dapat menyeret lampiran dari URL jarak jauh.

const fs = require('fs');
const path = require('path');
const sendMail = require('./gmail');

const main = async () => {
  const fileAttachments = [
    {
      filename: 'attachment1.txt',
      content: 'This is a plain text file sent as an attachment',
    },
    {
      path: path.join(__dirname, './attachment2.txt'),
    },
    {
      filename: 'file.pdf',
      path: 'https://alberthwrd.com/file.pdf',
    },

    {
      filename: 'image.png',
      content: fs.createReadStream(path.join(__dirname, './attach.png')),
    },
  ];

  const options = {
    to: '[email protected]',
    cc: '[email protected], [email protected]',
    replyTo: '[email protected]',
    subject: 'Hello Albert 🚀',
    text: 'This email is sent from the command line',
    html: `<p>🙋🏻‍♀️  — This is a <b>test email</b> from tutorial in <a href="https://alberthwrd.com/">AlbertHoward Blogs</a>.</p>`,
    attachments: fileAttachments,
    textEncoding: 'base64',
    headers: [
      { key: 'X-Application-Developer', value: 'Albert Howard' },
      { key: 'X-Application-Version', value: 'v1.0.0.2' },
    ],
  };

  const messageId = await sendMail(options);
  return messageId;
};

main()
  .then((messageId) => console.log('Message sent successfully:', messageId))
  .catch((err) => console.error(err));

Kirim Email Yang Dimodifikasi di atas

Kamu dapat menggunakan Mail Merge untuk Gmail untuk mengirim email yang dipersonalisasi menggunakan Gmail dan Google Sheets.