Send e-mails ved hjælp af Python

Som en læringsøvelse gravede jeg for nylig ind i Python 3 for at se, hvordan jeg kunne affyre en masse e-mails. Der kan være mere ligefremme metoder til at gøre dette i et produktionsmiljø, men det følgende fungerede godt for mig.

Så her er et scenarie: Du har navne og e-mail-adresser på en masse kontakter. Og du vil sende en besked til hver af disse kontakter, mens du tilføjer et "Kære [navn]" øverst i meddelelsen.

For enkelheds skyld kan du gemme kontaktoplysningerne i en fil i stedet for i en database. Du kan også gemme skabelonen til den besked, du vil sende, i en fil.

Smtplib-modulet i Python er stort set alt hvad du behøver for at sende enkle e-mails uden nogen emnelinje eller sådan yderligere information. Men for rigtige e-mails har du brug for en emnelinje og masser af information - måske endda billeder og vedhæftede filer.

Det er her, Pythons e-mail-pakke kommer ind. Husk, at det ikke er muligt at sende en e-mail-besked ved hjælp af emailpakken alene. Du har brug for en kombination af begge emailog smtplib.

Sørg for at tjekke den omfattende officielle dokumentation for begge disse.

Her er fire grundlæggende trin til afsendelse af e-mails ved hjælp af Python:

  1. Opret SMTP-serveren, og log ind på din konto.
  2. Opret MIMEMultipartobjekt besked og indlæse den med passende overskrifter for From, Toog Subjectmarker.
  3. Tilføj din beskedtekst.
  4. Send beskeden ved hjælp af SMTP-serverobjektet.

Lad mig nu gå igennem hele processen.

Lad os sige, at du har en kontaktfil mycontacts.txtsom følger:

[email protected] ~ $ cat mycontacts.txt john [email protected] katie [email protected]

Hver linje repræsenterer en enkelt kontakt. Vi har navnet efterfulgt af e-mail-adressen. Jeg gemmer alt i små bogstaver. Jeg overlader det til programmeringslogikken at konvertere eventuelle felter til store og små bogstaver, hvis det er nødvendigt. Alt dette er ret let i Python.

Dernæst har vi beskedskabelonfilen message.txt.

[email protected] ~ $ cat message.txt Dear ${PERSON_NAME}, This is a test message. Have a great weekend! Yours Truly

Læg mærke til ordet “ ${PERSON_NAME}”? Det er en skabelonstreng i Python. Skabelonstrenge kan let erstattes med andre strenge; i dette eksempel ${PERSON_NAME}erstattes det med personens faktiske navn, som du snart vil se.

Lad os nu starte med Python-koden. Først skal vi læse kontakterne fra mycontacts.txtfilen. Vi kan lige så godt generalisere denne bit til sin egen funktion.

Funktionen get_contacts()tager et filnavn som argument. Det åbner filen, læser hver linje (dvs. hver kontakt), deler den i navn og e-mail og tilføjer dem derefter i to separate lister. Endelig returneres de to lister fra funktionen.

Vi har også brug for en funktion til at læse i en skabelonfil (som message.txt) og returnere et Templateobjekt lavet ud fra dets indhold.

Ligesom den tidligere funktion tager denne et filnavn som argument.

For at sende e-mailen skal du bruge SMTP (Simple Mail Transfer Protocol). Som tidligere nævnt leverer Python biblioteker til at håndtere denne opgave.

I ovenstående kodestykke importerer du smtplibog opretter derefter en SMTP-forekomst, der indkapsler en SMTP-forbindelse. Det tager som værtsadresse og et portnummer, som begge afhænger helt af SMPT-indstillingerne for din særlige e-mail-tjenesteudbyder. For eksempel i tilfælde af Outlook ville linje 4 ovenfor være i stedet:

s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587)

Du skal bruge værtsadressen og portnummeret på din særlige e-mail-tjenesteudbyder for at det hele fungerer.

MY_ADDRESSog PASSWORDderover er to variabler, der indeholder den fulde e-mail-adresse og adgangskode til den konto, du skal bruge.

Nu ville det være et godt tidspunkt at hente kontaktoplysningerne og beskedskabelonerne ved hjælp af de funktioner, vi definerede ovenfor.

names, emails = get_contacts('mycontacts.txt') # read contacts message_template = read_template('message.txt')

Lad os nu sende hver mail for hver af disse kontakter separat.

For hver nameog email(fra kontakter fil), du opretter en MIMEMultipart objekt, opsætning af From, To, Subjectindhold-type overskrifter som et søgeord ordbog, og derefter fastgøre brødteksten til MIMEMultipartobjektet som almindelig tekst. Du kan måske læse dokumentationen for at finde ud af mere om andre MIME-typer, du kan eksperimentere med.

Bemærk også, at på linje 10 ovenfor erstatter jeg ${PERSON_NAME}med det faktiske navn, der er ekstraheret fra kontaktfilen ved hjælp af skabelonmekanismen i Python.

I dette særlige eksempel sletter jeg MIMEMultipartobjektet og genskaber det hver gang du gentager det gennem løkken.

Når det er gjort, kan du sende meddelelsen ved hjælp af den praktiske send_message () -funktion på det SMTP-objekt, du oprettede tidligere.

Her er den fulde kode:

Værsgo! Jeg tror, ​​at koden nu er ret klar.

Du er velkommen til at kopiere og tilpasse det efter behov.

Bortset fra de officielle Python-dokumenter vil jeg også nævne denne ressource, som hjalp mig meget.

Glad kodning :)

Jeg offentliggjorde oprindeligt denne artikel her. Hvis du kunne lide denne artikel, skal du ramme det lille hjerte nedenfor. Tak!