E-mail versturen met Python

Op deze pagina:

Het handmatig versturen van meerdere e-mails kan veel werk zijn, je kan het automatiseren met Python.

Python heeft een smtplib module voor het versturen van e-mails via Simple Mail Transfer Protocol (SMTP). Deze module gebruikt het RFC 821 protocol voor SMTP. Simple Mail Transfer Protocol (SMTP) is een protocol voor het versturen en routen van e-mail tussen mailservers.

De smtplib module van Python geeft een SMTP client session object die gebruikt kan worden om e-mail te versturen naar een systeem met een SMTP of ESMTP listener daemon.

Gebruik:



import smtplib

smtpObj = smtplib.SMTP( [host [, poort [, local_hostnaam]]] )

De parameters:

host
De host waarop de SMTP server draait, dit mag een IP-adres zijn of een domeinnaam. Deze parameter is optioneel.
poort
Als je een host opgeeft, dan moet je ook een poort opgeven, de standaardpoort voor het versturen van e-mails is 25.
local_hostnaam
Als je SMTP server op je lokale machine draait, dan kan je hier localhost opgeven.

Een SMTP object heeft een methode die sendmail heet welke je kan gebruiken om een e-mail te versturen. Deze accepteert drie parameters:

De afzender
Een string met het e-mailadres van de afzender.
De geadresseerden
Een lijst met strings, één voor iedere geadresseerde.
De inhoud
Een string die aan de diverse specificaties voldoet voor de inhoud.

Een beschrijving van smtplib kan je kijgen door in een interactieve Python sessie het volgende in te geven:


import smtplib
help(smtplib)

Je komt hier weer uit door op de Q toets te drukken.

Lokale test e-mailserver gebruiken

Bij het ontwikkelen van een Python script voor het versturen van e-mails kan het handig zijn om een testmailserver te gebruiken om te voorkomen dat je als spammer wordt gebrandmerkt.

Je kan e-mail functionaliteit testen met een lokale SMTP debugging server via de smtpd module van Python.

In plaats van de e-mails echt te versturen worden ze dan afgedrukt naar de console (stdout). Je hoeft op deze manier ook geen versleuteling in te stellen. Ook inloggegevens voor de mailserver zijn dan overbodig.

Een lokale SMTP debugging server kan je starten met:


sudo python -m smtpd -c DebuggingServer -n localhost:1025

Op Windows kan je sudo weglaten.Hiermee kan je kijken of je script werkt. Je kunt dan echter niet zien hoe je HTML e-mail er uit zal zien.

Een modernere SMTP module is aiosmtpd, deze moet je echter installeren, terwijl smtpd al in Python zit.

G-mail account gebruiken als mailserver

Als je met Python via Gmail wil mailen, dan moet je de beveiligingsinstellingen aanpassen in Gmail. Het is daarom aan te raden om hier niet je reguliere account voor te gebruiken, maar een extra account aan te maken speciaal voor dit doel. Eventuele antwoorden op je verzonden e-mails kan je dan gewoon laten doorsturen naar je reguliere account.

Ga in je Google-account naar Beveiliging:

gmail beveiliging

Zet Toegang door minder goed beveiligde apps aan (in het plaatje staat deze uit):

gmail toegang door minder goed beveiligde apps

Als je 2-factor authenticatie hebt ingesteld op je Google account, dan is er een andere instelling, dan kan je app-wachtwoorden instellen: Inloggen met app-wachtwoorden.

Het handige aan testen met een Gmail-account is dat je extra adressen kan emuleren door gebruik van het plus-teken. Zowel kees+klant1@gmail.com als kees+klant2@gmail.com zullen in de inbox van kees@gmail.com terechtkomen.

De servernaam voor Gmail is smtp.gmail.com en de poort is 465 voor een SSL/TLS verbinding. Eventueel kan ook poort 587 gebruikt worden voor een STARTTLS verbinding.



#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl

poort = 465  # Voor SSL
  
# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", poort, context=context) as server:
    server.login("HierJeGebruikersnaamVanGmail@gmail.com", wachtwoord)

Yagmail voor Gmail

Met Yagmail is het versturen van e-mails via Gmail en Python nog eenvoudiger. Het is specifiek bedoeld voor e-mail versturen met Gmail.

