tencent cloud

Contoh Panggilan untuk Go

Download
Mode fokus
Ukuran font
Terakhir diperbarui: 2026-05-12 16:00:22
Contoh kode berikut menggunakan SMTP untuk mengirim email dalam bahasa Go (v1.16):

// 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 main

import (
"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"] = toEmail
header["Cc"] = ccEmail
header["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 HTML
body := "<!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()
}




Bantuan dan Dukungan

Apakah halaman ini membantu?

masukan