All Products
Search
Document Center

Direct Mail:Bagaimana cara mengirim email dengan lampiran menggunakan SDK?

Last Updated:Nov 14, 2025

Catatan

Total ukuran email beserta lampirannya tidak boleh melebihi 15 MB. Satu email dapat berisi maksimal 100 lampiran.

Batas 15 MB berlaku untuk total ukuran email yang dikirim, termasuk header pesan, isi pesan, dan lampiran. Karena pengkodean Base64 meningkatkan ukuran file, ukuran akhir email bisa lebih dari 1,5 kali ukuran lampiran aslinya. Oleh karena itu, kami menyarankan agar Anda membatasi total ukuran lampiran hingga 8 MB atau kurang. Untuk mengirim file yang lebih besar, tambahkan tautan ke file tersebut di isi email.

# -*- coding: utf-8 -*-
import sys
from typing import List
from typing import BinaryIO
from alibabacloud_dm20151123.client import Client as Dm20151123Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dm20151123 import models as dm_20151123_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_dm20151123 import models as main_models

attachments = []


class Sample:
    def __init__(self) -> None:
        pass

    @staticmethod
    def create_client() -> Dm20151123Client:
        """
        Menginisialisasi klien akun menggunakan kredensial.
        @return: Client
        @throws Exception
        """
        # Untuk kode produksi, kami merekomendasikan menggunakan metode yang lebih aman yang tidak memerlukan Pasangan Kunci Akses. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial, lihat https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-python-access-credentials.
        config = open_api_models.Config(
            access_key_id='xxxxxx',
            access_key_secret='xxxxxx'
        )
        # Untuk informasi selengkapnya tentang Titik akhir, lihat https://api.alibabacloud.com/product/Dm
        config.endpoint = f'dm.ap-southeast-1.aliyuncs.com'
        config.region_id = f'ap-southeast-1'
        return Dm20151123Client(config)

    @staticmethod
    def main(
            args: List[str],
    ) -> None:
        client = Sample.create_client()
        single_sendmail_request = dm_20151123_models.SingleSendMailAdvanceRequest(
            account_name='sender@example.com',
            address_type='1',
            reply_to_address='true',
            to_address='recipient@example.com',
            subject='Subject',
            html_body='Email Body',
            attachments=getAttachments()
        )
        try:
            # Saat Anda menyalin kode ini untuk dijalankan, cetak Nilai kembali API.
            response = client.single_send_mail_advance(single_sendmail_request, util_models.RuntimeOptions())
            print(response)
        except Exception as error:
            # Ini hanya untuk tujuan demonstrasi. Tangani pengecualian dengan hati-hati. Jangan abaikan pengecualian dalam proyek Anda.
            # Pesan kesalahan
            print(error.data)
            # # Alamat diagnosis
            # print(error.data.get("Recommend"))
            # UtilClient.assert_as_string(error.message)

def getAttachments() -> List[main_models.SingleSendMailAdvanceRequestAttachments]:
    attach = main_models.SingleSendMailAdvanceRequestAttachments("test1.txt", getFile(r"C:\Users\Downloads\111.txt"))
    attach1 = main_models.SingleSendMailAdvanceRequestAttachments("test2.txt", getFile(r"C:\Users\Downloads\222.txt"))
    attachments.append(attach)
    attachments.append(attach1)
    return attachments


def getFile(v_file) -> BinaryIO:
    f = open(v_file, 'rb')
    return f


if __name__ == '__main__':
    Sample.main(sys.argv[1:])
package org.example;

import com.aliyun.dm20151123.models.SingleSendMailAdvanceRequest;
import com.aliyun.dm20151123.models.SingleSendMailResponse;
import com.aliyun.tea.TeaException;
import com.google.gson.Gson;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

public class Sample {
    /**
     * deskripsi
<?php

// File ini dibuat secara otomatis, jangan mengeditnya. Terima kasih.
namespace AlibabaCloud\SDK\Sample;

use AlibabaCloud\SDK\Dm\V20151123\Dm;
// use AlibabaCloud\Credentials\Credential;
use \Exception;
use AlibabaCloud\Tea\Exception\TeaError;
use AlibabaCloud\Tea\Utils\Utils;

use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\SDK\Dm\V20151123\Models\SingleSendMailAdvanceRequest;
use AlibabaCloud\SDK\Dm\V20151123\Models\SingleSendMailAdvanceRequest\attachments;
use GuzzleHttp\Psr7\Stream;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;

require_once __DIR__ . '\\..\\..\\vendor\\autoload.php';

class Sample {

    /**
     * Menginisialisasi klien akun menggunakan kredensial.
     * @return Dm Client
     */
    public static function createClient(){
        // Untuk kode produksi, kami merekomendasikan menggunakan metode yang lebih aman yang tidak memerlukan Pasangan Kunci Akses. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial, lihat https://www.alibabacloud.com/help/en/sdk/developer-reference/v2-manage-php-access-credentials.
        $config = new Config([
            "accessKeyId" => "xxxxxx",
            "accessKeySecret" => "xxxxxxx"
        ]);
        // Untuk informasi selengkapnya tentang Titik akhir, lihat https://api.alibabacloud.com/product/Dm
        $config->endpoint = "dm.ap-southeast-1.aliyuncs.com";        
        $config->regionId = "ap-southeast-1";        
        return new Dm($config);
    }
    // public static function createClient(){
    //     // Untuk kode produksi, kami merekomendasikan menggunakan metode yang lebih aman yang tidak memerlukan Pasangan Kunci Akses. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial, lihat https://www.alibabacloud.com/help/document_detail/311677.html.
    //     $credential = new Credential();
    //     $config = new Config([
    //         "credential" => $credential
    //     ]);
    //     // Untuk informasi selengkapnya tentang Titik akhir, lihat https://api.aliyun.com/product/Dm
    //     $config->endpoint = "dm.aliyuncs.com";
    //     $config->regionId = "cn-hangzhou";
    //     return new Dm($config);
    // }
    /**
     * Mendapatkan aliran file.
     * @param string $filePath Jalur file.
     * @return Stream
     */
    public static function getFile($filePath) {
        $fileResource = fopen($filePath, 'rb');
        $fileSize = filesize($filePath); // Mendapatkan ukuran file.
        var_dump("Ukuran file:");
        var_dump($fileSize);
        return new Stream($fileResource);
    }