Office365 Outlook gebruiken als mailserver

Als je in Outlook kijkt welke SMTP instellingen er gebruikt moet worden, dan kan je zien dat starttls gebruikt wordt.

Ga in Outlook naar Instellingen:

outlook instellingen

je moet dan klikken op Alle Outlook-instellingen weergeven

Outlook E-mail synchroniseren

Ga naar E-mail synchroniseren

Outlook SMTP-instelling

Hier zie je staan:

servernaam: smtp.office365.compoort: 587encryptie methode: STARTTLS

De SMTP verbinding beveiligen

SSL (Secure Sockets Layer) en TLS (Transport Layer Security) zijn protocollen die gebruikt kunnen worden om een SMTP verbinding te versleutelen. Als je een lokale debugging server gebruikt omdat je aan het testen bent, dan heb je dat niet nodig.

Er zijn twee manieren om een beveiligde verbinding te starten met je e-mailserver:

  1. Start een SMTP verbinding die is beveiligd vanaf het begin via SMTP_SSL().
  2. Start een onbeveiligde verbinding die dan kan worden versleuteld met .starttls().

Wat beveiliging betreft is het aan te raden om create_default_context() te gebruiken uit de ssl module. Dit zal de vertrouwde CA certificaten van het systeem laden, de hostnaam controle aanzetten en veilige protocollen en versleutel instellingen gebruiken.

De smtplib module is de ingebouwde Python module voor het versturen van e-mails naar systemen met een SMTP of ESMTP listener daemon.

Optie 1: SMTP_SSL()


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl

poort = 465  # Voor SSL

# Hier je email vervangen door je echte emailadres:
email = "naam@bedrijf.nl"

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

# Een veilige SSL context maken
context = ssl.create_default_context()

with smtplib.SMTP_SSL(mailserver, poort, context=context) as server:
    server.login(email, wachtwoord)
    # Hier het versturen van de e-mail

Het gebruik van with smtplib.SMTP_SSL() as server zorgt ervoor dat de verbinding automatisch wordt gesloten aan het einde van het ingesprongen blok code.

Als de poort nul is, of niet is opgegeven, dan zal .SMTP_SSL() de standaard poort voor SMTP over SSL (poort 465) gebruiken.

Optie 2: .starttls()

In plaats van het gebruik van .SMTP_SSL() om een verbinding op te zetten die vanaf het begin beveiligd is, kan je een onbeveiligde SMTP verbinding starten en die beveiligen met .starttls().


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

poort = 587  # Voor starttls

# Hier je email vervangen door je echte emailadres:
email = "naam@bedrijf.nl"

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

# Beveiligde SSL context maken
context = ssl.create_default_context()

# Op de mailserver inloggen en e-mail versturen
try:
    server = smtplib.SMTP(mailserver,poort)
    server.ehlo() # mag weggelaten worden
    # Beveilig de verbinding:
    server.starttls(context=context) 
    server.ehlo() # mag weggelaten worden
    server.login(email, wachtwoord)
    # Hier het versturen van de e-mail
except Exception as e:
    # Foutmeldingen naar stdout
    print(e)
finally:
    server.quit() 

Om jezelf te indentificeren aan de e-mailserver, moet .helo() (SMTP) of .ehlo() (ESMTP) worden aangeroepen na het maken van een .SMTP() object en opnieuw na .starttls(). Deze functie wordt al aangeroepen door .starttls() en .sendmail() wanneer dit nodig is, daarom is het niet nodig om deze expliciet te gebruiken.

Platte tekst e-mail versturen

Nadat je een veilige SMTP verbinding hebt gestart, kan je e-mail versturen met sendmail.

Gebruik:


server.sendmail(van_email, aan_email, boodschap)

Bij Subject moet je het onderwerp van de email opgeven, gevolgd door een lege regel, dan komt het bij de ontvanger ook als onderwerp aan.

Voorbeeld van platte tekst e-mail met SMTP_SSL():



#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl

poort = 465  # Voor SSL

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Hier je emailadres vervangen door je echte emailadres:
van_email = "naam@bedrijf.nl"  # Jouw e-mailadres

# Hier het emailadres vervangen door het echte emailadres:
aan_email = "naam@bedrijf.nl"  # E-mail van de ontvanger

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

