Raspberry Pi – Mailen via een Python script
Het is mogelijk via een python script een email te sturen doormiddel van de smtplib bibliotheek, deze zit standaard al in de python installatie op de raspberry pi.
Tekst mail versturen
Maak een script aan bijvoorbeeld mail.py, met deze inhoud:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# Importeer de smtplib voor email functies. import smtplib # Importeer de email modules. from email.mime.text import MIMEText # Definieer email adressen. adres_naar = 'gebruiker1@voorbeeld.nl' adres_van = 'gebruiker2@voorbeeld.nl' # Definieer SMTP email server gegevens. smtp_server = 'mail.server.nl' smtp_gebruiker = 'test@voorbeeld.nl' smtp_wachtwoord = '123456789' # Bouw de email op. msg = MIMEText('This is a test email') msg['To'] = adres_naar msg['From'] = adres_van msg['Subject'] = 'Test email van de Raspberry Pi!' # Stuur het bericht via de SMTP server. s = smtplib.SMTP(smtp_server) s.login(smtp_gebruiker, smtp_wachtwoord) s.sendmail(adres_van, adres_naar, msg.as_string()) s.quit() |
Om een mail te sturen, start het script met python mail.py
Hier is een ander voorbeeld:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import smtplib # Server instellingen MailServerAdres = "smtp.website.nl" MailServerPoort = "587" MailServerLogin = "" MailServerPass = "" # Mail bericht MailOntvanger = "info@website.nl" MailZender = "info@website.nl" MailOnderwerp = "Onderwerp" MailBericht = "Hallo Wereld" # Contact maken met mailserver mailserver = smtplib.SMTP(MailServerAdres, MailServerPoort) mailserver.starttls() # TLS versleuteling nodig voor Hotmail/Gmail (werkt ook met Hostnet) mailserver.login(MailServerLogin, MailServerPass) # Bericht samenstellen bericht = 'To:' + MailOntvanger + '\n' + 'From: ' + MailZender + '\n' + 'Subject:' + MailOnderwerp + '\n\n' + MailBericht + '\n\n' # Mail verzenden try: mailserver.sendmail(MailZender, MailOntvanger, bericht) print "OK: email verzonden" except SMTPException: print "FOUT: kan email niet verzenden!" |
Ps. krijg je deze foutmelding?:
1 2 3 4 5 6 7 8 9 10 11 12 |
Traceback (most recent call last): File "mail.py", line 23, in <module> s = smtplib.SMTP(smtp_server) File "/usr/lib/python2.7/smtplib.py", line 249, in __init__ (code, msg) = self.connect(host, port) File "/usr/lib/python2.7/smtplib.py", line 309, in connect self.sock = self._get_socket(host, port, self.timeout) File "/usr/lib/python2.7/smtplib.py", line 284, in _get_socket return socket.create_connection((port, host), timeout) File "/usr/lib/python2.7/socket.py", line 571, in create_connection raise err socket.error: [Errno 113] No route to host |
Dan kan er geen connectie gemaakt worden met de mailserver, ik kwam erachter dat eventueel de poort nog juist gezet moet worden, deze is standaard 25, maar kan per provider verschillen, daarom heb ik deze optie toegevoegd in het script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Importeer de smtplib voor email functies. import smtplib # Importeer de email modules. from email.mime.text import MIMEText # Definieer email adressen. adres_naar = 'gebruiker1@voorbeeld.nl' adres_van = 'gebruiker2@voorbeeld.nl' # Definieer SMTP email server gegevens. smtp_server = 'mail.server.nl' smtp_gebruiker = 'test@voorbeeld.nl' smtp_wachtwoord = '123456789' smtp_poort = '123' # Bouw de email op. msg = MIMEText('This is a test email') msg['To'] = adres_naar msg['From'] = adres_van msg['Subject'] = 'Test email van de Raspberry Pi!' # Stuur het bericht via de SMTP server. s = smtplib.SMTP(smtp_server, smtp_poort) s.login(smtp_gebruiker, smtp_wachtwoord) s.sendmail(adres_van, adres_naar, msg.as_string()) s.quit() |
Tekst & HTML mail versturen
Het is ook mogelijk om een bericht in HTML opmaak te versturen via de mail, maak een script aan bijvoorbeeld mail.py, met deze inhoud:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# Importeer de smtplib voor email functies. import smtplib # Importeer de email modules. from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # Definieer email adressen. adres_naar = 'gebruiker1@voorbeeld.nl' adres_van = 'gebruiker2@voorbeeld.nl' # Definieer SMTP email server gegevens. smtp_server = 'mail.server.nl' smtp_gebruiker = 'test@voorbeeld.nl' smtp_wachtwoord = '123456789' smtp_poort = '123' # Bouw de email op. msg = MIMEMultipart('This is a test email') msg['To'] = adres_naar msg['From'] = adres_van msg['Subject'] = 'Test email van de Raspberry Pi!' # Creer de "body" van het mailbericht (een standaard tekst en HTML versie). tekst = "Dit is een testbericht.\nTekst en HTML." html = """\ <html> <head></head> <body> <p>Dit is een testbericht.</p> <p><b>Tekst en HTML<b></p> </body> </html> """ # Stel de MIME typen in van beide gedeeltes als text/plain en text/html. deel1 = MIMEText(tekst, 'plain') deel2 = MIMEText(html, 'html') # Koppel de 2 gedeelten als een berchten "container". # Volgens RFC 2046, is het laatste bericht van een "multipart" bericht # (in dit geval het HTML bericht) het beste en wordt daar voorkeur aan gegeven. msg.attach(deel1) msg.attach(deel2) # Stuur het bericht via de SMTP server. s = smtplib.SMTP(smtp_server, smtp_poort) s.login(smtp_gebruiker, smtp_wachtwoord) s.sendmail(adres_van, adres_naar, msg.as_string()) s.quit() |
Stuur het bericht met het commando: python mail.py
Tekst, HTML & Bijlagen versturen
Het is ook mogelijk om een bericht in HTML opmaak te versturen via de mail en daar bijlagen aan toe te voegen, voor zowel plaatjes als overige bestanden zijn daar verschillende methoden voor, maak een script aan bijvoorbeeld mail.py, met deze inhoud:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# Importeer bibliotheek voor systeem functies. import os # Importeer de smtplib voor email functies. import smtplib # Importeer de email modules. from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # Importeer bibliotheek voor bijlage van plaatjes. from email.mime.image import MIMEImage # Importeer bibliotheek voor bijlage van andere bestanden. from email.mime.application import MIMEApplication # Definieer email adressen. adres_naar = 'gebruiker1@voorbeeld.nl' adres_van = 'gebruiker2@voorbeeld.nl' # Definieer SMTP email server gegevens. smtp_server = 'mail.server.nl' smtp_gebruiker = 'test@voorbeeld.nl' smtp_wachtwoord = '123456789' smtp_poort = '123' # Bouw de email op. msg = MIMEMultipart('This is a test email') msg['To'] = adres_naar msg['From'] = adres_van msg['Subject'] = 'Test email van de Raspberry Pi!' # Creer de "body" van het mailbericht (een standaard tekst en HTML versie). tekst = "Dit is een testbericht.\nTekst en HTML." html = """\ <html> <head></head> <body> <p>Dit is een testbericht.</p> <p><b>Tekst en HTML<b></p> </body> </html> """ # Stel de MIME typen in van beide gedeeltes als text/plain en text/html. deel1 = MIMEText(tekst, 'plain') deel2 = MIMEText(html, 'html') # Stel de MIME type in van een plaatje. bestandplaatje1 = "plaatje.png" plaatje1 = MIMEImage(file(bestandplaatje1).read(), name=os.path.basename(bestandplaatje1)) # Stel de MIME type in van een ander type bestand. bestandoverig1 = "bestand.pdf" bestand1 = MIMEApplication(file(bestandoverig1).read(), name=os.path.basename(bestandoverig1)) # Koppel de 4 gedeelten als een berchten "container". # Volgens RFC 2046, is het laatste bericht van een "multipart" bericht # (in dit geval het HTML bericht) het beste en wordt daar voorkeur aan gegeven. msg.attach(deel1) msg.attach(deel2) msg.attach(plaatje1) msg.attach(bestand1) # Stuur het bericht via de SMTP server. s = smtplib.SMTP(smtp_server, smtp_poort) s.login(smtp_gebruiker, smtp_wachtwoord) s.sendmail(adres_van, adres_naar, msg.as_string()) s.quit() |
Mailen via Gmail
Mailen via een Gmail account is wat tricky, deze code is getest en werkt. Er wordt hiermee een “plain” bericht verstuurd.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# Importeer bibliotheek voor systeem functies. import os # Importeer de smtplib voor email functies. import smtplib # Importeer de email modules. from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # Importeer bibliotheek voor bijlage van plaatjes. from email.mime.image import MIMEImage # Importeer bibliotheek voor bijlage van andere bestanden. from email.mime.application import MIMEApplication # Definieer email adressen. adres_naar = 'gebruiker1@voorbeeld.nl' adres_van = 'gebruiker2@voorbeeld.nl' # Definieer SMTP email server gegevens. smtp_server = 'smtp.gmail.com' smtp_gebruiker = 'test@voorbeeld.nl' smtp_wachtwoord = '123456789' smtp_poort = '587' # Bouw de email op. msg = "\r\n".join([ "From: " + adres_van, "To: " + adres_naar, "Subject: Testbericht", "", "Hallo wereld!" ]) # Stuur het bericht via de SMTP server. s = smtplib.SMTP(smtp_server, smtp_poort) s.ehlo() s.starttls() s.login(smtp_gebruiker, smtp_wachtwoord) s.sendmail(adres_van, adres_naar, msg) s.quit() |
Bronnen:
raspberrypi-spy.co.uk
stackoverflow.com #1
codeadict.wordpress.com
stackoverflow.com #2
pythonforbeginners.com
tutorialspoint.com
mkyong.com
stackoverflow.com #3