Lompat ke konten Lompat ke sidebar Lompat ke footer

Mengirim & Membaca E-mail Dengan Python

Mengirim & Membaca E-mail Dengan Python.

Umumnya, untuk mengirim email kita menggunakan server SMTP dan untuk melihat email kami menggunakan server IMAP.

Python Menyediakan Modul Bawaan untuk Mengirim dan Membaca email , untuk mengirim email kami menggunakan modul SMPTlib, dan untuk membaca email kami menggunakan modul IMAPlib.

• Server SMTP

Server SMTP bertanggung jawab untuk mengirim email dan mereka menerapkan protokol SMTP. Protokol Transfer Surat Sederhana juga dikenal sebagai SMTP adalah protokol sederhana namun efisien yang mengirimkan pesan email dari pengirim ke penerima.

Ketika kita ingin mengirim pesan email, kita mengisi draft email dengan alamat penerima, subjek, isi pesan, dll., Dan klik tombol kirim, ini mengirim email ke server smtp.

Sekarang Host_Name dari Server SMTP yang menjadi tujuan pengiriman email didasarkan pada jenis akun yang digunakan pengguna. Ada berbagai penyedia layanan email seperti Gmail, yahoo, outlook, hostinger, dll.,

- Jika akunnya adalah gmail akun,maka nama hostnya adalah smtp.gmail.com dan jika akun adalah hostinger maka alamatnya adalah smtp.hostinger.com

- Server SMTP ini memiliki nomor port masing-masing

Jadi ketika kita mengklik tombol kirim, pertama email dikirim ke server SMTP pengirim dan kemudian dikirim ke alamat server SMTP penerima masing-masing dan disimpan di dalamnya sampai penerima masuk ke akun mereka.

• Library SMTPlib

Dengan python, kita dapat mengotomatiskan proses pengiriman email massal ke penerima tertentu menggunakan smtplib library. SMTPlib menyediakan metode bawaan untuk melakukan login/logout dan mengirim email.

Untuk mengirim email ke penerima ada beberapa langkah yang perlu kita lakukan dan mereka tercantum di bawah ini: 

- Buat Koneksi dengan Server SMTP Pengirim menggunakan host_name dan nomor port SMTP Server.

- Verifikasi diri Anda sebagai pengguna yang valid.

-Masuk menggunakan nama pengguna & kata sandi.

- Buat pesan.

- Jika pesan dalam format teks, kita dapat langsung mengirimkannya sebagai teks. Jika pesan dalam format lain seperti pdf, audio, format video maka kita perlu mengkodekan data dan mengirim.

- Kirim pesan ke alamat email Penerima.

- Batalkan koneksi jika diperlukan.

• Hubungkan ke Server SMTP

Untuk terhubung ke Server SMTP kita perlu membuat objek sesi smtp yang terhubung ke server. Objek sesi ini akan digunakan untuk mengirim email. Untuk membuat objek sesi smtp, kita harus memberikan Hostname dan Nomor Port ke smtplib.SMTP()

smtplib.SMTP() buat instance yang merangkum koneksi SMTP dan juga memiliki metode yang memberikan dukungan untuk operasi yang berbeda.

• Nama Host & Nomor Port

Untuk membuat koneksi dengan Server SMTP mana pun, kami memerlukan nama host dan nomor port. Nama Host dan nomor port berbeda untuk berbagai Server SMTP. 

Server SMTP paling umum yang kami gunakan dalam kehidupan sehari-hari bersama dengan Hostname dan nomor Port mereka tercantum di bawah ini: 

[-] Server SMTP Gmail – – – Hostname : smtp.gmail.com , Port : 465 (SSL), 587 (TLS)

[-] Server SMTP Hostinger – – – Hostname : smtp.hostinger.com , Port : 465 (SSL/TLS)

[-]Server SMTP Outlook – – – Hostname : smtp.office365.com , Port : 587 (TLS)

[-] Yahoo SMTP Server – – – Hostname : smtp.yahoo.com , Port : 465 (SSL), 587 (TLS)

Kita perlu meneruskan nama host dan nomor port ini ke objek sesi untuk terhubung ke server smtp. 