boodschap = """\
Subject: Dit is het onderwerp

Deze mail is verstuurd met Python."""

context = ssl.create_default_context()
with smtplib.SMTP_SSL(mailserver, poort, context=context) as server:
    server.login(van_email, wachtwoord)
    server.sendmail(van_email, aan_email, boodschap)

Hier hetzelfde, maar nu met .starttls(). De regels met server.ehlo() mogen worden weggelaten.


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl

poort = 465  # Voor SSL

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Hier je emailadres vervangen door je echte emailadres:
van_email = "naam@bedrijf.nl"  # Jouw e-mailadres

# Hier het emailadres vervangen door het echte emailadres:
aan_email = "naam@bedrijf.nl"  # E-mail van de ontvanger

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

boodschap = """\
Subject: Dit is het onderwerp

Deze mail is verstuurd met Python."""

context = ssl.create_default_context()
with smtplib.SMTP(mailserver, poort) as server:
    server.ehlo()  # Mag weggelaten worden
    server.starttls(context=context)
    server.ehlo()  # mag weggelaten worden
    server.login(van_email, wachtwoord)
    server.sendmail(van_email, aan_email, boodschap)

HTML e-mail versturen

Je kan niet alleen platte tekst e-mails versturen met Python, maar ook HTML e-mails.

Het e-mailtype dat hiervoor gebruikt wordt is MIME (Multipurpose Internet Mail Extensions) Multipart e-mail, waarmee HTML en platte tekst worden gecombineerd. De Python module voor MIME boodschappen is de email.mime module.

Niet alle e-mailprogramma's zullen ingesteld zijn om te HTML tonen, sommige gebruikers willen liever platte tekst vanwege de veiligheid. Het is daarom belangrijk om niet alleen een HTML gedeelte te sturen, maar ook een platte tekst gedeelte mee te sturen.

Zet eerst het platte tekst gedeelte in je e-mail, daarna pas het HTML gedeelte, want het laatste gedeelte wordt als eerste gelezen door de e-mail client.

Voorbeeld:


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

poort = 465  # Voor SSL

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Hier je emailadres vervangen door je echte emailadres:
van_email = "naam@bedrijf.nl"  # Jouw e-mailadres

# Hier het emailadres vervangen door het echte emailadres:
aan_email = "naam@bedrijf.nl"  # E-mail van de ontvanger

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

boodschap = MIMEMultipart("alternative")
boodschap["Subject"] = "Dit is het onderwerp"
boodschap["From"] = van_email
boodschap["To"] = aan_email

tekst = """\
Deze mail is verstuurd met Python."""
html = """\
<html>
  <body>
    <p>Deze mail is verstuurd met <strong>Python</strong>.
    </p>
  </body>
</html>
"""

# MIMEText objects maken
deel1 = MIMEText(tekst, "plain")
deel2 = MIMEText(html, "html")

# Toevoegen aan de MIMEMultipart boodschap
boodschap.attach(deel1)
boodschap.attach(deel2)

# Verbinden met de mailserver en de e-mail versturen
context = ssl.create_default_context()
with smtplib.SMTP_SSL(mailserver, poort, context=context) as server:
    server.login(van_email, wachtwoord)
    server.sendmail(van_email, aan_email, boodschap.as_string()
    )

Bijlagen meeversturen

E-mailservers zijn ontworpen om met tekstgegevens te werken. Als je een bijlage mee wil sturen, bijvoorbeeld een pdf, dan moet die eerst als tekst gecodeerd worden. Dat kan met base64.

Voorbeeld:


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders

poort = 465  # Voor SSL

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Hier je emailadres vervangen door je echte emailadres:
van_email = "naam@bedrijf.nl"  # Jouw e-mailadres

# Hier het emailadres vervangen door het echte emailadres:
aan_email = "naam@bedrijf.nl"  # E-mail van de ontvanger

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

onderwerp = "Een e-mail met bijlage via Python"
bericht = "Dit bericht met bijlage is verzonden via Python"

boodschap = MIMEMultipart()
boodschap["From"] = van_email
boodschap["To"] = aan_email
boodschap["Subject"] = onderwerp

