Python - Invio di e-mail tramite SMTP

Il protocollo SMTP (Simple Mail Transfer Protocol) è un protocollo che gestisce l'invio di e-mail e il routing della posta tra i server di posta.

Python fornisce smtplib modulo, che definisce un oggetto di sessione client SMTP che può essere utilizzato per inviare posta a qualsiasi macchina Internet con un daemon listener SMTP o ESMTP.

Ecco una semplice sintassi per creare un oggetto SMTP, che può essere successivamente utilizzato per inviare un'e-mail:

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Ecco il dettaglio dei parametri -

  • host- Questo è l'host che esegue il tuo server SMTP. Puoi specificare l'indirizzo IP dell'host o un nome di dominio come tutorialspoint.com. Questo è un argomento opzionale.

  • port- Se si fornisce l' argomento host , è necessario specificare una porta su cui è in ascolto il server SMTP. Di solito questa porta sarebbe 25.

  • local_hostname- Se il tuo server SMTP è in esecuzione sulla tua macchina locale, puoi specificare solo localhost a partire da questa opzione.

Un oggetto SMTP dispone di un metodo di istanza chiamato sendmail, che viene generalmente utilizzato per eseguire il lavoro di invio di un messaggio. Ci vogliono tre parametri:

  • Il mittente : una stringa con l'indirizzo del mittente.

  • I destinatari : un elenco di stringhe, una per ciascun destinatario.

  • Il messaggio - Un messaggio sotto forma di stringa formattata come specificato nelle varie RFC.

Esempio

Ecco un modo semplice per inviare un'e-mail utilizzando lo script Python. Provalo una volta -

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Qui, hai inserito una semplice e-mail nel messaggio, usando una virgoletta tripla, avendo cura di formattare correttamente le intestazioni. Una e-mail richiede unFrom, To, e Subject intestazione, separata dal corpo dell'e-mail con una riga vuota.

Per inviare la posta si utilizza smtpObj per connettersi al server SMTP sulla macchina locale e quindi utilizzare il metodo sendmail insieme al messaggio, l'indirizzo del mittente e l'indirizzo di destinazione come parametri (anche se gli indirizzi da e a sono all'interno dell'e -mail stessa, questi non sono sempre usati per instradare la posta).

Se non si esegue un server SMTP sulla macchina locale, è possibile utilizzare il client smtplib per comunicare con un server SMTP remoto. A meno che tu non stia utilizzando un servizio di webmail (come Hotmail o Yahoo! Mail), il tuo provider di posta elettronica deve averti fornito i dettagli del server di posta in uscita che puoi fornire, come segue:

smtplib.SMTP('mail.your-domain.com', 25)

Invio di un'e-mail HTML utilizzando Python

Quando invii un messaggio di testo utilizzando Python, tutto il contenuto viene trattato come testo semplice. Anche se includi tag HTML in un messaggio di testo, viene visualizzato come testo semplice ei tag HTML non verranno formattati secondo la sintassi HTML. Ma Python fornisce l'opzione per inviare un messaggio HTML come messaggio HTML effettivo.

Durante l'invio di un messaggio di posta elettronica, è possibile specificare una versione Mime, un tipo di contenuto e un set di caratteri per inviare un messaggio di posta elettronica HTML.

Esempio

Di seguito è riportato l'esempio per inviare contenuto HTML come e-mail. Provalo una volta -

#!/usr/bin/python

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Invio di allegati come e-mail

Per inviare un'e-mail con contenuto misto è necessario impostare Content-type intestazione a multipart/mixed. Quindi, le sezioni di testo e allegato possono essere specificate all'internoboundaries.

Un confine inizia con due trattini seguiti da un numero univoco, che non può apparire nella parte del messaggio del messaggio di posta elettronica. Anche un confine finale che denota la sezione finale dell'e-mail deve terminare con due trattini.

I file allegati dovrebbero essere codificati con l'estensione pack("m") funzione per avere la codifica base64 prima della trasmissione.

Esempio

Di seguito è riportato l'esempio, che invia un file /tmp/test.txtcome un allegato. Provalo una volta -

#!/usr/bin/python

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"