Mengirim email mentah menggunakan Amazon SES API v2 - Layanan Email Sederhana Amazon

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengirim email mentah menggunakan Amazon SES API v2

Anda dapat menggunakan SendEmail operasi Amazon SES API v2 dengan jenis konten yang ditentukan raw untuk mengirim pesan yang disesuaikan ke penerima menggunakan format email mentah.

Tentang bidang header email

Protokol Transfer Surat Sederhana (SMTP) menentukan bagaimana pesan email akan dikirim dengan menentukan envelope surat dan beberapa parameternya, tetapi tidak peduli dengan isi pesannya. Sebaliknya, Format Pesan Internet (RFC 5322) menentukan bagaimana pesan yang akan disusun.

Dengan spesifikasi Format Pesan Internet, setiap pesan email terdiri dari header dan badan. Header terdiri dari metadata pesan, dan badan berisi pesan itu sendiri. Untuk informasi selengkapnya tentang header dan badan email, lihat Format email dan Amazon SES.

Menggunakan MIME

Protokol SMTP awalnya dirancang untuk mengirim pesan email yang hanya berisi karakter 7-bit ASCII. Spesifikasi ini membuat SMTP tidak cukup untuk pengodean teks non-ASCII (seperti Unicode), konten biner, atau lampiran. Standar Multipurpose Internet Mail Extensions (MIME) dikembangkan untuk memungkinkan mengirim banyak tipe konten lain menggunakan SMTP.

Standar MIME bekerja dengan memecah badan pesan menjadi beberapa bagian dan kemudian menentukan apa yang harus dilakukan untuk setiap bagian. Misalnya, salah satu bagian dari badan pesan email mungkin berupa teks biasa, sementara yang lain mungkin HTML. Selain itu, MIME mengizinkan pesan email untuk berisi satu lampiran atau lebih. Penerima pesan dapat melihat lampiran dari dalam klien email mereka, atau mereka dapat menyimpan lampiran.

Header dan konten pesan dipisahkan oleh baris kosong. Setiap bagian dari email dipisahkan oleh batas, string karakter yang menunjukkan awal dan akhir dari setiap bagian.

Pesan multipart dalam contoh berikut berisi teks dan bagian HTML, dan lampiran. Lampiran harus ditempatkan tepat di bawah header lampiran dan paling sering dikodekan base64 seperti yang ditunjukkan dalam contoh ini.

From: "Sender Name" <sender@example.com> To: recipient@example.com Subject: Customer service contact info Content-Type: multipart/mixed; boundary="a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a" --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a Content-Type: multipart/alternative; boundary="sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a" --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Please see the attached file for a list of customers to contact. --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable <html> <head></head> <body> <h1>Hello!</h1> <p>Please see the attached file for a list of customers to contact.</p> </body> </html> --sub_a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a-- --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a Content-Type: text/plain; name="customers.txt" Content-Description: customers.txt Content-Disposition: attachment;filename="customers.txt"; creation-date="Sat, 05 Aug 2017 19:35:36 GMT"; Content-Transfer-Encoding: base64 SUQsRmlyc3ROYW1lLExhc3ROYW1lLENvdW50cnkKMzQ4LEpvaG4sU3RpbGVzLENhbmFkYQo5MjM4 OSxKaWUsTGl1LENoaW5hCjczNCxTaGlybGV5LFJvZHJpZ3VleixVbml0ZWQgU3RhdGVzCjI4OTMs QW5heWEsSXllbmdhcixJbmRpYQ== --a3f166a86b56ff6c37755292d690675717ea3cd9de81228ec2b76ed4a15d6d1a--

Tipe konten untuk pesan adalah multipart/mixed, menunjukkan bahwa pesan memiliki banyak bagian (di contoh ini, badan dan lampiran), dan klien penerima harus menangani setiap bagian secara terpisah.