# bij mailings naar meerdere adressen
# kan je de adressen in de BCC zetten
# zodat de geadresseerden elkaars
# emailadres niet kunnen zien
boodschap["Bcc"] = aan_email  

boodschap.attach(MIMEText(bericht, "plain"))

# in dit voorbeeld staat de pdf in
# dezelfde map als het script
bestandsnaam = "Algemene_voorwaarden.pdf"

with open(bestandsnaam, "rb") as attachment:
    deel = MIMEBase("application", "octet-stream")
    deel.set_payload(attachment.read())
   
encoders.encode_base64(deel)

deel.add_header(
    "Content-Disposition",
    f"attachment; filename= {bestandsnaam}",
)

# de bijlage als tekst toevoegen
boodschap.attach(deel)
tekst = boodschap.as_string()
    
# Verbinden met de mailserver en de e-mail versturen
context = ssl.create_default_context()
with smtplib.SMTP_SSL(mailserver, poort, context=context) as server:
    server.login(van_email, wachtwoord)
    server.sendmail(van_email, aan_email, tekst)

Afbeeldingen meesturen in een e-mail

Afbeeldingen zijn eigenlijk ook bijlagen. Er zijn verschillende manieren om afbeeldingen mee te sturen:

Als CID bijlage (ingebed als een a MIME object), als base64 afbeeldingen (inline inbedden) en als gelinkte afbeeldingen.

Voor een CID bijlage voeg je het volgende toe aan je HTML e-mailscript:


# in het HTML gedeelte komt een IMG-tag:
html = """\
<html>
 <body>
   <img src="cid:Mijnplaatje">
 </body>
</html>
"""

deel = MIMEText(html, "html")
boodschap.attach(deel)

# als het plaatje in dezelfde map staat als je script:
fp = open('mijnplaatje.jpg', 'rb')
plaatje = MIMEImage(fp.read())
fp.close()

# De ID specificeren volgens de img src in het HTML deel
plaatje.add_header('Content-ID', '<Mijnplaatje>')
boodschap.attach(plaatje)

Het CID plaatje wordt zowel getoond als onderdeel van het HTML bericht en als een bijlage. De kans is dan dat dit soort berchten als spam wordt gezien. Gmail en sommige andere e-mail clients laten deze plaatjes sowieso niet zien.

Het alternatief is het inbedden van het plaatje als een base64 gecodeerde afbeelding.


# een afbeelding uit je script map coderen:
encoded = base64.b64encode(open("mijnplaatje.jpg", "rb").read()).decode()

# het plaatje in de HTML zetten:
html = f"""\
<html>
 <body>
   <img src="data:image/jpg;base64,{encoded}">
 </body>
</html>
"""

Op deze manier wordt het plaatje ingebed in de HTML en zal niet meer als bijlage zichtbaar zijn.

Een mailing versturen

Een mailing versturen op basis van gegevens die in een .csv bestand staan kan vrij eenvoudig met Python. Als je gegevens in een Excel-bestand staan, dan kan je die eenvoudig opslaan als csv-bestand.

Een Excel bestanden met gegevens:

Excel bestand

Het Excel bestand exporteren naar een csv bestand:

Excel exporteren naar csv

Het csv bestand openen met kladblok:

csv openen met kladblok

In kladblok zie je een kopregel met daaronder de gegevens gescheiden door puntkomma's:

csv geopend in kladblok

Van belang bij het gebruik van een csv bestand is het scheidingsteken, in bovenstaande afbeeldingen is dat de puntkomma, en of er een kopregel wordt meegegeven met de omschrijving van de velden.

Als Excel een bestand opslaat als csv bestand, dan kijkt Excel naar de landinstellingen van Windows voor het scheidingsteken. Omdat we de komma als decimaalteken hebben, wil Excel deze niet als scheidingsteken gebruiken. In Kladblok kan je met zoeken en vervangen de puntkomma's omzetten naar komma's. Als er ook bedragen met komma's in je Excel staan, dan is dit niet handig. Je kunt delimiter gebruiken om aan te geven dat het scheidingsteken geen komma is, maar iets anders. Als het scheidingsteken wel een komma is, dan kan je delimiter weglaten.

Stukje voorbeeldcode:


import csv

