Invio di e-mail non elaborate utilizzando l'API Amazon SES 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 utilizzando l'API Amazon SES 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

SMTP (Simple Mail Transfer Protocol) specifica come devono essere inviati i messaggi e-mail definendo l'envelope del messaggio e-mail e alcuni dei relativi parametri senza fare riferimento al contenuto del messaggio. Il formato IMF (Internet Message Format) (RFC 5322) definisce invece il modo in cui il messaggio deve essere creato.

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.

Uso di MIME

Il protocollo SMTP è stato progettato per inviare messaggi e-mail che contengono solo caratteri ASCII a 7 bit. Questa specifica rende SMTP insufficiente per le codifiche di testo non ASCII (ad esempio Unicode), il contenuto binario o gli allegati. Lo standard MIME (Multipurpose Internet Mail Extensions) è stato sviluppato per rendere possibile l'invio di molti altri tipi di contenuti tramite il protocollo SMTP.

Lo standard MIME funziona suddividendo il corpo messaggio in più parti, quindi specificando cosa fare con ogni parte. Una parte del corpo di un messaggio e-mail può ad esempio essere costituita da testo semplice e un'altra può essere in formato HTML. MIME permette inoltre ai messaggi e-mail 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 in più parti nell'esempio seguente contiene una parte di testo, una parte HTML 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 include versioni alternative dello stesso contenuto (in questo caso, una versione di testo e una versione HTML). Se il client e-mail del destinatario è in grado di visualizzare contenuti HTML, viene visualizzata la versione HTML del corpo del messaggio. Se il client e-mail del destinatario non è in grado di visualizzare contenuti HTML, viene visualizzata la versione con testo normale 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 nidifichi una parte MIME all'interno di un'altra parte, come in questo esempio, la parte nidificata deve usare un parametro boundary distinto dal parametro boundary nella parte padre. Queste delimitazioni devono essere costituite da stringhe di caratteri univoche. Per definire una delimitazione tra parti MIME, digita due trattini (--) seguiti dalla stringa di delimitazione. Alla fine di una parte MIME, posiziona due trattini sia all'inizio che alla fine della stringa di delimitazione.

Nota

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

Codifica MIME

Per mantenere la compatibilità con i sistemi meno recenti, Amazon SES mantiene la limitazione ASCI a 7 bit di SMTP secondo quanto previsto dallo standard RFC 2821. Se desideri inviare contenuti che contengono caratteri non ASCII, devi codificare i caratteri in un formato che utilizza caratteri ASCII a 7 bit.

Indirizzi e-mail

La stringa dell'indirizzo e-mail deve essere ASCII a 7 bit. 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 desideri utilizzare caratteri Unicode nel nome del mittente, devi codificarlo con la sintassi MIME, come descritto in Invio di e-mail non elaborate utilizzando l'API Amazon SES v2. Per ulteriori informazioni su Punycode, consulta RFC 3492.

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 un messaggio, utilizza la sintassi codificata MIME. La sintassi codificata MIME usa 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 sul Q-encoding, consulta RFC 2047. Per ulteriori informazioni sulla codifica base64, consulta RFC 2045.

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 Content-Transfer-Encoding a 8 bit nei messaggi inviati utilizzando Amazon SES. Tuttavia, se Amazon SES deve apportare delle modifiche ai tuoi messaggi (ad esempio, quando utilizzi il monitoraggio di aperture e clic), i contenuti codificati a 8 bit potrebbero non comparire correttamente quando il messaggio raggiunge la casella della posta in arrivo del destinatario. Per questo motivo, è sempre consigliabile codificare i contenuti che non siano ASCII a 7 bit.

File allegati

Per allegare un file a un'e-mail, devi codificare l'allegato utilizzando la codifica base64. Gli allegati sono in genere posizionati nelle parti del messaggio MIME dedicate, le quali includono le seguenti intestazioni:

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

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

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

    • Immagine JPG: 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 non accettati da Amazon SES, consulta Tipi di allegati non supportati di Amazon SES.

Invio di e-mail non elaborate utilizzando l'API Amazon SES v2

L'API Amazon SES 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 Javacomporre e inviare un'e-mail 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 codice di esempio seguente illustra come usare i pacchetti Python email.mime e AWS SDK for Python (Boto) per comporre e inviare un messaggio e-mail in formato RAW.

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'])