Sende e -post med Python

Sende e -post med Python
Å sende, sjekke og svare på e -post er en tidkrevende oppgave, spesielt når du gjør det for et stort antall mennesker eller kunder der du bare må endre mottakerens navn, adresse, alder og andre små ting. Det ville være en veldig vanskelig oppgave for deg å skrive et program som kan håndtere alle typer personlige/forretningsmessige e -postmeldinger, men likevel kan du automatisere mange ting i denne forbindelse som til slutt vil spare deg for mye tid.

For eksempel vil du sende en påminnelse til kundene dine om de gjenværende regningene, og du har alle kunderelaterte data som telefonnumrene deres, adresse, alder osv. I et Excel -ark eller en database, i stedet for å gjøre det manuelt, kan du skrive en Enkelt program i Python for automatisk å gjøre det for deg. I denne opplæringen lærer vi hvordan e -postprotokoll fungerer og hvordan du kan automatisere prosessen for å spare din dyrebare tid.

Et ord om SMTP

Simple Mail Transfer Protocol (SMTP) er datastyrt ekvivalent med posttjenesten din. Det er en protokoll som fungerer på applikasjonslag i et TCP/IP -nettverk. Det er en standardprotokoll for å sende og motta e -post over internett. Postoverføringsprosess består av e -postservere og klienter som sender og mottar e -post til hverandre.

For eksempel har du en Gmail -konto, og du vil sende en e -post til vennen din på Yahoo -kontoen hans. Du skriver en e -post og treffer Send, men backend -prosessen er litt komplisert, og for å forstå denne prosessen, må du forstå SMTP først. SMTP -e -postklienten din sender først Helo (eller Ehlo) til Gmail -serveren, kan du si at denne kommandoen eller overskriften tilsvarer Vert Header i HTTP -protokollen og brukes til å identifisere serveren ved hjelp av domenenavn. Etter Helo eller Ehlo, autentiserer klienten seg til serveren med det gitte brukernavnet og passordet ved hjelp av Auth kommando. Deretter spesifiserer den avsenderens og mottakerens e -postadresse og deretter meldingsorganet og sender e -post til Gmail -serveren. Gmail Server vil først bekrefte at om mottakerens e -postadresse på Yahoo eksisterer eller ikke, så vil den sende e -posten til Yahoo -serveren der mottakeren kan hente e -postene sine fra.

Smtplib

SMTPLIB er et Python -bibliotek som kan brukes som SMTP -klient akkurat som Gmail, Yahoo, Thunderbird eller hvilken som helst annen e -postklient og kan brukes til å sende e -post. Vi kan utføre alle oppgaver ved hjelp av SMTPLIB -klient som vi kan gjøre med de som har grafisk brukergrensesnitt.

Det kommer som standard i Python, hvis du ikke har det, kan du installere ved hjelp av følgende kommando.

ubuntu@ubuntu: ~ $ pip installer smtplib

Eller i Python3

ubuntu@ubuntu: ~ $ pip installer smtplib

Skrive din første e -post med Python

I denne opplæringen vil jeg bruke en Gmail -konto som avsender, også jeg vil bruke Python -konsollen, så det vil være lettere for meg å forklare hver kodeinje trinn for trinn. For å komme i gang, må vi gi vår Gmail -tilgang til mindre sikre apper.

Så logg inn på Gmail -kontoen din og gå til kontoinnstillinger.

Forsikre deg nå om at tilgang for mindre sikre apper er slått på.

Nå åpner Python -konsollen din og begynn å skrive din første e -post ved hjelp av Python

ubuntu@ubuntu: ~ $ python
Python 2.7.16 (standard, 7. oktober 2019, 17:36:04)
[GCC 8.3.0] på linux2

Skriv inn "hjelp", "copyright", "studiepoeng" eller "lisens" for mer informasjon.

