// Cloud Email Push Service (SES) menggunakan protokol SMTP.//// Kode ini mendemonstrasikan cara mengirim permintaan pengiriman email ke// Tencent Cloud SES melalui protokol SMTP (port 465 dengan enkripsi SSL/TLS).// Alur keseluruhan terdiri dari langkah-langkah berikut:// 1. Siapkan parameter pengiriman (pengirim, penerima, Cc, Bcc, subjek, isi, dll.);// 2. Susun Header dan Body email dalam format RFC 822 (Body dikodekan dengan Base64);// 3. Bangun koneksi terenkripsi ke server SMTP menggunakan tls.Dial;// 4. Selesaikan autentikasi melalui PlainAuth;// 5. Jalankan perintah SMTP seperti MAIL FROM, RCPT TO, dan DATA secara berurutan untuk mengirimkan pesan.//// Sebelum menggunakan kode ini, harap selesaikan persiapan berikut di konsol// Tencent Cloud Email Push:// - Buat dan verifikasi Sender Domain (Domain Pengirim);// - Buat Sender Address (Alamat Pengirim) dan aktifkan pengiriman SMTP;// - Buat password SMTP khusus di menu "SMTP Password" pada konsol// (catatan: ini BUKAN password akun Tencent Cloud Anda);// - Pastikan alamat pengirim memiliki kuota pengiriman yang tersedia.//// Dependensi: hanya pustaka standar net/smtp dan crypto/tls; tidak memerlukan paket pihak ketiga.package mainimport ("crypto/tls""encoding/base64""fmt""log""net""net/smtp")// Test465 mendemonstrasikan pengiriman email berformat HTML melalui port 465 (SSL/TLS).//// Alur kerja:// 1. Konfigurasikan alamat server SMTP, port, akun pengirim, dan password SMTP;// 2. Bangun header email (From / To / Cc / Bcc / Subject / Content-Type, dll.);// 3. Kodekan isi pesan dengan Base64 dan tambahkan setelah header// (diperlukan satu baris kosong antara header dan body);// 4. Gunakan smtp.PlainAuth untuk membuat objek autentikasi PLAIN;// 5. Panggil SendMailWithTLS untuk mengirim pesan melalui koneksi TLS.//// Nilai kembali: mengembalikan nil jika berhasil, atau error spesifik jika gagal.func Test465() error {// Alamat server SMTP. Untuk Tencent Cloud Email Push selalu smtp.qcloudmail.com.host := "smtp.qcloudmail.com"// Port SMTP: 465 berarti koneksi terenkripsi SSL/TLS;// Jika ingin menggunakan STARTTLS, ubah ke port 25, dan tls.Dial pada kode// juga harus diubah menjadi net.Dial + StartTLS.port := 465// email: Sender Address yang sudah dibuat dan diverifikasi di konsol;// harus sesuai dengan akun yang memiliki password SMTP.email := "abc@cd.com"// password: password SMTP khusus yang dibuat untuk alamat pengirim ini// di halaman "SMTP Settings" pada konsol.// Ini BUKAN password login Tencent Cloud Anda dan BUKAN API key.password := "****"// Alamat penerima (wajib, minimal satu)toEmail := "test@test123.com"// Alamat Cc (opsional)ccEmail := "cc@test123.com"// Alamat Bcc (opsional)bccEmail := "bcc@test123.com"// Bangun header email. Protokol SMTP mengharuskan field header ditulis// dalam bentuk "Key: Value\\r\\n", dan setelah seluruh header diperlukan// satu baris kosong ("\\r\\n") sebelum body.header := make(map[string]string)// "From" disarankan ditulis dalam bentuk "Nama Tampilan <alamat pengirim>";// Nama tampilan akan muncul sebagai nama panggilan pengirim di kotak masuk.header["From"] = "test " + "<" + email + ">"header["To"] = toEmailheader["Cc"] = ccEmailheader["Bcc"] = bccEmail// Subjek email. Jika berisi karakter non-ASCII, disarankan menggunakan// pengkodean RFC 2047 (=?UTF-8?B?...?=). Contoh ini menggunakan ASCII murni// sehingga tidak dikodekan.header["Subject"] = "test subject"// Content-Type menentukan bahwa body adalah HTML dan menyatakan charset UTF-8.header["Content-Type"] = "text/html; charset=UTF-8"// Content-Transfer-Encoding menentukan pengkodean transfer body.// Menggunakan base64 mencegah karakter non-ASCII atau khusus terpotong// atau rusak selama transmisi SMTP.header["Content-Transfer-Encoding"] = "base64"// Contoh body HTMLbody := "<!DOCTYPE html>\\n<html>\\n<head>\\n<meta charset=\\"utf-8\\">\\n<title>hello world</title>\\n</head>\\n<body>\\n " +"<h1>Judul Pertama Saya</h1>\\n <p>Paragraf pertama saya.</p>\\n</body>\\n</html>"// Untuk mengirim email teks biasa, beri komentar pada konfigurasi HTML di atas// dan aktifkan dua baris berikut://header["Content-Type"] = "text/plain; charset=UTF-8"//body := "test body"// Susun pesan SMTP final: pertama gabungkan setiap header menjadi// "Key: Value\\r\\n", lalu tambahkan baris kosong sebagai pemisah, dan// terakhir tempelkan body yang sudah dikodekan Base64.message := ""for k, v := range header {message += fmt.Sprintf("%s: %s\\r\\n", k, v)}message += "\\r\\n" + base64.StdEncoding.EncodeToString([]byte(body))// Buat objek autentikasi PLAIN.// Parameter ke-1 "identity" biasanya kosong; ke-2 adalah username// (alamat pengirim); ke-3 adalah password SMTP; ke-4 adalah host// (digunakan untuk validasi sisi server).auth := smtp.PlainAuth("",email,password,host,)// Panggil fungsi pengiriman versi TLS dengan alamat server, objek auth,// pengirim, daftar penerima, dan pesan mentah.// Catatan: daftar "to" digunakan untuk perintah SMTP RCPT TO dan menentukan// kotak surat mana yang benar-benar menerima email. Jika ingin penerima Cc/Bcc// benar-benar menerima pesan, Anda juga harus menambahkan ccEmail / bccEmail ke daftar ini.err := SendMailWithTLS(fmt.Sprintf("%s:%d", host, port),auth,email,[]string{toEmail},[]byte(message),)if err != nil {fmt.Println("Send email error:", err)} else {fmt.Println("Send mail success!")}return err}// Dial membangun koneksi terenkripsi TLS ke server SMTP dan mengembalikan// *smtp.Client yang dapat digunakan.//// Parameter:// - addr: alamat server dalam bentuk "host:port", misalnya "smtp.qcloudmail.com:465".//// Catatan:// - smtp.Dial dari pustaka standar secara default menggunakan koneksi plain.// Untuk port 465, kanal TLS harus dibangun terlebih dahulu lalu dibungkus// menjadi klien SMTP, sehingga fungsi ini menggunakan tls.Dial alih-alih net.Dial.// - Argumen kedua adalah *tls.Config; memberikan nil berarti menggunakan// konfigurasi default (yang akan memvalidasi sertifikat server).// Untuk melewati validasi sertifikat (TIDAK direkomendasikan untuk production),// berikan &tls.Config{InsecureSkipVerify: true}.func Dial(addr string) (*smtp.Client, error) {conn, err := tls.Dial("tcp", addr, nil)if err != nil {log.Println("tls.Dial Error:", err)return nil, err}// smtp.NewClient memerlukan host (tanpa port) untuk handshake EHLO/HELO.host, _, _ := net.SplitHostPort(addr)return smtp.NewClient(conn, host)}// SendMailWithTLS melakukan pengiriman email lengkap melalui koneksi SMTP// terenkripsi TLS.//// Parameter:// - addr: alamat server SMTP dalam bentuk "host:port".// - auth: objek autentikasi SMTP, dapat dibuat dengan smtp.PlainAuth;// berikan nil jika tidak diperlukan autentikasi.// - from: alamat pengirim yang digunakan pada perintah MAIL FROM;// harus sesuai dengan akun yang terautentikasi.// - to: daftar penerima yang digunakan pada perintah RCPT TO,// mencakup semua penerima nyata To, Cc, dan Bcc.// - msg: pesan email lengkap (Header + baris kosong + Body), dalam format RFC 822.//// Langkah-langkah:// 1. Bangun koneksi TLS + SMTP melalui Dial;// 2. Jika server mendukung ekstensi AUTH, lakukan autentikasi;// 3. Jalankan perintah MAIL FROM, RCPT TO, dan DATA secara berurutan;// 4. Tulis isi email dan tutup data stream;// 5. Panggil perintah QUIT untuk menutup sesi dengan baik.//// Setiap langkah yang gagal akan langsung mengembalikan error yang sesuai.func SendMailWithTLS(addr string, auth smtp.Auth, from string,to []string, msg []byte) (err error) {// 1. Bangun koneksi TLS dan dapatkan klien SMTP.c, err := Dial(addr)if err != nil {log.Println("Create smtp client error:", err)return err}// Pastikan koneksi pada akhirnya ditutup untuk menghindari kebocoran koneksi.defer c.Close()// 2. Jika auth diberikan dan server mengumumkan ekstensi AUTH melalui EHLO,// lakukan autentikasi.if auth != nil {if ok, _ := c.Extension("AUTH"); ok {if err = c.Auth(auth); err != nil {log.Println("Error during AUTH", err)return err}}}// 3. Kirim perintah MAIL FROM untuk memberi tahu server siapa pengirimnya.if err = c.Mail(from); err != nil {return err}// 4. Kirim perintah RCPT TO untuk setiap penerima.for _, addr := range to {if err = c.Rcpt(addr); err != nil {return err}}// 5. Kirim perintah DATA dan dapatkan writer untuk menulis isi email (Header + Body).w, err := c.Data()if err != nil {return err}_, err = w.Write(msg)if err != nil {return err}// Tutup writer untuk menandai akhir input body// (dalam protokol SMTP, akhir ditandai dengan "\\r\\n.\\r\\n").err = w.Close()if err != nil {return err}// 6. Kirim perintah QUIT untuk mengakhiri sesi dengan server secara baik.return c.Quit()}// Main adalah titik masuk yang langsung memanggil Test465 untuk memicu pengiriman.// Dalam integrasi bisnis nyata, disarankan untuk memindahkan parameter pengiriman// (akun, password, penerima, dll.) ke konfigurasi atau argumen fungsi, dan// melakukan penanganan error serta percobaan ulang yang lebih halus pada Test465.func main() {Test465()}
Apakah halaman ini membantu?
Anda juga dapat Menghubungi Penjualan atau Mengirimkan Tiket untuk meminta bantuan.
masukan