    /**
     * Mendapatkan daftar lampiran.
     * @return array
     */
    public static function getAttachments() {
        $attachments = [];
        
        // Membuat lampiran pertama.
        $attachment1 = new attachments();
        $attachment1->attachmentName = "test1.txt";
        $attachment1->attachmentUrlObject = self::getFile("C:\\Users\\Downloads\\111.txt");
        $attachments[] = $attachment1;
        
        // Membuat lampiran kedua.
        $attachment2 = new attachments();
        $attachment2->attachmentName = "test2.txt";
        $attachment2->attachmentUrlObject = self::getFile("C:\\Users\\Downloads\\222.txt");
        $attachments[] = $attachment2;
        // Cetak $attachments;
        var_dump($attachments);
        return $attachments;
    }

    /**
     * @param string[] $args
     * @return void
     */
    public static function main($args){
        $client = self::createClient();
        
        // Membuat permintaan email.
        $singleSendMailRequest = new SingleSendMailAdvanceRequest([
            "accountName" => "sender@example.com",
            "addressType" => 1,
            "replyToAddress" => true,
            "subject" => "Subject",
            "toAddress" => "recipient@example.com",            
            "attachments" => self::getAttachments(),
            "htmlBody" => "<h1>Body</h1>",
            "textBody" => "Body"
        ]);
        
        // // Membuat opsi waktu proses.
        // $runtime = new RuntimeOptions([
        //     "ca" => "C:\\Users\\cacert.pem" // Menentukan jalur sertifikasi CA lokal.
        // ]);
        $runtime = new RuntimeOptions();
        
        try {
            // Mengirim email.
            $client->singleSendMailAdvance($singleSendMailRequest, $runtime);
            var_dump("Berhasil dikirim");
        }
        catch (Exception $error) {
            if (!($error instanceof TeaError)) {
                $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
            }
            // Ini hanya untuk tujuan demonstrasi. Tangani pengecualian dengan hati-hati. Jangan abaikan pengecualian dalam proyek Anda.
            // Pesan kesalahan
            var_dump($error->message);
            // Alamat diagnosis
            var_dump($error->data["Recommend"]);
            Utils::assertAsString($error->message);
        }
    }
}
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
    require_once $path;
}
Sample::main(array_slice($argv, 1));
package main

import (
	"fmt"
	"os"

	openapiutil "github.com/alibabacloud-go/darabonba-openapi/v2/utils"
	dm "github.com/alibabacloud-go/dm-20151123/v2/client"
	"github.com/alibabacloud-go/tea/dara"
	"github.com/aliyun/credentials-go/credentials"
)

// Deskripsi:
//
// Menginisialisasi klien akun menggunakan kredensial.
//
// @return Client
//
// @throws Exception
func CreateClient() (_result *dm.Client, _err error) {
	config := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId("xxxxxx").
		SetAccessKeySecret("xxxxxx")

	akCredential, err := credentials.NewCredential(config)
	if err != nil {
		return _result, err
	}

	openapiConfig := &openapiutil.Config{
		Credential: akCredential,
	}
	// Untuk informasi selengkapnya tentang Titik akhir, lihat https://api.alibabacloud.com/product/Dm
	openapiConfig.Endpoint = dara.String("dm.ap-southeast-1.aliyuncs.com")
	_result, _err = dm.NewClient(openapiConfig)
	return _result, _err
}

func main() {
	err := _main(dara.StringSlice(os.Args[1:]))
	if err != nil {
		panic(err)
	}
}