with open("mailing-test.csv", delimiter=';') as bestand:
    reader = csv.reader(bestand)
    # deze regel zorgt ervoor dat de kopregel wordt overgeslagen:
    next(reader)
    for klantnummer, naam, email, code in reader:
        print(f"E-mail aan {naam}")
        # Hier de code om e-mail te versturen

Door gebruik van with open() as bestand wordt ervoor gezorgd dat het bestand automatisch wordt gesloten aan het einde van het with blok.

In het bovenstaande voorbeeld wordt in de print opdracht een f-string gebruikt. Dit kan alleen maar als variabelen die tussen de gekrulde haken staan daarvoor al bekend zijn. Als je een gepersonaliseerd e-mailbericht wil maken en de tekst daarvan al aan het begin van het script wil plaatsen, dan zijn die variabelen nog niet bekend. Dan zul je geen f-strings kunnen gebruiken, maar moet je werken met de .format() methode.

Voorbeeld:


#!/usr/bin/python3
# -*- coding: utf-8 -*-
import csv, smtplib, ssl

poort = 465  # Voor SSL

# hier je mailserver plaatsen
mailserver = "smtp.gmail.com" # dit als je Gmail gebruikt

# Hier je emailadres vervangen door je echte emailadres:
van_email = "naam@bedrijf.nl"  # Jouw e-mailadres

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

boodschap = """Subject: Jouw code

"Beste {naam}, jouw code is {code}""""

context = ssl.create_default_context()
with smtplib.SMTP_SSL(mailserver, poort, context=context) as server:
    server.login(van_email, wachtwoord)
    with open("mailing-test.csv", delimiter=';') as bestand:
    reader = csv.reader(bestand)
    # deze regel zorgt ervoor dat de kopregel wordt overgeslagen:
    next(reader)
    for klantnummer, naam, aan_email, code in reader:
        server.sendmail(
            van_email,
            aan_email,
            boodschap.format(naam=naam, code=code),
        )

Een volledig mailingscript

Dit moet je zelf nog wat aanpassen met je eigen gegevens.



# !/usr/bin/python3
# -*- coding: utf-8 -*-
import smtplib, ssl, csv
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email import encoders
import base64
'''
Outlook:
servernaam: smtp.office365.com
poort: 587
encryptie methode: STARTTLS

Gmail:
servernaam: smtp.gmail.com
poort: 465
encryptie methode: SSL
'''

poort = {'SSL':465,
         'STARTTLS':587,
         'TEST':1025}

mailserver = {'Gmail':'smtp.gmail.com',
              'Outlook':'smtp.office365.com',
              'Test':'localhost'}

# hier het van adres (de afzender)
van_email = 'naam@bedrijfsnaam.nl' # deze aanpassen!

# Het is niet veilig om je wachtwoord in de code op
# te slaan, vandaar het gebruik van input().
wachtwoord = input("Geef je wachtwoord en druk op Enter: ")

# SSL of STARTTLS of TEST kiezen
# beveiliging = 'SSL' # Gmail
# beveiliging = 'STARTTLS' # Outlook
beveiliging = 'TEST' # localhost

# een afbeelding uit je script map coderen
# vervang logo.png door je plaatje:
encoded = base64.b64encode(open("logo.png", "rb").read()).decode()
# als je geen plaatje wil dan encoded als lege string:
#encoded = ''

def maakmailing():
        with open("mailing.csv") as bestand:
            reader = csv.reader(bestand)
            # deze regel zorgt ervoor dat de kopregel wordt overgeslagen:
            next(reader)
            for klantnummer, naam, aan_email, code in reader:
                mailtekst = maakmailtekst(klantnummer,naam,code,aan_email)
                verstuurmail(van_email, aan_email, mailtekst)
                # om te zien wat er gebeurt kan je 
                # onderstaande uit commentaar halen
                #print("klantnummer: ",klantnummer,' naam: ',naam,' code: ',code,' e-mail: ',aan_email)