Nest yang dilakukan dalam bagian badan adalah bagian kedua yang menggunakan tipe konten multipart/alternative. Tipe konten ini menunjukkan bahwa setiap bagian berisi versi alternatif dari konten yang sama (di kasus ini, versi teks dan versi HTML). Jika klien email penerima dapat menampilkan konten HTML, maka versi HTML badan pesan akan ditunjukkan. Jika klien email penerima dapat tidak menampilkan konten HTML, maka versi teks biasa badan pesan akan ditunjukkan.

Kedua versi pesan juga berisi lampiran (di kasus ini, file teks pendek yang berisi beberapa nama pelanggan).

Ketika Anda melakukan nest pada bagian MIME dalam bagian lain, seperti di contoh ini, bagian yang di-nest harus menggunakan parameter boundary yang berbeda dengan parameter boundary di bagian induk. Batas-batas ini harus berupa string unik karakter. Untuk menentukan batas antara bagian MIME, ketik dua tanda hubung (--) diikuti oleh string batas. Di akhir bagian MIME, tempatkan dua tanda hubung di bagian awal dan akhir string batas.

catatan

Sebuah pesan tidak dapat memiliki lebih dari 500 bagian MIME.

Pengkodean MIME

Untuk menjaga kompatibilitas dengan sistem yang lebih lama, Amazon SES menerima pembatasan 7-bit ASCII SMTP sebagaimana ditentukan di RFC 2821. Jika Anda ingin mengirim konten yang berisi karakter non-ASCII, Anda harus mengodekan karakter tersebut ke dalam format yang menggunakan karakter 7-bit ASCII.

Alamat email

String alamat email harus 7-bit ASCII. Jika Anda ingin mengirim ke atau dari alamat email yang berisi karakter Unicode di bagian domain alamat, Anda harus mengodekan domain menggunakan Punycode. Punycode tidak diizinkan di bagian lokal dari alamat email (bagian sebelum tanda @) atau dalam nama "friendly from". Jika Anda ingin menggunakan karakter Unicode dalam nama "friendly from", Anda harus mengodekan nama "friendly from" menggunakan sintaksis kata yang dikodekan MIME, seperti yang dijelaskan dalam Mengirim email mentah menggunakan Amazon SES API v2. Untuk informasi selengkapnya tentang Punycode, lihat RFC 3492.

catatan

Aturan ini hanya berlaku untuk alamat email yang Anda tentukan di envelope pesan, bukan header pesan. Saat Anda menggunakan SendEmail operasi Amazon SES API v2, alamat yang Anda tentukan dalam Destinations parameter Source dan menentukan pengirim dan penerima amplop, masing-masing.

Header email

Untuk mengodekan header pesan, gunakan sintaksis MIME encoded-word. Sintaksis kata dikodekan MIME menggunakan format berikut:

=?charset?encoding?encoded-text?=

Nilai encoding dapat berupa Q atau B. Jika nilai pengodean adalah Q, maka nilai encoded-text harus menggunakan Q-encoding. Jika nilai pengodean adalah B, maka nilai encoded-text harus menggunakan pengodean base64.

Misalnya, jika Anda ingin menggunakan string "Як ти поживаєш?" di baris subjek email, Anda dapat menggunakan salah satu pengodean berikut:

  • Pengkodean Q

    =?utf-8?Q?=D0=AF=D0=BA_=D1=82=D0=B8_=D0=BF=D0=BE=D0=B6=D0=B8=D0=B2=D0=B0=D1=94=D1=88=3F?=
  • Pengkodean Base64

    =?utf-8?B?0K/QuiDRgtC4INC/0L7QttC40LLQsNGU0Yg/?=

Untuk informasi selengkapnya tentang Q-encoding, lihat RFC 2047. Untuk informasi selengkapnya tentang pengodean base64, lihat RFC 2045.

Badan pesan

Untuk mengodekan badan pesan, Anda dapat menggunakan pengodean quoted-printable atau pengodean base64. Kemudian, gunakan header Content-Transfer-Encoding untuk menunjukkan skema pengodean yang Anda gunakan.