Karena kita menggunakan Gmail, kami harus memberikan nama host: smtp.gmail.com & nomor port: 587

import smtplib
session = smtplib.SMTP('smtp.gmail.com', 587)

Kita juga dapat membuat objek sesi menggunakan with statement..

import smtplib
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:

• smtp.ehlo()

EHLO dikenal sebagai Extended HELO. smtp.ehlo() memungkinkan klien untuk mengidentifikasi dirinya ke server SMTP. 

Saat kita melakukan handshake menggunakan ehlo(), server menawarkan lebih banyak perintah dan ekstensi jika dibandingkan dengan helo(). Jika server tidak dapat mendukung ehlo maka klien kembali ke protokol helo .

Untuk memulai handshake ehlo() kita perlu menggunakan perintah di bawah ini: 

smtp.ehlo()

• smtp.starttls()

Mulai TLS adalah protokol yang klien sebutkan server untuk menawarkan koneksi yang lebih aman dari koneksi yang tidak aman. Itu wajib digunakan saat kita membuat handshake ehlo() dengan server.

Di python, kita dapat memulai protokol TLS menggunakan smtp.starttls(). Jika kita ingin mengimplementasikan protokol SSL maka kita perlu membuat objek sesi menggunakan smtplib.SMTP_SSL(). Saat kita menggunakan protokol SSL, kita tidak perlu menentukan ehlo() handshake.

Sintaks untuk implementasi kedua protokol diberikan di bawah ini: 

# EHLO() with TLS()
import smtplib
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()

# SSL() 
import smtplib
with smtplib.SMTP_SSL('smtp.gmail.com', 587) as smtp:

• smtp.login()

Setelah kita membuat koneksi aman dengan server, kita harus masuk menggunakan email_id dan kata sandi. 

Di python, saat masuk menggunakan server smtp, kita perlu menggunakan kata sandi khusus aplikasi alih-alih kata sandi akun umum yang kita gunakan.

Kata sandi khusus aplikasi dibuat saat kita mendaftarkan perangkat yang kita gunakan untuk melakukan operasi kirim email. Kata sandi ini berbeda untuk perangkat lain yang menggunakan akun yang sama untuk masuk.

Untuk menghasilkan kata sandi khusus aplikasi saat menggunakan server google smtp , ikuti langkah-langkah di bawah ini: 

- Buka halaman beranda akun Google dan pilih bagian keamanan. Akun Google – > Keamanan

- Gulir ke bawah ke Masuk ke Google dan aktifkan verifikasi 2 langkah untuk berjaga-jaga jika dimatikan.

- Di bawah verifikasi 2 langkah, kita dapat mengklik Kata sandi aplikasi dan menghasilkan kode 16 karakter. Ini akan digunakan untuk masuk ke akun kita dan mengirim email.

import smtplib
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login(user="youremail@gmail.com", password="abc********wxyz")

• smtp.sendmail()

Untuk mengirim email yang dapat kita gunakan smtp.sendmail(), kita harus memberikan alamat email pengirim dan penerima bersama dengan pesan sebagai argumen.

Di sini, kita mengirim detail pesan seperti subjek dan isi dengan membungkusnya dalam format string.

import smtplib
with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
    smtp.ehlo()
    smtp.starttls()
    smtp.ehlo()
    smtp.login(user="youremail@gmail.com", password="abc********wxyz")
    subject = 'hello'
    body = 'Hello Blog-Gan'
    msg = f'Subject: {subject} \n\n {body}'
    smtp.sendmail(from_addr='youremail@gmail.com', 
                     to_addrs='receivedemail@gmail.com', msg=msg)


• MIMEMultipart

MIME adalah singkatan dari ekstensi surat internet multiguna. Hal ini memungkinkan kita untuk mengirim pesan email dalam format yang berbeda seperti audio, video, PDF, dll,

MIMEMultipart memungkinkan kita mengirim beberapa bagian ( file ) dengan mendaftarkannya satu demi satu. File-file ini pada dasarnya adalah lampiran. MIMEMultipart adalah sub-kelas MIMEBase.

