Invio di e-mail non elaborate tramite Amazon SES API v2 - Amazon Simple Email Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Invio di e-mail non elaborate tramite Amazon SES API v2

Puoi utilizzare l'SendEmailoperazione Amazon SES API v2 con il tipo di contenuto specificato raw per inviare messaggi personalizzati ai destinatari utilizzando il formato e-mail non elaborato.

Informazioni su campi di intestazione e-mail

Simple Mail Transfer Protocol (SMTP) specifica come inviare i messaggi e-mail definendo la busta di posta e alcuni dei suoi parametri, ma non si occupa del contenuto del messaggio. Invece, l'Internet Message Format (RFC5322) definisce come deve essere costruito il messaggio.

Con la specifica IMF, ogni messaggio e-mail è costituito da un'intestazione e un corpo. L'intestazione è costituita dai metadata del messaggio e il corpo contiene il messaggio. Per ulteriori informazioni su intestazione e corpo dei messaggi e-mail, consulta Formato dell'e-mail in Amazon SES.

Usando MIME

Il SMTP protocollo è stato originariamente progettato per inviare messaggi di posta elettronica contenenti solo ASCII caratteri a 7 bit. Questa specifica non è SMTP sufficiente per le codifiche non ASCII testuali (come Unicode), il contenuto binario o gli allegati. Lo standard Multipurpose Internet Mail Extensions (MIME) è stato sviluppato per consentire l'invio di molti altri tipi di contenuti utilizzando. SMTP

Lo MIME standard funziona suddividendo il corpo del messaggio in più parti e quindi specificando cosa fare con ciascuna parte. Ad esempio, una parte del corpo di un messaggio di posta elettronica potrebbe essere in testo semplice, mentre un'altra potrebbe HTML esserlo. Inoltre, MIME consente ai messaggi di posta elettronica di contenere uno o più allegati. I destinatari dei messaggi possono visualizzare gli allegati dai propri client e-mail oppure possono salvarli.

L'intestazione del messaggio e il contenuto sono separati da una riga vuota. Ogni parte del messaggio e-mail è separata da una stringa di caratteri di delimitazione che indica l'inizio e la fine della parte.

Il messaggio composto da più parti nell'esempio seguente contiene un testo e una HTML parte e un allegato. L'allegato va posizionato appena sotto alle intestazioni allegati ed è spesso codificato in base64, come mostrato in questo esempio.

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

Il tipo di contenuto per il messaggio è multipart/mixed, che indica che il messaggio ha molte parti (in questo esempio, un corpo e un allegato) e che il client di ricezione deve gestire ogni parte separatamente.

Nidificata all'interno della sezione del corpo si trova una seconda parte, che usa il tipo di contenuto multipart/alternative. Questo tipo di contenuto indica che ogni parte contiene versioni alternative dello stesso contenuto (in questo caso, una versione testuale e una HTML versione). Se il client di posta elettronica del destinatario è in grado di visualizzare il HTML contenuto, mostra la HTML versione del corpo del messaggio. Se il client di posta elettronica del destinatario non è in grado di visualizzare il HTML contenuto, mostra la versione in testo semplice del corpo del messaggio.

Entrambe le versioni del messaggio conterranno inoltre un allegato (in questo caso, un breve file di testo che contiene i nomi dei clienti).

Quando nidificate una MIME parte all'interno di un'altra parte, come in questo esempio, la parte nidificata deve utilizzare un boundary parametro distinto dal boundary parametro della parte principale. Queste delimitazioni devono essere costituite da stringhe di caratteri univoche. Per definire un limite tra le MIME parti, digitate due trattini (--) seguiti dalla stringa limite. Alla fine di una MIME parte, inserite due trattini sia all'inizio che alla fine della stringa limite.

Nota

Un messaggio non può contenere più di 500 parti. MIME

MIMECodifica

Per mantenere la compatibilità con i sistemi precedenti, Amazon SES rispetta la ASCII limitazione di 7 bit SMTP definita nel RFC 2821. Se desideri inviare contenuti che non contengano ASCII caratteri, devi codificare tali caratteri in un formato che utilizzi caratteri a 7 bit. ASCII

Indirizzi e-mail

La stringa dell'indirizzo e-mail deve essere a 7 bit. ASCII Se desideri utilizzare indirizzi e-mail (del mittente o del destinatario) che contengono caratteri Unicode nella parte del dominio, devi codificare il dominio utilizzando Punycode. Punycode non è consentito nella parte locale dell'indirizzo e-mail (ad esempio, la parte prima della @), né nel nome del mittente. Se si desidera utilizzare caratteri Unicode nel nome «descrittivo da», è necessario codificare il nome «descrittivo da» utilizzando la sintassi delle MIME parole codificate, come descritto in. Invio di e-mail non elaborate tramite Amazon SES API v2 Per ulteriori informazioni su Punycode, vedere 3492. RFC

Nota

Questa regola si applica solo agli indirizzi e-mail che specifichi nella busta del messaggio, non alle intestazioni dei messaggi. Quando utilizzi l'SendEmailoperazione Amazon SES API v2, gli indirizzi specificati nei Destinations parametri Source e definiscono rispettivamente il mittente e il destinatario della busta.

Intestazioni dell'e-mail