Sebagai contoh, asumsikan badan pesan Anda berisi teks berikut:

१९७२ मे रे टॉमलिंसन ने पहला ई-मेल संदेश भेजा | रे टॉमलिंसन ने ही सर्वप्रथम @ चिन्ह का चयन किया और इन्ही को ईमेल का आविष्कारक माना जाता है

Jika Anda memilih untuk mengodekan teks ini menggunakan pengodean base64, pertama tentukan header berikut:

Content-Transfer-Encoding: base64

Kemudian, di bagian badan email, sertakan teks yang dikodekan base64:

4KWn4KWv4KWt4KWoIOCkruClhyDgpLDgpYcg4KSf4KWJ4KSu4KSy4KS/4KSC4KS44KSoIOCkqOCl hyDgpKrgpLngpLLgpL4g4KSILeCkruClh+CksiDgpLjgpILgpKbgpYfgpLYg4KSt4KWH4KSc4KS+ IHwg4KSw4KWHIOCkn+ClieCkruCksuCkv+CkguCkuOCkqCDgpKjgpYcg4KS54KWAIOCkuOCksOCl jeCkteCkquCljeCksOCkpeCkriBAIOCkmuCkv+CkqOCljeCkuSDgpJXgpL4g4KSa4KSv4KSoIOCk leCkv+Ckr+CkviDgpJTgpLAg4KSH4KSo4KWN4KS54KWAIOCkleCliyDgpIjgpK7gpYfgpLIg4KSV 4KS+IOCkhuCkteCkv+Ckt+CljeCkleCkvuCksOCklSDgpK7gpL7gpKjgpL4g4KSc4KS+4KSk4KS+ IOCkueCliAo=
catatan

Di beberapa kasus, Anda dapat menggunakan Content-Transfer-Encoding 8bit di pesan yang Anda kirim menggunakan Amazon SES. Namun, jika Amazon SES harus membuat perubahan pada pesan Anda (misalnya, ketika Anda menggunakan pelacakan buka dan klik), konten yang 8-bit-encoded mungkin tidak muncul dengan benar saat diterima di kotak masuk penerima. Untuk alasan ini, Anda harus selalu mengodekan konten yang bukan ASCII 7-bit.

Lampiran file

Untuk melampirkan file ke email, Anda harus mengodekan lampiran menggunakan pengodean base64. Lampiran biasanya ditempatkan di bagian pesan MIME khusus, yang mencakup header berikut:

  • Content-Type - Jenis file lampiran. Berikut ini adalah contoh deklarasi Tipe Konten MIME umum:

    • File teks biasa - Content-Type: text/plain; name="sample.txt"

    • Dokumen Microsoft WordContent-Type: application/msword; name="document.docx"

    • Gambar JPG - Content-Type: image/jpeg; name="photo.jpeg"

  • Content-Disposition - Menentukan bagaimana klien email penerima harus menangani konten. Untuk lampiran, nilai ini adalah Content-Disposition: attachment.

  • Content-Transfer-Encoding — Skema yang digunakan untuk menyandikan lampiran. Untuk lampiran file, nilai ini hampir selalu base64.

  • Lampiran yang dikodekan — Anda harus menyandikan lampiran yang sebenarnya dan memasukkannya ke dalam badan di bawah header lampiran seperti yang ditunjukkan pada contoh.

Amazon SES menerima tipe file yang paling umum. Untuk daftar tipe file yang tidak diterima Amazon SES, lihat Tipe lampiran yang tidak didukung Amazon SES.

Mengirim email mentah menggunakan Amazon SES API v2

Amazon SES API v2 menyediakan SendEmail tindakan, yang memungkinkan Anda menulis dan mengirim pesan email dalam format yang Anda tentukan saat Anda menyetel jenis konten menjadi sederhana, mentah, atau templat. Untuk deskripsi selengkapnya, lihat SendEmail. Contoh berikut akan menentukan jenis konten raw untuk mengirim pesan menggunakan format email mentah.

catatan

