全部产品
Search
文档中心

Direct Mail:Contoh panggilan SMTP untuk Python 3.6 atau versi lebih baru

更新时间:Dec 20, 2025

Topik ini menjelaskan cara mengirim email menggunakan protokol SMTP di Python 3.6 atau versi yang lebih baru.

Kode contoh:

# -*- coding:utf-8 -*-
import smtplib
import email
# import json
# import base64
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# from email.mime.image import MIMEImage
# from email.mime.base import MIMEBase
# from email.mime.application import MIMEApplication
from email.header import Header
from email.utils import formataddr
# import urllib.request
# import ssl

# Alamat pengirim yang dibuat di Konsol.
username = 'XXXXXXXX'
# Kata sandi SMTP yang dibuat di Konsol.
password = 'XXXXXXXX'
# Alamat balasan kustom, yang bersifat independen dari pengaturan di Konsol. Alamat pengirim Direct Mail tidak menerima email. Saat penerima membalas, email tersebut secara otomatis dikirim ke alamat balasan yang ditentukan.
replyto = 'XXXXXXXX'
# Alamat penerima yang ditampilkan di bagian To.
rcptto = ['address1@example.net', 'address2@example.net']
# Alamat penerima yang ditampilkan di bagian Cc.
rcptcc = ['address3@example.net', 'address4@example.net']
# Alamat penerima Bcc. Penerima Bcc tidak ditampilkan pada email tetapi tetap dapat menerimanya.
rcptbcc = ['address5@example.net', 'address6@example.net']
# Semua alamat penerima, termasuk alamat Cc. Satu kali pengiriman tidak boleh melebihi 60 penerima.
receivers = rcptto + rcptcc + rcptbcc

# Bangun struktur alternatif.
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('Subjek email kustom')
msg['From'] = formataddr(["Nama panggilan pengirim kustom", username])  # Nama panggilan + alamat pengirim (atau pengirim proxy)
# Ubah daftar menjadi string.
msg['To'] = ",".join(rcptto)
msg['Cc'] = ",".join(rcptcc)
msg['Reply-to'] = replyto  # Digunakan untuk menerima email balasan. Penerima harus mendukung protokol standar.
msg['Return-Path'] = 'test@example.net'  # Digunakan untuk menerima email bounce. Penerima harus mendukung protokol standar.
msg['Message-id'] = email.utils.make_msgid()  # Message-id secara unik mengidentifikasi setiap email. Formatnya harus sesuai dengan RFC 5322, seperti <uniquestring@example.com>. Uniquestring adalah pengidentifikasi unik yang dihasilkan oleh server email dan dapat berisi informasi seperti timestamp dan bilangan acak.
msg['Date'] = email.utils.formatdate()

# Untuk mengaktifkan layanan pelacakan email, gunakan kode berikut untuk mengatur header tautan pelacakan.
# Diperlukan tag untuk mengirim email. Tag ini harus dibuat di Konsol dan dapat digunakan 10 menit setelah pembuatan.
# Atur header tautan pelacakan.
# tagName = 'xxxxxxx'
#
# # Nilai OpenTrace dan LinkTrace tetap berupa string '1'.
# trace = {
#     "OpenTrace": '1',  # Aktifkan pelacakan pembukaan email.
#     "LinkTrace": '1',  # Aktifkan pelacakan klik URL dalam email.
#     "TagName": tagName  # Nama tag yang dibuat di Konsol.
# }
# jsonTrace = json.dumps(trace)
# base64Trace = str(base64.b64encode(jsonTrace.encode('utf-8')), 'utf-8')
# # print(base64Trace)
# msg.add_header("X-AliDM-Trace", base64Trace)


# Bangun bagian text/plain dari struktur alternatif.
# textplain = MIMEText('Bagian teks biasa kustom', _subtype='plain', _charset='UTF-8')
# msg.attach(textplain)

# Bangun bagian text/html dari struktur alternatif.
texthtml = MIMEText('Bagian hiperteks HTML kustom', _subtype='html', _charset='UTF-8')
msg.attach(texthtml)

# # Kirim lampiran lokal.
# files = [r'C:\Users\Downloads\test1.jpg', r'C:\Users\Downloads\test2.jpg']
# for t in files:
#     filename = t.rsplit('/', 1)[1]
#     part_attach1 = MIMEApplication(open(t, 'rb').read())  # Buka lampiran.
#     part_attach1.add_header('Content-Disposition', 'attachment', filename=filename)  # Beri nama lampiran.
#     msg.attach(part_attach1)  # Tambahkan lampiran.

# # Kirim lampiran dari URL.
# files = [r'https://example.oss-cn-shanghai.aliyuncs.com/xxxxxxxxxxx.png']
# for t in files:
#     filename=t.rsplit('/', 1)[1]
#     response = urllib.request.urlopen(t)
#     part_attach1 = MIMEApplication(response.read())  # Buka lampiran. Ini bukan file lokal.
#     part_attach1.add_header('Content-Disposition', 'attachment', filename=filename)  # Beri nama lampiran.
#     msg.attach(part_attach1)  # Tambahkan lampiran.


# Kirim email.
try:
    # Untuk menggunakan SSL guna Enkripsi, buat client sebagai berikut.
    # client = smtplib.SMTP_SSL('smtpdm.aliyun.com', 465)
    
    # Jika handshake SSL gagal di Python 3.10 atau 3.11, tangani sebagai berikut:
    # ctxt = ssl.create_default_context()
    # ctxt.set_ciphers('DEFAULT')
    # client = smtplib.SMTP_SSL('smtpdm.aliyun.com', 465, context=ctxt)
    
    
    # Port SMTP standar adalah 25 dan 80.
    client = smtplib.SMTP('smtpdm.aliyun.com', 80)
    # Aktifkan mode DEBUG. Atur ke 1 untuk mengaktifkan.
    client.set_debuglevel(0)
    # Pengirim dan alamat autentikasi harus sama.
    client.login(username, password)
    # Catatan: Untuk mendapatkan nilai kembali perintah DATA, lihat metode enkapsulasi smtplib.sendmail:
    # Gunakan metode SMTP.mail, SMTP.rcpt, dan SMTP.data.
    # print(receivers)
    client.sendmail(username, receivers, msg.as_string())  # Mendukung beberapa penerima. Untuk batas spesifik, lihat spesifikasi.
    client.quit()
    print('Email berhasil dikirim!')
except smtplib.SMTPConnectError as e:
    print('Gagal mengirim email. Koneksi gagal:', e.smtp_code, e.smtp_error)
except smtplib.SMTPAuthenticationError as e:
    print('Gagal mengirim email. Kesalahan autentikasi:', e.smtp_code, e.smtp_error)
except smtplib.SMTPSenderRefused as e:
    print('Gagal mengirim email. Pengirim ditolak:', e.smtp_code, e.smtp_error)
except smtplib.SMTPRecipientsRefused as e:
    print('Gagal mengirim email. Penerima ditolak:', e.smtp_code, e.smtp_error)
except smtplib.SMTPDataError as e:
    print('Gagal mengirim email. Penerimaan data ditolak:', e.smtp_code, e.smtp_error)
except smtplib.SMTPException as e:
    print('Gagal mengirim email, ', str(e))
except Exception as e:
    print('Terjadi kesalahan saat mengirim email, ', str(e))