// Importer SMTP -biblioteket
>>> Importer smtplib
// koble til Gmail -serveren med domenenavn og portnummer (denne innstillingen er forskjellig for
Hver e -postleverandør, ta en titt på tabellen gitt nedenfor)
>>> mailobj = smtplib.SMTP ('SMTP.Gmail.com ', 587)
// si hei til serveren
>>> mailobj.ehlo ()
(250, 'SMTP.Gmail.com til din tjeneste, [103.255.4.246] \ nsize35882577 \ n8bitmime \ nstarttls \
NenhancedStatusCodes \ npipelining \ nchunking \ nsmtputf8 ')
// Port 587 betyr at vi bruker kryptert TLS -tilkobling, så begynn krypterte TLS
Kommunikasjon ved hjelp av starttls (), slik at legitimasjonene og meldingene våre ikke blir sniffet
>>> mailobj.starttls ()
(220, '2.0.0 klar til å starte tls ')
// Logg inn på Gmail -kontoen din ved hjelp av e -post og passord
>>> mailobj.Logg inn ('[email protected] ',' s3cr3t_p4sssw0rd ')
(235, '2.7.0 akseptert ')
// Spesifiser avsender og mottakers e -postadresse og e -postinnhold
>>> mailobj.sendmail ('[email protected] ',' [email protected] ',' Emne:
Hei Verden! \ n Hello World! Dette er min første Hello World -e -post i Python ')

// Lukk tilkoblingen til Gmail -serveren
>>> mailobj.slutte()
(221, '2.0.0 lukkende tilkobling B6SM4519863LFI.72 - GSMTP ')

I eksemplet ovenfor, erstatt det gitte innholdet med ditt eget. Hvis du ikke er en Gmail -bruker, kan du bruke e -postserveren til leverandøren din. Her er listen over domenenavn og porter til noen vanlige postleverandører.

Navn Serverdomenenavn Havn
Gmail SMTP.Gmail.com 587
Outlook / Hotmail SMTP-post.Outlook.com 587
Yahoo Mail SMTP.post.Yahoo.com 587
Verizon SMTP.Verizon.nett 465
Comcast SMTP.comcast.nett 587

Noen ord om IMAP

Så vi bare studerte at SMTP brukes til å sende e -post, men det som er IMAP (Internet Access Messaging Protocol) for? SMTP kan ikke brukes til å søke og få e -post fra serveren, IMAP- eller POP3 -protokollen brukes til det formålet.

ImapClient, Imaplib og Pyzmail

Det er to store biblioteker i Python som kan brukes som IMAP -klient for å finne, hente og slette e -post fra e -postserveren. Python har standard Imaplib bibliotek, men et annet eksternt bibliotek ImapClient er mer effektiv og enkel å bruke. I denne opplæringen bruker vi ImapClient For å hente e -post fra Mail Server.

Problemet med ImapClient er at den henter e -post fra e -postserver i rått format. Så vi trenger Pyzmail Bibliotek som analyser for brukervennlig output. For å installere begge bibliotekene, skriv inn

ubuntu@ubuntu: ~ $ sudo pip installer iMapClient
ubuntu@ubuntu: ~ $ sudo pip install pyzmail

Få e -postene dine fra Mail Server

Nå lærer vi hvordan du søker og laster ned e -post fra e -postserveren ved hjelp av IMAPClient. Vi bruker ImapClient til å søke og laste ned e -post fra serveren, så bruker vi Pyzmail for å analysere dette råinnholdet. La oss

// Importer ImapClient Library
>>> Importer imapclient
// Koble til Gmails IMAP -server
>>> obj = imapclient.IMAPClient ('IMAP.Gmail.com ', ssl = true)
// Logg inn på e -postkontoen din ved å bruke legitimasjonen din
>>> obj.Logg inn ('[email protected] ',' s3cr4tp4ss ')
'[email protected] autentisert (suksess) '
// Velg meldingsmappe for å lese i.e innboks, utkast, sendte e -post
>>> obj.SELECT_FOLDER ('innboks', readonly = true)
'Eksister': 830, 'PermanentFlags': (), 'HighestModseq': 112999, 'Uidnext': 931,
'Flagg': ('\\ svarte', '\\ flagget', '\\ utkast', '\\ sletted', '\\ sett',
'$ Notphishing', '$ phishing'), 'uidvaliditet': 1, 'skrivebeskyttet': ["], 'nylig': 0
// Søk på meldingene dine i innboksen din, eller bruk et filter, under filteret vises
Du mottatt e-postene etter 25. oktober 2019
>>> mail_ids = obj.søk (['siden', '25 -okt-2019 '])
>>> mail_ids
[919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930]
// Listen “Mail_ids” inneholder en liste over mottatt e-post-ID-er siden 25-okt-2019,
Du kan laste ned en e -post ved hjelp av ImapClient Fetch -funksjonen.
>>> raw_mail = obj.Fetch ([919], ['Body []', 'Flags'])
// Nå er innholdet i Raw_mail -variabelen i rått format, det kan ikke vises på
Skjerm direkte, så vi trenger en analyser for å analysere dette innholdet for en brukervennlig utdata
>>> Importer Pyzmail
>>> melding = pyzmail.PyzMessage.Fabrikk (Raw_mail [919] ['Body []'])
// Nå er e -post analysert og lagret i meldingsvariabel, for å få emnet for
e -posten, bruk get_subject -funksjonen
>>> melding.get_subject ()
U'Dress Up dine ferdigheter denne Halloween med 25% avslag '
// Tilsvarende kan du se avsenderdetaljer
>>> melding.get_addresses ('fra')
[(U'USAMA Azad ',' [email protected] ')]
>>> melding.get_addresses ('til')
[(U'[email protected] ',' [email protected] ')]
// for å få kroppen til e -posten, skriv inn
>>> melding.tekst_part.get_payload ().avkode (melding.tekst_part.Charset)
u ”Hei! Nyt flat 25% på premiumkursene våre ”

Hvis du har en konto i en annen annen e -posttjenesteleverandør enn Gmail, kan du logge inn på IMAP -serveren. Her er IMAP -domenenavnslisten over noen kjente postleverandører.

Forsørger Domenenavn for IMAP -server
Yahoo IMAP.post.Yahoo.com
Hotmail/Outlook IMAP-post.Outlook.com
Verizon Innkommende.Verizon.nett
Comcast IMAP.comcast.nett
AT&T IMAP.post.ATT.nett

Slette e -posten din fra IMAP -serveren

I likhet med å søke og hente e -post fra serveren, kan du også slette e -postmeldinger fra e -postserveren din ved å bruke UID. Bare følg de gitte trinnene

// For å slette en e -post, må du bare lese om "falsk" for å få skriv tilgang til din
E -post
>>> obj.SELECT_FOLDER ('innboks', readonly = falsk)
>>> mail_ids = obj.søk (['siden', '25 -okt-2019 '])
>>> mail_ids
[919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930]
// Gi en e -post uid eller en liste over e -post -uids, etter å ha kjørt nedenfor kommandoen,
E -posten din vil bli forsvunnet fra innboksen.
>>> obj.delete_messages (919)
919: ('\\ sett', '\\ slettet')
// Denne kommandoen vil slette e -postene dine permanent fra e -postserveren
>>> obj.fjerne()
('Suksess', [])

https: // techtopz.com/build-a-Birthday-Reminder-Application-in-Python-on-Mac/

Å gjøre opp din egen bursdags påminnelse

Du har bursdager med vennene dine de kommende månedene, og du vil ønske dem på bursdagene deres. Men du har mye arbeid på kontoret ditt, og det er en mulighet for at du vil glemme å ønske dem. Så denne oppgaven kan automatisk utføres ved hjelp av Python. Følgende er koden for å utføre denne oppgaven.

// Importere moduler
Import re
// OS -modul brukes til å utføre operativsystemoppgaver i.e tilgang til direcotories
Importer OS
Importer DateTime
Importer SMTPLIB
// Definere en funksjon som sender e -post
def send_mail (reciever_mail_address, navn):
sender_mail_address = "[email protected] "
Passwd = "SenderPasswd"
// Koble til Gmail Server med domenenavn og portnummer
obj = smtplib.SMTP ('SMTP.Gmail.com ', 587)
obj.ehlo ()
obj.starttls ()
// Logg på Gmail -kontoen din
obj.Innlogging (avsender_mail_address, passwd)
// Sende post til 'Reciever_mail_address'.
obj.Sendmail (Sender_Mail_Address, Reciever_mail_address, "Emne: Bursdagsønsking Mail \ n \ n HappyBirthday"+Navn)
// sluttforbindelse
obj.slutte()
// Hoveddelen
// går til katalogen der filen som inneholder data er til stede
OS.chdir ("path_to_birthday_data_file")
mens 1:
// Få dato og klokkeslett for nåværende øyeblikk
I dag = DateTime.dato tid.i dag()
I dag = STR (i dag)
// Få inneværende år, måned, dag, time, minutt og andre
Current_year = i dag [0: 4]
current_month = i dag [5: 7]
Current_day = Today [8:10]
Current_hour = i dag [11:13]
current_minute = i dag [14:16]
Current_sec = i dag [17:19]
// Åpne bursdagsfil i 'Birthday_File' -objekt i lesemodus
bursdag_file = åpen ('bursdag_file', 'r')
// Lagre alle linjene til 'Birthday_File' i linjer -listen
linjer = bursdag_file.ReadLines ()
// lukke 'bursdag_file' objekt
bursdag_file.Lukk()
// lese hver linje som bruker for loop
for linje i linjer:
// Å lage et vanlig uttrykk for å finne en dato i 'Birthday_File'
datex = re.kompilere (r "\ d 4-\ d 2-\ d 2")
FindDate = DateEx.Søk (linje)
Dato = FindDate.gruppe()
// Få bursdag_month og bursdag_dag fra filen
bursdag_måned = dato [5: 7]
bursdag_dag = dato [8:10]
// Å lage et vanlig uttrykk for å finne postadresse fra bursdag_fil
MailEx = re.kompilere (r "\ w*@\ w*.com ")
FindMail = MailEx.Søk (linje)
Reciever_mail = FindMail.gruppe()
// å lage et vanlig uttrykk for å finne navnet på personen
nameex = re.kompilere (r "\ w*")
FindName = NameEx.Søk (linje)
Navn = FindName.gruppe()
// sjekke om noens bursdag kommer eller ikke
Hvis Current_month == Birthday_Month og = Current_Day == Birthday_Day:
// Send e -post til eksakt 08:00
Hvis Current_hour == '08' og Current_minute == '00' og Current_sec == '00':
// RING 'SEND_MAIL' FUNKSJON
send_mail (reciever_mail, navn)

Nå lager vi en 'bursdag_file', der vi lagrer navn, e -postadresser og deres fødselsdato. Dette er en enkel tekstfil og ser slik ut.

Forklaring

Vi vil lese denne filen ved hjelp av Python -skriptet og sjekk hvis bursdag kommer og ønsker dem. Først av alt vil vi importere noen moduler. DateTime -modulen har funksjoner som gir oss gjeldende dato og tid og mange flere. Men vi vil bare bruke dette for å finne gjeldende dato og tid. SMTPLIB -modul brukes til å sende post og har blitt forklart ovenfor. RE -modulen har funksjoner som brukes til å finne vanlig uttrykk fra en streng.

I dette skriptet definerer vi 'send_mail' -funksjonen, som sender e -post til 'reciever_mail_address', hvis navn er 'navn'. Begge argumentene sendes til funksjonen fra hoveddelen av MSG. I hoveddelen av skriptet vil vi se hvordan vi finner 'reciever_mail_address' og 'name'.

Å sende e -post med SMTPLIB er blitt forklart ovenfor, slik at du kan lese den, og den vil ikke bli diskutert her.

I hovedorganet går vi til katalogen der vi har lagret 'Birthday_File' ved hjelp av 'OS.chdir () '. Så har vi en 'mens sløyfe' som alltid er sant, så den vil sjekke bursdagen kontinuerlig. Nå får vi gjeldende dato og tid og lagre den i 'Today' variabel. Det ser slik ut.

2019-11-01 16:19:07.144925

Vi vil trekke ut år, måned, dag, time, minutter og sekunder ved å bruke indekser i disse mengdene. Etter dette åpner vi bursdag_file i et objekt 'bursdag_fil' i lesemodus, slik at vi bare kan lese den. Nå lagrer vi alle linjene i denne fillisten. 'Bursdag_fil.ReadLines () 'vil lagre hver linje i' linjer '-liste. Etter dette vil vi lukke bursdag_fil ved å bruke 'bursdag_fil.Lukk () 'Funksjon.

Nå skal vi lese hver linje en etter en som bruker for loop. I hver linje er bare en persons data tilgjengelig i 'Birthday_File', så vi leser bare en persons data på en gang i denne loopen.

Etter dette vil vi hente ut fødselsdato, e -postadresse og navn på personen som bruker RE -modulen. Som vi har skrevet datoen i følgende format

Yyyy-mm-dd

Så vi vil lage et vanlig uttrykk 'datex' som finner dette formatet i linjen.

re.kompilere (r ”\ d 4-\ d 2-\ d 2”)

Over-kommandoen Finn en streng som har '4 sifre' etterfulgt av '-' deretter '2 sifre' etterfulgt av '-' og '2 sifre'. Dette vil gi oss datoen for fødselen til personen, så vi vil trekke ut fødselsdag og fødsels_måned fra dette uttrykket.

Tilsvarende finner vi e -postadresse ved hjelp av vanlige uttrykk. Etter dette vil vi sammenligne bursdag_måned. Hvis disse forholdene er fornøyde, sender vi bursdags -e -posten ved å bruke 'Send_mail' -funksjonen på Exact '08: 00 '.

Kjører skript automatisk via cronjob

Nå vil vi sørge for at dette Python -skriptet kjører hver gang. For å gjøre dette, vil vi legge denne oppgaven til crontab. Crontab, i Linux, brukes til å utføre oppgaver automatisk. Det vi må gjøre er bare å legge oppgaven til crontab. For å gjøre det, følg de gitte trinnene.

  1. Åpne crontab for å legge til oppgave i terminalen din ved å bruke følgende kommando
ubuntu@ubuntu: ~ $ crontab -e
  1. På slutten av denne filen skriv inn følgende kommando uten #
@reboot python path_to_the_script

Overkommandoer vil gjøre det mulig for systemet ditt å kjøre Python -skriptet hver gang du starter systemet ditt på nytt. På denne måten vil systemet ditt kjøre Python -skript hver gang systemet ditt er på.