Untuk tips tentang cara meningkatkan kecepatan pengiriman email ketika Anda melakukan beberapa panggilan ke SendEmail, lihat Meningkatkan throughput dengan Amazon SES.

Badan pesan harus berisi pesan yang diformat dengan benar dan email mentah, dengan bidang header dan pengodean badan pesan yang sesuai. Meskipun pesan mentah mungkin dapat disusun secara manual dalam aplikasi, tapi akan jauh lebih mudah untuk melakukannya dengan menggunakan pustaka surat yang ada.

Java

Contoh kode berikut menunjukkan bagaimana menggunakan JavaMailperpustakaan dan AWS SDK for Javauntuk menulis dan mengirim email mentah.

package com.amazonaws.samples; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.ByteBuffer; import java.util.Properties; // JavaMail libraries. Download the JavaMail API // from https://javaee.github.io/javamail/ import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; // AWS SDK libraries. Download the AWS SDK for Java // from https://aws.amazon.com/sdk-for-java import com.amazonaws.regions.Regions; import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; import com.amazonaws.services.simpleemail.model.RawMessage; import com.amazonaws.services.simpleemail.model.SendRawEmailRequest; public class AmazonSESSample { // Replace sender@example.com with your "From" address. // This address must be verified with Amazon SES. private static String SENDER = "Sender Name <sender@example.com>"; // Replace recipient@example.com with a "To" address. If your account // is still in the sandbox, this address must be verified. private static String RECIPIENT = "recipient@example.com"; // Specify a configuration set. If you do not want to use a configuration // set, comment the following variable, and the // ConfigurationSetName=CONFIGURATION_SET argument below. private static String CONFIGURATION_SET = "ConfigSet"; // The subject line for the email. private static String SUBJECT = "Customer service contact info"; // The full path to the file that will be attached to the email. // If you're using Windows, escape backslashes as shown in this variable. private static String ATTACHMENT = "C:\\Users\\sender\\customers-to-contact.xlsx"; // The email body for recipients with non-HTML email clients. private static String BODY_TEXT = "Hello,\r\n" + "Please see the attached file for a list " + "of customers to contact."; // The HTML body of the email. private static String BODY_HTML = "<html>" + "<head></head>" + "<body>" + "<h1>Hello!</h1>" + "<p>Please see the attached file for a " + "list of customers to contact.</p>" + "</body>" + "</html>"; public static void main(String[] args) throws AddressException, MessagingException, IOException { Session session = Session.getDefaultInstance(new Properties()); // Create a new MimeMessage object. MimeMessage message = new MimeMessage(session); // Add subject, from and to lines. message.setSubject(SUBJECT, "UTF-8"); message.setFrom(new InternetAddress(SENDER)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RECIPIENT)); // Create a multipart/alternative child container. MimeMultipart msg_body = new MimeMultipart("alternative"); // Create a wrapper for the HTML and text parts. MimeBodyPart wrap = new MimeBodyPart(); // Define the text part. MimeBodyPart textPart = new MimeBodyPart(); textPart.setContent(BODY_TEXT, "text/plain; charset=UTF-8"); // Define the HTML part. MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(BODY_HTML,"text/html; charset=UTF-8"); // Add the text and HTML parts to the child container. msg_body.addBodyPart(textPart); msg_body.addBodyPart(htmlPart); // Add the child container to the wrapper object. wrap.setContent(msg_body); // Create a multipart/mixed parent container. MimeMultipart msg = new MimeMultipart("mixed"); // Add the parent container to the message. message.setContent(msg); // Add the multipart/alternative part to the message. msg.addBodyPart(wrap); // Define the attachment MimeBodyPart att = new MimeBodyPart(); DataSource fds = new FileDataSource(ATTACHMENT); att.setDataHandler(new DataHandler(fds)); att.setFileName(fds.getName()); // Add the attachment to the message. msg.addBodyPart(att); // Try to send the email. try { System.out.println("Attempting to send an email through Amazon SES " +"using the AWS SDK for Java..."); // Instantiate an Amazon SES client, which will make the service // call with the supplied AWS credentials. AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard() // Replace US_WEST_2 with the AWS Region you're using for // Amazon SES. .withRegion(Regions.US_WEST_2).build(); // Print the raw email content on the console PrintStream out = System.out; message.writeTo(out); // Send the email. ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); message.writeTo(outputStream); RawMessage rawMessage = new RawMessage(ByteBuffer.wrap(outputStream.toByteArray())); SendRawEmailRequest rawEmailRequest = new SendRawEmailRequest(rawMessage) .withConfigurationSetName(CONFIGURATION_SET); client.sendRawEmail(rawEmailRequest); System.out.println("Email sent!"); // Display an error if something goes wrong. } catch (Exception ex) { System.out.println("Email Failed"); System.err.println("Error message: " + ex.getMessage()); ex.printStackTrace(); } } }
Python