def maakmailtekst(klantnummer,naam,code,aan_email):
    werkdatum = 'woensdag 28 oktober 2020'
    telefoonnummer = '088 - 1234567'
    boodschap = MIMEMultipart("alternative")
    boodschap["From"] = van_email
    boodschap["To"] = aan_email
    # deze aanpassen als je deze wil gebruiken:
    # boodschap["Bcc"] = 'naam@bedrijf.nl'
    boodschap["Subject"] = f"Werkzaamheden aan ons systeem op {werkdatum}"
    tekst = f"""\
    Klantnummer: {klantnummer}\n
    Naam: {naam}\n
    \n
    Beste klant,\n
    \n
    Op {werkdatum} wordt ons platform vernieuwd.\n
    De werkzaamheden vinden plaats van 12.00 uur tot 19:59 uur. 
    Gedurende deze tijd kan er niet met ons systeem worden gewerkt. 
    Op {werkdatum} vanaf 20:00 uur is ons systeem weer beschikbaar.\n
    \n
    Je wachtwoord wordt gewijzigd, vanaf {werkdatum} om 20:00 uur geldt dit wachtwoord:\n
    Wachtwoord: {code}\n
    Met vriendelijke groet,\n
    Ons bedrijf\n
    """
    html = f"""\
    <html>
    <body style="font-family:Calibri;">
    <p>
    Klantnummer: {klantnummer}<br>
    Naam: {naam}<br>
    </p>
    <p>Beste klant,</p>
    <p>Op {werkdatum} wordt ons platform vernieuwd.<br>
    De werkzaamheden vinden plaats van 12.00 uur tot 19:59 uur. 
    Gedurende deze tijd kan er niet met ons systeem worden gewerkt. 
    Op {werkdatum} vanaf 20:00 uur is ons systeem weer beschikbaar.<br>
    <br>
    Je wachtwoord wordt gewijzigd, vanaf {werkdatum} om 20:00 uur geldt dit wachtwoord:<br>
    Wachtwoord: {code}<br>
    Met vriendelijke groet,<br>
    Ons bedrijf<br>
    <img src="data:image/png;base64,{encoded}">\n
    </body>
    </html>
    """
    # MIMEText objects maken
    deel1 = MIMEText(tekst, "plain")
    deel2 = MIMEText(html, "html")
    # Toevoegen aan de MIMEMultipart boodschap
    boodschap.attach(deel1)
    boodschap.attach(deel2)
    # de pdf staat hier in dezelfde map als het script
    # bestandsnaam = "Algemene_voorwaarden.pdf"
    bestandsnaam = '' # dit als je geen bijlage wil
    if (bestandsnaam!=''):
        with open(bestandsnaam, "rb") as attachment:
            deel3 = MIMEBase("application", "octet-stream")
            deel3.set_payload(attachment.read())
            encoders.encode_base64(deel3)
            deel3.add_header(
                "Content-Disposition",
                f"attachment; filename= {bestandsnaam}",
            )
            # de bijlage als tekst toevoegen
            boodschap.attach(deel3)
    mailtekst = boodschap.as_string()
    return mailtekst

def verstuurmail(van_email,aan_email,mailtekst):
        if(beveiliging=='SSL'):
            context = ssl.create_default_context()
            with smtplib.SMTP_SSL(mailserver['Gmail'], poort['SSL'], context=context) as server:
                server.login(van_email, wachtwoord)
                # Hier het versturen van de e-mail
                server.sendmail(van_email, aan_email, mailtekst)
                print('aan: ',aan_email)
        if(beveiliging=='STARTTLS'):
            try:
                context = ssl.create_default_context()
                server = smtplib.SMTP(mailserver['Outlook'],poort['STARTTLS'])
                server.ehlo() # mag weggelaten worden
                # Beveilig de verbinding:
                server.starttls(context=context)
                server.ehlo() # mag weggelaten worden
                server.login(van_email, wachtwoord)
                # Hier het versturen van de e-mail
                server.sendmail(van_email, aan_email, mailtekst)
            except Exception as e:
                # Foutmeldingen naar stdout
                print(e)
            finally:
                server.quit()
        if(beveiliging=='TEST'):
            print('test mailserver',mailserver['Test'], poort['TEST'])
            server = smtplib.SMTP(mailserver['Test'], poort['TEST'])
            server.sendmail(van_email, aan_email, mailtekst)
            print('mail verzonden')

# Hier begint het
if __name__ == '__main__':
    maakmailing()
    print('klaar!')

 

Verwante artikelen