func _main(args []*string) (_err error) {
	client, _err := CreateClient()
	if _err != nil {
		return _err
	}

	// Membuat lampiran.
	attachments, _err := getAttachments()
	if _err != nil {
		return _err
	}

	// Gunakan SingleSendMailAdvanceRequest alih-alih SingleSendMailRequest.
	singleSendMailRequest := &dm.SingleSendMailAdvanceRequest{
		AccountName:    dara.String("sender@example.com"),
		AddressType:    dara.Int32(1),
		ReplyToAddress: dara.Bool(true),
		ToAddress:      dara.String("recipient@example.com"),
		Subject:        dara.String("Subject"),
		HtmlBody:       dara.String("Email Body"),
		Attachments:    attachments,
	}

	runtime := &dara.RuntimeOptions{}
	// Gunakan metode SingleSendMailAdvance alih-alih SingleSendMailWithOptions.
	resp, _err := client.SingleSendMailAdvance(singleSendMailRequest, runtime)
	if _err != nil {
		fmt.Printf("[ERROR] %s\n", _err.Error())
		return _err
	}

	fmt.Printf("[LOG] %s\n", dara.Stringify(resp))
	return _err
}

// getAttachments mendapatkan daftar lampiran.
func getAttachments() ([]*dm.SingleSendMailAdvanceRequestAttachments, error) {
	// Catatan: Anda harus mengubah jalur file menjadi jalur file aktual Anda.
	attach1, err := createAttachmentFromFile("test1.txt", `C:\Users\Downloads\111.txt`)
	if err != nil {
		return nil, fmt.Errorf("Gagal membuat lampiran test1.txt: %v", err)
	}

	attach2, err := createAttachmentFromFile("test2.txt", `C:\Users\Downloads\222.txt`)
	if err != nil {
		return nil, fmt.Errorf("Gagal membuat lampiran test2.txt: %v", err)
	}

	return []*dm.SingleSendMailAdvanceRequestAttachments{attach1, attach2}, nil
}

// createAttachmentFromFile membuat lampiran dari file.
func createAttachmentFromFile(name, filePath string) (*dm.SingleSendMailAdvanceRequestAttachments, error) {
	// Membuka file.
	file, err := os.Open(filePath)
	if err != nil {
		return nil, fmt.Errorf("Tidak dapat membuka file %s: %v", filePath, err)
	}

	// Mendapatkan informasi file.
	fileInfo, err := file.Stat()
	if err != nil {
		file.Close()
		return nil, fmt.Errorf("Tidak dapat mendapatkan informasi file %s: %v", filePath, err)
	}

	// Memeriksa ukuran file.
	// if fileInfo.Size() > 15*1024*1024 {
	// 	file.Close()
	// 	return nil, fmt.Errorf("File %s melebihi batas ukuran")
	// }

	// Membuat objek lampiran dan menggunakan file sebagai io.Reader.
	attachment := &dm.SingleSendMailAdvanceRequestAttachments{
		AttachmentName:      dara.String(name),
		AttachmentUrlObject: file, // Gunakan file langsung sebagai io.Reader.
	}

	fmt.Printf("Lampiran %s dibuat. Ukuran: %d byte\n", name, fileInfo.Size())

	// Catatan: Dalam aplikasi nyata, Anda mungkin perlu menjaga file tetap terbuka hingga pengiriman selesai
	// atau membaca konten file ke memori untuk menghindari masalah handle file.

	return attachment, nil
}
Catatan

Buka OpenAPI Explorer untuk mengunduh paket kit pengembangan perangkat lunak (SDK) terbaru yang berisi metode untuk menangani lampiran.

Jika Anda menggunakan Instance ECS di VPC dan memerlukan koneksi jaringan internal, atur parameter config.setEndpointType("internal");.

Deskripsi pemanggilan API

Contoh berikut menggunakan Python:

Logika dasarnya adalah membaca aliran biner file, mengenkapsulasi beberapa lampiran ke dalam daftar, lalu meneruskan daftar tersebut ke bidang lampiran. Kemudian, Anda memanggil operasi single_send_mail_advance untuk mengirim email. Perhatikan bahwa metode ini berbeda dari operasi singleSendMailWithOptions.

  • SingleSendMailAdvanceRequestAttachments

Kelas ini mendefinisikan lampiran email, termasuk nama file dan kontennya (aliran biner).

  • SingleSendMailAdvanceRequest

Kelas ini mengenkapsulasi semua parameter yang diperlukan untuk mengirim email, seperti pengirim, Penerima, subjek, isi pesan, dan lampiran.

  • single_send_mail_advance mengirim satu email.

Anda dapat memanggil metode ini dari instance Dm20151123Client untuk mengirim email dengan lampiran.

Hasil

Anda dapat menggunakan Pusat Pemecahan Masalah untuk menanyakan ID permintaan dan memverifikasi bahwa parameter telah diteruskan dengan benar.

image

Pesan kesalahan: kode: 400, URL lampiran tidak valid

Verifikasi bahwa jalur lampiran dan nilai wilayah sudah benar. Selain itu, pastikan Anda menggunakan metode yang mendukung lampiran. Misalnya, dalam Python, gunakan single_send_mail_advance alih-alih single_send_mail_with_options.

config.endpoint = "dm.ap-southeast-1.aliyuncs.com";

config.regionId = "ap-southeast-1";

Catatan

Ganti Titik akhir dan ID Wilayah dengan nilai yang sesuai dengan wilayah Anda.