All Products
Search
Document Center

Alibaba Mail:Contoh kode untuk mengirim email SMTP menggunakan Python 3.6 dan versi yang lebih baru

Last Updated:Aug 26, 2026

Topik ini menyediakan contoh kode untuk mengirim email SMTP dengan Python 3.6 atau versi yang lebih baru.

Konfigurasi Alibaba Mail

Alamat server SMTP:

Situs Singapura: smtp.sg.aliyun.com

Situs China (Hong Kong): smtp.hk.aliyun.com

Situs Jerman: smtp.de.alibabacloud.com

Situs AS: smtp.us.alibabacloud.com

Port: 25 untuk koneksi tanpa enkripsi, 465 untuk koneksi terenkripsi SSL


# -*- 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

# username
username = 'XXXXXXXX'
# password. Jika Anda mengaktifkan kata sandi keamanan untuk client pihak ketiga, gunakan kata sandi keamanan yang dihasilkan di halaman web. Jika tidak, gunakan kata sandi logon Anda.
password = 'XXXXXXXX'
# Alamat balasan kustom
replyto = 'XXXXXXXX'
# Daftar alamat penerima yang ditampilkan di bagian To
rcptto = ['address1@example.net', 'address2@example.net']
# Daftar alamat penerima yang ditampilkan di bagian Cc
rcptcc = ['address3@example.net', 'address4@example.net']
# Daftar alamat penerima Bcc. Penerima Bcc tidak ditampilkan pada email tetapi tetap dapat menerimanya.
rcptbcc = ['address5@example.net', 'address6@example.net']
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 alamat on-behalf-of)
# Ubah daftar menjadi string
msg['To'] = ",".join(rcptto)
msg['Cc'] = ",".join(rcptcc)
msg['Reply-to'] = replyto  # Digunakan untuk menerima email balasan. Memerlukan dukungan protokol standar dari penerima.
msg['Return-Path'] = 'test@example.net'  # Digunakan untuk menerima email bounce. Memerlukan dukungan protokol standar dari penerima.
msg['Message-id'] = email.utils.make_msgid()  # Message-id secara unik mengidentifikasi setiap email. Formatnya harus sesuai dengan RFC 5322, biasanya seperti <uniquestring@example.com>. Uniquestring adalah pengenal unik yang dihasilkan oleh server email, yang dapat mencakup informasi seperti timestamp dan bilangan acak.
msg['Date'] = email.utils.formatdate()


# 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 (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 enkripsi SSL, buat client sebagai berikut
    # client = smtplib.SMTP_SSL('smtp.qiye.aliyun.com', 465)

    # Untuk Python 3.10/3.11, jika handshake SSL gagal, tangani sebagai berikut:
    # ctxt = ssl.create_default_context()
    # ctxt.set_ciphers('DEFAULT')
    # client = smtplib.SMTP_SSL('smtp.qiye.aliyun.com', 465, context=ctxt)

    # Port SMTP standar adalah 25
    client = smtplib.SMTP('smtp.sg.aliyun.com', 25, timeout=10)
    # Aktifkan mode DEBUG
    # client.set_debuglevel(0)
    # Alamat pengirim dan alamat autentikasi harus sama
    client.login(username, password)
    # Catatan: Untuk mendapatkan nilai kembali perintah DATA, lihat metode enkapsulasi sendmail di smtplib:
    # Gunakan metode SMTP.mail/SMTP.rcpt/SMTP.data
    # print(receivers)
    client.sendmail(username, receivers, msg.as_string())  # Mendukung banyak penerima. Untuk batas spesifik, lihat daftar periksa 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))