Kita dapat membuat objek MIMEMulitpart dan menggunakan objek ini untuk mendefinisikan parameter seperti from _address, to_address, message content, dll.,

from email.mime.multipart import MIMEMultipart
import smtplib

msg = MIMEMultipart()
msg['from'] = 'youremail@gmail.com'
msg['to'] = 'receivedemail@gmail.com'
msg['subject'] = 'Read New'

Sekarang setelah kita membuat objek pesan dan menetapkan beberapa atribut padanya, kita dapat menambahkan konten pesan pada langkah berikutnya. Untuk melakukan operasi ini kita menggunakan kelas MIMEBase.

• MIMEBase

MIMEBase adalah kelas dasar untuk semua sub-kelas pesan . Hal ini memungkinkan mendefinisikan jenis pesan menggunakan dua parameter _maintypedan _subtypedan menambahkan muatan pesan dan header.

Mari kita lihat contoh pengiriman file gambar menggunakan MIME dengan mengimplementasikan MIMEMultipart dan MIMEBase.

• Mengirim file Gambar

Untuk mengirim gambar, kami membuat instance MIMEMultipart() dan menetapkan nilai bidang padanya, seperti pesan, alamat_pengirim, alamat_penerima, dll., dan melampirkan gambar ke objek (msg) dari MIMEMultipart. Kita perlu mengubah data gambar menjadi byte dan kemudian melampirkan data ke objek msg.

Saat kita melampirkan file media atau dokumen ke objek pesan, kita perlu menentukan beberapa parameter tentang data dan mengkodekannya. Di bawah ini adalah langkah-langkah yang harus diikuti:

- Membuka file dalam mode 'rb', sehingga data terbaca dalam format byte.

- Tetapkan data dan nama_file ke atribut masing-masing.

- Tentukan _maintype dan _subtype untuk data dan berikan ke MIMEBase(). Dalam kasus kami, gambar adalah _maintype& .png adalah _subtype. Untuk mengetahui _subtipe yang kami gunakan imghdr.what()

- Selanjutnya kita perlu menambahkan header dan payload ke instance MIMEBase(). Setelah data tersalurkan dengan benar, kami dapat melampirkannya ke objek pesan dan mengirim email.

Pada kode di bawah ini kami mengirimkan file gambar dalam format byte dari alamat pengirim ke alamat penerima.

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
import smtplib
from email import encoders
import imghdr

msg = MIMEMultipart()
msg['from'] = 'youremail@gmail.com'
msg['to'] = 'receivedemail@gmail.com'
msg['subject'] = 'Send Image'

with open('blog-gan.jpg', 'rb') as file:
    img_data = file.read()
    img_type = imghdr.what(file.name)
    file_name = file.name
