Mengirim Banyak Email E-Certificate

Google Client Library

Google menyediakan beragam interface untuk berkomunikasi dengan Gmail API seperti Google Apps Script, PHP, Node.js dan tentu saja, Python.

Install the Google Client Library

Gunakan perintah ini pada terminal/command prompt/console.

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Example

Dokumentasi Google menyediakan sample code yang dapat digunakan untuk mencoba. Menurut pengalaman penulis, ini sangat berguna untuk mengidentifikasi permasalahan (biasanya ada) pada mesin baru.

Beri nama script file di bawah ini dengan quickstart.py.

from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

def main():
    """Shows basic usage of the Gmail API.
    Lists the user's Gmail labels.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=0)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    # Call the Gmail API
    results = service.users().labels().list(userId='me').execute()
    labels = results.get('labels', [])

    if not labels:
        print('No labels found.')
    else:
        print('Labels:')
        for label in labels:
            print(label['name'])

if __name__ == '__main__':
    main()

Seperti terlihat pada bagian komentar, script di atas akan membaca semua label pada gmail.

Di bagian awal, script akan mencari di mesin (komputer) jika telah ada file token.pickle yang berisi kredensial gmail. Jika tidak menemukan maka login diperlukan.

Run the Example

Jalankan script dengan perintah ini, pada terminal/command prompt/console.

python quickstart.py

Browser akan terbuka dan meminta login akun gmail. Dalam contoh, Quickstart, project name yang sebelumnya digunakan, ditampilkan.

Verify App

Saat quickstart.py pertamakali digunakan Google perlu memastikan bahwa script tersebut (atau disebut pula app) sah menurut pemilik akun.

Jika menemukan seperti ini, klik Advanced.

Kemudian klik Go to Quickstart (unsafe).

Grant Access

Di bagian ini Google akan menampilkan fungsi apa yang akan diberikan kepada Quickstart.

Sesuai script yang hanya akan membaca label, maka Quickstart membutuhkan akses untuk melihat (View).

Klik Allow.

Konfirmasi hak akses yang diberikan, klik Allow.

Succeed

Jika proses di atas lancar, kita akan mendapatkan pesan seperti ini di layar.

Dan Google akan mengirimkan email kepada kita.

Maka script yang dijalankan akan menampilkan daftar label yang ada dalam email.


Sending an Email

Sekarang saatnya mencoba mengirim email. Selain kode, ada hal lain yang perlu diubah.

Auth Scopes

Sebenarnya Gmail API meminta kita menentukan auth scope yang akan digunakan, artinya hak akses apa yang diberikan kepada app. Pada kode sebelumnya auth scope yang digunakan adalah gmail.readonly, hak akses yang diberikan adalah untuk membaca saja.

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

Auth scope itu perlu diganti jika kita ingin mengirim email, beberapa pilihan yang ada:

  • https://www.googleapis.com/auth/gmail.send
  • https://www.googleapis.com/auth/gmail.compose
  • https://mail.google.com/

token.pickle

Selain mengganti auth scope, kita perlu menghapus file bernama token.pickle.

File tersebut berisi kredensial sesuai auth scope yang sebelumnya digunakan, hanya untuk membaca, sehingga perlu dihapus dan nanti akan diganti dengan yang baru.

Kode

Kode di bawah ini mengadopsi contoh yang diberikan Google dengan sedikit penyesuaian. Simpan dalam file bernama kirim_email.py.

from __future__ import print_function
import pickle
import os.path
import base64 # bagian ini baru
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.errors import HttpError # bagian ini baru
from email.mime.text import MIMEText # bagian ini baru

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.send'] # bagian ini berubah

# fungsi di bawah ini baru
def create_message(sender, to, subject, message_text):
  """Create a message for an email.

  Args:
    sender: Email address of the sender.
    to: Email address of the receiver.
    subject: The subject of the email message.
    message_text: The text of the email message.

  Returns:
    An object containing a base64url encoded email object.
  """
  message = MIMEText(message_text)
  message['to'] = to
  message['from'] = sender
  message['subject'] = subject
  raw = base64.b64encode(message.as_bytes())
  raw = raw.decode()
  return {'raw': raw}

# fungsi di bawah ini baru
def send_message(service, user_id, message):
  """Send an email message.

  Args:
    service: Authorized Gmail API service instance.
    user_id: User's email address. The special value "me"
    can be used to indicate the authenticated user.
    message: Message to be sent.

  Returns:
    Sent Message.
  """
  try:
    message = (service.users().messages().send(userId=user_id, body=message)
               .execute())
    print('Message Id: %s' % message['id'])
    return message
  except HttpError as e:
    print('An error occurred: %s' % e)

def main():
    """Shows basic usage of the Gmail API.
    Send an email.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server(port=9876)
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('gmail', 'v1', credentials=creds)

    # Call the Gmail API
    # bagian di bawah ini baru
    msg_text = 'Percobaan Pertama'
    msg_to_send = create_message('[email protected]', '[email protected]', 'Subyek Percobaan', msg_text)
    send_message(service, 'me', msg_to_send)

if __name__ == '__main__':
    main()

Yang baru dari kode di atas adalah fungsi create_message dan send_message.

Fungsi create_message kemudian dipanggil dengan rincian informasi:

Fungsi send_message memanfaatkan method send dari library google-api-python-client dengan dua parameter yang digunakan, yaitu userId dan body.

Run the code

Jalankan script dengan perintah ini.

python kirim_email.py

The Auth Ritual

Karena menggunakan auth scope yang baru, Google akan menanyakan kembali mengenai hak akses yang kita berikan pada app. Seperti sebelumnya kita akan klik Allow untuk tiap pertanyaan.

Email Sent

Jika tidak ada kesalahan (lagi) maka email akan terkirim.

Pada sisi penerima kurang lebih akan seperti ini email yang diterima.


Referensi

Leave a Reply

Your email address will not be published. Required fields are marked *