Contoh kode berikut ini menunjukkan cara menggunakan paket Phyton email.mim dan AWS SDK for Python (Boto) untuk menulis dan mengirim email mentah.

import os import boto3 from botocore.exceptions import ClientError from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication # Replace sender@example.com with your "From" address. # This address must be verified with Amazon SES. SENDER = "Sender Name <sender@example.com>" # Replace recipient@example.com with a "To" address. If your account # is still in the sandbox, this address must be verified. RECIPIENT = "recipient@example.com" # Specify a configuration set. If you do not want to use a configuration # set, comment the following variable, and the # ConfigurationSetName=CONFIGURATION_SET argument below. CONFIGURATION_SET = "ConfigSet" # If necessary, replace us-west-2 with the AWS Region you're using for Amazon SES. AWS_REGION = "us-west-2" # The subject line for the email. SUBJECT = "Customer service contact info" # The full path to the file that will be attached to the email. ATTACHMENT = "path/to/customers-to-contact.xlsx" # The email body for recipients with non-HTML email clients. BODY_TEXT = "Hello,\r\nPlease see the attached file for a list of customers to contact." # The HTML body of the email. BODY_HTML = """\ <html> <head></head> <body> <h1>Hello!</h1> <p>Please see the attached file for a list of customers to contact.</p> </body> </html> """ # The character encoding for the email. CHARSET = "utf-8" # Create a new SES resource and specify a region. client = boto3.client('ses',region_name=AWS_REGION) # Create a multipart/mixed parent container. msg = MIMEMultipart('mixed') # Add subject, from and to lines. msg['Subject'] = SUBJECT msg['From'] = SENDER msg['To'] = RECIPIENT # Create a multipart/alternative child container. msg_body = MIMEMultipart('alternative') # Encode the text and HTML content and set the character encoding. This step is # necessary if you're sending a message with characters outside the ASCII range. textpart = MIMEText(BODY_TEXT.encode(CHARSET), 'plain', CHARSET) htmlpart = MIMEText(BODY_HTML.encode(CHARSET), 'html', CHARSET) # Add the text and HTML parts to the child container. msg_body.attach(textpart) msg_body.attach(htmlpart) # Define the attachment part and encode it using MIMEApplication. att = MIMEApplication(open(ATTACHMENT, 'rb').read()) # Add a header to tell the email client to treat this part as an attachment, # and to give the attachment a name. att.add_header('Content-Disposition','attachment',filename=os.path.basename(ATTACHMENT)) # Attach the multipart/alternative child container to the multipart/mixed # parent container. msg.attach(msg_body) # Add the attachment to the parent container. msg.attach(att) #print(msg) try: #Provide the contents of the email. response = client.send_raw_email( Source=SENDER, Destinations=[ RECIPIENT ], RawMessage={ 'Data':msg.as_string(), }, ConfigurationSetName=CONFIGURATION_SET ) # Display an error if something goes wrong. except ClientError as e: print(e.response['Error']['Message']) else: print("Email sent! Message ID:"), print(response['MessageId'])