Per codificare l'intestazione di un messaggio, usa la sintassi con parole codificate. MIME MIMEla sintassi delle parole codificate utilizza il seguente formato:

=?charset?encoding?encoded-text?=

Il valore di encoding può essere Q o B. Se il valore di codifica è Q, il valore encoded-text deve utilizzare il Q-encoding. Se il valore di codifica è B, il valore di encoded-text deve utilizzare la codifica base64.

Ad esempio, se vuoi utilizzare la stringa "Як ти поживаєш?" Nella riga dell'oggetto di un messaggio e-mail, puoi utilizzare le seguenti codificazioni:

  • Q-encoding

    =?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?=
  • Codifica Base64

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

Per ulteriori informazioni sulla codifica Q, vedere 2047. RFC Per ulteriori informazioni sulla codifica base64, vedere 2045. RFC

Corpo del messaggio

Per codificare un messaggio, puoi utilizzare la codifica quoted-printable o la codifica Base64. Quindi, utilizza l'intestazione Content-Transfer-Encoding per indicare quale schema di codifica hai utilizzato.

Ad esempio, ipotizzando che il corpo del messaggio contenga il seguente testo:

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

Se scegli di codificare questo testo usando la codifica base64, devi prima specificare la seguente intestazione:

Content-Transfer-Encoding: base64

Quindi, nella sezione del corpo dell'e-mail, devi includere il testo con codifica base64:

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

In alcuni casi, puoi utilizzare l'8 bit Content-Transfer-Encoding nei messaggi che invii tramite AmazonSES. Tuttavia, se Amazon SES deve apportare modifiche ai tuoi messaggi (ad esempio, quando utilizzi il tracciamento delle aperture e dei clic), i contenuti con codifica a 8 bit potrebbero non apparire correttamente quando arrivano nelle caselle di posta dei destinatari. Per questo motivo, dovresti sempre codificare contenuti che non siano a 7 bit. ASCII

File allegati

Per allegare un file a un'e-mail, devi codificare l'allegato utilizzando la codifica base64. Gli allegati vengono in genere inseriti in sezioni dedicate ai MIME messaggi, che includono le seguenti intestazioni:

  • Content-Type (Tipo di contenuto): il tipo di file dell'allegato. Di seguito sono riportati alcuni esempi di dichiarazioni MIME Content-Type comuni:

    • File di testo normale: Content-Type: text/plain; name="sample.txt"

    • Documento Microsoft Word: Content-Type: application/msword; name="document.docx"

    • JPGimmagine — Content-Type: image/jpeg; name="photo.jpeg"

  • Content-Disposition (Disposizione del contenuto): specifica il modo in cui il client e-mail del destinatario deve gestire i contenuti. Per gli allegati, questo valore è Content-Disposition: attachment.

  • Content-Transfer-Encoding (Codifica trasferimento del contenuto): lo schema utilizzato per codificare l'allegato. Per i file allegati, questo valore è quasi sempre base64.

  • L'allegato codificato: è necessario codificare l'allegato vero e proprio e includerlo nel corpo sotto le intestazioni degli allegati, come mostrato nell'esempio.

Amazon SES accetta i tipi di file più comuni. Per un elenco dei tipi di file che Amazon SES non accetta, consultaTipi di SES allegati non supportati da Amazon.

Invio di e-mail non elaborate tramite Amazon SES API v2

Amazon SES API v2 fornisce l'SendEmailazione, che consente di comporre e inviare un messaggio e-mail nel formato specificato quando si imposta il tipo di contenuto su semplice, non elaborato o basato su modelli. Per una descrizione completa, consulta. SendEmail L'esempio seguente specificherà il tipo di contenuto raw per l'invio di messaggi utilizzando il formato e-mail non elaborato.

Nota

Per suggerimenti su come aumentare la velocità di invio delle e-mail quando effettui più chiamate a SendEmail, consulta Aumento della velocità effettiva con Amazon SES.

Il corpo del messaggio deve contenere un messaggio e-mail in formato RAW formattato correttamente, con codifica appropriata per i campi di intestazione e il corpo del messaggio. Anche se è possibile creare il messaggio in formato RAW manualmente all'interno di un'applicazione, è molto più facile farlo usando le librerie di posta esistenti.

Java

Il seguente esempio di codice mostra come utilizzare la JavaMaillibreria e AWS SDK for Javaper comporre e inviare un'email non elaborata.

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

Il seguente esempio di codice mostra come usare i pacchetti Python email.mime e il AWS SDK for Python (Boto)per comporre e inviare un'email non elaborata.

import json 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 import os def boto3_rawemailv2(): SENDER = "Sender <sender@example.com>" RECIPIENT = "recipient@example.com" CONFIGURATION_SET = "ConfigSet" AWS_REGION = "us-east-1" SUBJECT = "Customer service contact info" ATTACHMENT = "path/to/customers-to-contact.xlsx" 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/> <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" 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) msg.attach(att) #changes start from here strmsg = str(msg) body = bytes (strmsg, 'utf-8') client = boto3.client('sesv2') response = client.send_email( FromEmailAddress=SENDER, Destination={ 'ToAddresses': [RECIPIENT] }, Content={ 'Raw': { 'Data': body } } ) print(response) boto3_rawemailv2 ()