img_part = MIMEBase(_maintype='image', _subtype=img_type)
img_part.set_payload(img_data)
encoders.encode_base64(img_part)
img_part.add_header(
    "Content-Disposition",
    f"attachment; filename= {file_name}",
)
msg.attach(img_part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(user="youremail@gmail.com", password="abc********wxyz")
server.send_message(msg)

• Lampirkan PDF ke pesan

Proses untuk melampirkan PDF ke pesan hampir sama seperti yang telah kita lakukan pada langkah sebelumnya. Kecuali kita perlu meneruskan parameter yang berbeda ke MIMEBase() .

Pertama-tama kita buka file dalam mode membaca + biner dan ekstrak nama file dan data dalam bentuk byte.

Kemudian kita mengunggah byte yang diekstraksi menggunakan payload dan menambahkan header sebelum melampirkan data ke pesan.

Karena jenis file yang kami kirim adalah format pdf, maka perlu dibuka dengan aplikasi yang mendukung pdf. Jadi kami menentukan ini dengan menetapkan _maintype = 'application',_subtype = 'octet-stream'

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

msg = MIMEMultipart('alternative')
msg['from'] = 'youremail@gmail.com'
msg['to'] = 'receivedemail@gmail.com'
msg['subject'] = 'Read New'
with open('document.pdf', 'rb') as file:
    doc_data = file.read()
    doc_name = file.name
doc_part = MIMEBase(_maintype='application', _subtype='octet-stream')
doc_part.set_payload(doc_data)
encoders.encode_base64(doc_part)
doc_part.add_header(
    "Content-Disposition",
    f"attachment; filename= {doc_name}",
)
msg.attach(doc_part)


• Lampirkan Audio ke pesan
Untuk melampirkan file audio ke objek pesan MIMEMultipart, kita perlu membuka file dalam 'rb'mode untuk mengekstrak data dalam format byte dan meneruskannya sebagai muatan.

Karena file dalam format audio yang kami tetapkan _maintype = 'audio', _subtype = 'ogg' berdasarkan jenis file dan meneruskan nilai-nilai ini ke MIMEBase.

from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

msg = MIMEMultipart()
with open('Audio_1.ogg', 'rb') as file:
    Audio_data = file.read()
    Audio_name = file.name
Audio_part = MIMEBase(_maintype='audio', _subtype='ogg')
Audio_part.set_payload(Audio_data)
encoders.encode_base64(Audio_part)
Audio_part.add_header(
    "Content-Disposition",
    f"attachment; filename= {Audio_name}",
)
msg.attach(Audio_part)

• Lampirkan Konten HTML
Untuk Melampirkan Konten HTML ke objek pesan kita bisa menggunakan MIMEText(). kita dapat langsung meneruskan konten HTML ke MIMEText(), dan itu dapat dilampirkan ke objek pesan menggunakan msg.attach().

from email.mime.multipart import MIMEMultipart
import smtplib
from email.mime.text import MIMEText

msg = MIMEMultipart()
msg['from'] = 'youremail@gmail.com'
msg['to'] = 'receivedemail@gmail.com'
msg['subject'] = 'HTML Message'

html_part = MIMEText('<h1 style="color:red; ; font-size:150px;"> Hello Blog-Gan </h1>', 'html')
msg.attach(html_part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(user="youremail@gmail.com", password="abc********wxyz")
server.send_message(msg)

• Pesan Email

Selain MIMEMultipart, kita juga dapat membuat instance EmailMessage() kelas dan melampirkan pesan. Di EmailMessage kita tidak perlu mengkodekan data, kita bisa meneruskannya hanya dengan menentukan _maintype dan _subtype data.

Untuk membuat instance kelas EmailMessage() kita perlu mengimpornya menggunakan perintah, from email.message import EmailMessage.

Dalam contoh di bawah ini, kita mengirim file gambar ke alamat penerima menggunakan instance EmailMessage().

from email.mime.multipart import MIMEMultipart
import smtplib
from email.mime.text import MIMEText
import imghdr

msg = EmailMessage()
msg['from'] = 'youremail@gmail.com'
msg['to'] = 'receivedemail@cherchertech.com'
msg['subject'] = 'Read New Message'
with open('blog-gan.jpg', 'rb') as file:
    img = file.read()
    img_type = imghdr.what(file.name)
    file_name = file.name
msg.add_attachment(img, maintype='image', subtype=img_type, filename=file_name)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login(user="youremail@gmail.com", password="abc********wxyz")
server.send_message(msg)


• Server IMAP & POP

IMAP & POP adalah server email yang menangani email masuk. Kami dapat menggunakan IMAP atau POP berdasarkan spesifikasi kebutuhan.

° Server IMAP

IMAP adalah singkatan dari INTERNET MAIL ACCESS PROTOCOL. Umumnya, ketika kita menerima email, mereka disimpan di server relay. Email ini diambil oleh pengguna saat mereka masuk dari mesin lokal.

IMAP memungkinkan pengguna untuk melihat atau menghapus email di server. IMAP hanya membuat cache lokal untuk email yang masuk di mesin lokal, email asli disimpan di server relai itu sendiri.

Saat masuk dari beberapa perangkat, IMAP menampilkan konten serupa seperti folder, pesan yang belum dibaca, sampah, dll.

° Server POP

POP berarti POST OFFICE PROTOCOL . POP digunakan untuk mengunduh email dari server email penerima.

Tidak seperti IMAP, alih-alih melihatnya langsung mengunduh email ke mesin lokal. Setelah email diunduh, email akan dihapus dari hard disk server. POP harus digunakan hanya untuk mengunduh email dari server.

Juga ketika pengguna masuk dari beberapa perangkat setelah perangkat pertama mengunduh email, email itu akan dihapus dari server sehingga email tidak akan tersedia untuk perangkat lain, karena POP tidak menyediakan sinkronisasi.

Pada gambar di atas, dua perangkat memiliki login dari akun yang sama dan kita dapat menyimpulkan bahwa email masuk untuk beberapa perangkat login berbeda pada setiap perangkat.

• IMAP vs POP

- Kita dapat melihat email masuk menggunakan IMAP.

- IMAP menyimpan salinan lokal email di perangkat Anda dan email sebenarnya disimpan di server itu sendiri.

- Semua email dan folder disinkronkan dengan benar di antara beberapa perangkat.

- Kita tidak dapat melihat email tanpa koneksi internet.

- Mengkonsumsi lebih banyak ruang di server.

- Lebih aman dibandingkan dengan POP.

- POP mengunduh seluruh email dari server

- Setelah diunduh, email akan dihapus dari server, jadi kami memerlukan rencana cadangan di perangkat lokal.

- Tidak menyediakan Sinkronisasi. Antarmuka dan folder bisa berbeda di beberapa perangkat.

- Email dapat dilihat tanpa koneksi internet.

- Konsumsi lebih sedikit ruang di Server.

- Kurang aman karena email yang didownload bisa mengandung virus.

• IMAPlib

Python menyediakan modul bawaan imaplibuntuk melihat email di server IMAP. Secara umum, kita dapat melihat kotak masuk, item terkirim, draft, folder lain yang ada di server untuk akun pengguna tertentu.

Dengan menggunakan modul imaplib ini kita dapat login, logout, membaca pesan dan mencetaknya. Pertama, mari kita lihat cara membuat koneksi aman dengan server.

Poin-poin yang tercantum di bawah ini berguna untuk membangun koneksi yang aman dengan server. Kita dapat memilih standar enkripsi SSL atau TLS.

- Buat objek sesi IMAP untuk menghubungkan ke server imap dari akun pengguna. 
Untuk terhubung ke server, kita memerlukan nama host dan nomor port.

- Nama host untuk server adalah imap.server_name.com , Sebagai contoh:
Nama host server IMAP Gmail adalah: imap.gmail.com

- Nomor Port untuk TLS/SSL terenkripsi : 993 & untuk Tidak Terenkripsi : 143

- Selanjutnya kita perlu masuk ke akun menggunakan email_id dan kata sandi. 

- Kata sandi akan menjadi kata sandi aplikasi
Selanjutnya kita dapat memilih folder yang ingin kita buka. Seperti 'kotak masuk', 'terkirim', 'spam', dll.

- Saat mengambil pesan, kita perlu menentukan format mana yang ingin kita ekstrak emailnya. Dalam contoh kami, kami menggunakan 'RFC822' format standar.

- Karena pesan email akan dalam format biner yang dapat kita gunakan email.message_from_bytes() untuk mengekstrak data dalam format biner ke format string. Akhirnya, Sebelum mengambil pesan, kita perlu mendekodekannya.

- Dalam kode di bawah ini, kami melihat dan mencetak pesan 'TIDAK TERLIHAT' dari 'kotak masuk'.

import email
import imaplib
server = imaplib.IMAP4_SSL('imap.gmail.com', 993)
server.login(user="youremail@gmail.com", password="abc********wxyz")
server.select('inbox')
_, inbox = server.search(None, 'UNSEEN')

for id in inbox[0].split():
    _, data = server.fetch(id, '(RFC822)')
    _, binary_data = data[0]
    email_message = email.message_from_bytes(binary_data)
    email_data = {}

    for i in ['subject', 'from', 'to', 'date']:
        print(i, ':', '', email_message[i])

    for part in email_message.walk():
        if part.get_content_type() == 'text/plain':
            body = part.get_payload(decode=True)
            email_data['body'] = body.decode()
        
    print('Message Body : ', email_data['body'])


Posting Komentar untuk "Mengirim & Membaca E-mail Dengan Python"