Kirim Email Otomatis dengan Python Tanpa Layanan Berbayar
Notifikasi email otomatis adalah salah satu fitur yang paling sering dibutuhkan dalam berbagai proyek, mulai dari aplikasi web, sistem monitoring server, laporan harian otomatis, hingga notifikasi transaksi. Python menyediakan library bawaan yang memungkinkan pengiriman email tanpa perlu library eksternal berbayar, hanya dengan beberapa baris kode yang bersih dan mudah dipahami.
Artikel ini membahas cara membuat sistem notifikasi email otomatis menggunakan Python dengan library smtplib dan email yang sudah tersedia secara bawaan. Dari pengiriman email teks sederhana hingga email berformat HTML dengan lampiran, semua bisa dilakukan tanpa dependensi tambahan yang rumit.
Persiapan Sebelum Memulai
Sebelum menulis kode, ada beberapa hal yang perlu disiapkan. Pertama, pastikan Python sudah terinstal di sistem. Library smtplib dan email sudah termasuk dalam instalasi Python standar sehingga tidak perlu instalasi tambahan. Kedua, siapkan akun email yang akan digunakan sebagai pengirim. Gmail adalah pilihan yang paling umum digunakan untuk keperluan pengembangan.
Untuk Gmail, ada satu langkah penting yang perlu dilakukan sebelum memulai. Google tidak mengizinkan login langsung menggunakan password akun untuk aplikasi pihak ketiga. Perlu membuat App Password khusus melalui pengaturan akun Google. Aktifkan Two-Factor Authentication terlebih dahulu, kemudian buka menu Security lalu App Passwords untuk membuat password khusus aplikasi yang akan digunakan dalam kode.
Mengirim Email Teks Sederhana
Berikut adalah kode dasar untuk mengirim email teks biasa menggunakan Python:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def kirim_email(penerima, subjek, isi):
pengirim = "[email protected]"
password = "app_password_anda"
pesan = MIMEMultipart()
pesan["From"] = pengirim
pesan["To"] = penerima
pesan["Subject"] = subjek
pesan.attach(MIMEText(isi, "plain"))
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(pengirim, password)
server.sendmail(pengirim, penerima, pesan.as_string())
print("Email berhasil dikirim")
except Exception as e:
print(f"Gagal mengirim email: {e}")
kirim_email(
penerima="[email protected]",
subjek="Notifikasi Test",
isi="Ini adalah email notifikasi otomatis dari Python."
)
Kode di atas menggunakan koneksi SMTP_SSL pada port 465 yang merupakan koneksi terenkripsi langsung. Alternatifnya adalah menggunakan SMTP biasa pada port 587 dengan perintah starttls() untuk mengaktifkan enkripsi setelah koneksi terbuka. Keduanya aman digunakan, namun SMTP_SSL pada port 465 lebih sederhana karena enkripsi langsung aktif sejak awal koneksi.
Mengirim Email Berformat HTML
Email dengan format HTML jauh lebih menarik secara visual dan lebih profesional dibandingkan teks biasa. Berikut cara mengirimnya:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def kirim_email_html(penerima, subjek, isi_html):
pengirim = "[email protected]"
password = "app_password_anda"
pesan = MIMEMultipart("alternative")
pesan["From"] = pengirim
pesan["To"] = penerima
pesan["Subject"] = subjek
bagian_html = MIMEText(isi_html, "html")
pesan.attach(bagian_html)
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(pengirim, password)
server.sendmail(pengirim, penerima, pesan.as_string())
print("Email HTML berhasil dikirim")
except Exception as e:
print(f"Gagal mengirim email: {e}")
isi_html = """
Notifikasi Sistem
Halo, ini adalah notifikasi otomatis dari sistem.
Status: Berhasil
Email ini dikirim otomatis, mohon tidak membalas.
"""
kirim_email_html(
penerima="[email protected]",
subjek="Notifikasi Sistem - Status Update",
isi_html=isi_html
)
Perhatikan penggunaan MIMEMultipart dengan argumen “alternative” yang memberi tahu klien email bahwa ada beberapa versi isi pesan. Ini adalah praktik terbaik agar email tetap bisa dibaca meski di klien yang tidak mendukung HTML.
Mengirim Email dengan Lampiran
Untuk laporan otomatis yang perlu menyertakan file seperti PDF atau CSV, berikut cara menambahkan lampiran:
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
def kirim_email_dengan_lampiran(penerima, subjek, isi, path_file):
pengirim = "[email protected]"
password = "app_password_anda"
pesan = MIMEMultipart()
pesan["From"] = pengirim
pesan["To"] = penerima
pesan["Subject"] = subjek
pesan.attach(MIMEText(isi, "plain"))
with open(path_file, "rb") as f:
lampiran = MIMEBase("application", "octet-stream")
lampiran.set_payload(f.read())
encoders.encode_base64(lampiran)
nama_file = os.path.basename(path_file)
lampiran.add_header(
"Content-Disposition",
f"attachment; filename={nama_file}"
)
pesan.attach(lampiran)
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(pengirim, password)
server.sendmail(pengirim, penerima, pesan.as_string())
print(f"Email dengan lampiran {nama_file} berhasil dikirim")
except Exception as e:
print(f"Gagal mengirim email: {e}")
kirim_email_dengan_lampiran(
penerima="[email protected]",
subjek="Laporan Harian",
isi="Terlampir laporan harian untuk hari ini.",
path_file="laporan.pdf"
)
Mengirim ke Banyak Penerima Sekaligus
Untuk kebutuhan notifikasi massal seperti laporan yang dikirim ke beberapa anggota tim, cukup modifikasi bagian penerima menjadi list:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def kirim_email_massal(daftar_penerima, subjek, isi):
pengirim = "[email protected]"
password = "app_password_anda"
pesan = MIMEMultipart()
pesan["From"] = pengirim
pesan["To"] = ", ".join(daftar_penerima)
pesan["Subject"] = subjek
pesan.attach(MIMEText(isi, "plain"))
try:
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(pengirim, password)
server.sendmail(pengirim, daftar_penerima, pesan.as_string())
print(f"Email dikirim ke {len(daftar_penerima)} penerima")
except Exception as e:
print(f"Gagal mengirim email: {e}")
penerima = [
"[email protected]",
"[email protected]",
"[email protected]"
]
kirim_email_massal(
daftar_penerima=penerima,
subjek="Laporan Mingguan Tim",
isi="Silakan cek laporan mingguan terlampir."
)
Menyimpan Kredensial dengan Aman
Menyimpan password langsung di dalam kode adalah praktik yang sangat tidak dianjurkan, terutama jika kode akan diupload ke repository. Gunakan environment variable untuk menyimpan informasi sensitif:
import os
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
pengirim = os.environ.get("EMAIL_PENGIRIM")
password = os.environ.get("EMAIL_PASSWORD")
def kirim_notifikasi(penerima, subjek, isi):
pesan = MIMEMultipart()
pesan["From"] = pengirim
pesan["To"] = penerima
pesan["Subject"] = subjek
pesan.attach(MIMEText(isi, "plain"))
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login(pengirim, password)
server.sendmail(pengirim, penerima, pesan.as_string())
Set environment variable di terminal sebelum menjalankan script:
export EMAIL_PENGIRIM="[email protected]"
export EMAIL_PASSWORD="app_password_anda"
python script_email.py
Untuk proyek yang lebih besar, gunakan file .env bersama library python-dotenv untuk pengelolaan environment variable yang lebih rapi. Pastikan file .env selalu ditambahkan ke .gitignore agar tidak terupload ke repository publik.
Hubungi Kami
Butuh bantuan implementasi sistem notifikasi email otomatis untuk proyek atau bisnis? Tim kami siap membantu dari konsultasi teknis hingga pengembangan solusi yang sesuai dengan kebutuhan spesifik.
Hubungi Kami melalui kontak resmi untuk konsultasi layanan IT dan pengembangan sistem.
