Mengirim Banyak Email E-Certificate
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(' xy*@gm***.com ', ' ba**********@gm***.com ', '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:
- Email Pengirim: xy*@gm***.com
- Email Penerima: ba**********@gm***.com
- Subyek Email: Subyek Percobaan
- Isi Email: Percobaan Pertama
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.