Ĉapitro 16 - Sendante Email kaj Teksto Mesaĝoj
Subtenu la Aŭtoro: Aĉeti la libron sur Amazono aŭ
la libro / ebook pakaĵo rekte Neniu amelo Gazetaro .
Legi la aŭtora aliaj liberaj Python libroj:
Sendante Email kaj Teksto Mesaĝoj
Kontrolanta kaj respondi al retpoŝto estas grandega tempo profundiĝi.
Kompreneble, vi ne povas simple skribi programon por manipuli ĉiujn
viajn retpoŝto por vi, ĉar ĉiu mesaĝo postulas lia propra respondo.
Sed vi povas ankoraŭ aŭtomatigi multaj retpoŝto-rilataj taskoj kiam oni
scipovas skribi programojn kiuj povas sendi kaj ricevi retpoŝton.
Ekzemple, eble vi havas kalkultabelo plena de kliento rekordojn kaj
volas sendi ĉiu kliento malsama formo letero depende de sia aĝo kaj loko
detaloj. Komerca softvaro eble ne povos fari tion por vi;
feliĉe, vi povas skribi vian propran programon por sendi tiujn
retpoŝtojn, ŝparante vi multan tempon kopii kaj bati formo retpoŝtojn.
Vi povas ankaŭ skribi programojn por sendi retpoŝtojn kaj SMS tekstoj sciigi vin aferojn eĉ dum vi estas for de via komputilo.
Se vi aŭtomatigi tasko kiu prenas paron de horoj por fari, vi ne volas
iri reen al via komputilo ĉiu malmultaj minutoj por kontroli sur la
programo statuso.
Anstataŭe, la programo povas nur tekston vian telefonon kiam ĝi estas
farita-liberigante vin enfokusigi pli gravaj aferoj dum vi estas for de
via komputilo.
SMTP
Multe kiel HTTP estas la protokolo uzata de komputiloj por sendi retpaĝoj trans la Interreto, SMTP (SMTP) estas la protokolo uzata por sendi retpoŝton.
SMTP diktas kiom retmesaghoj devus esti formatita, ĉifrita, kaj
elsendita inter serviloj, kaj ĉiuj aliaj detaloj kiuj via komputilo
manipulas post klako Sendu. Vi ne bezonas scii tiujn teknikajn detalojn, kvankam, ĉar Python
smtplib
modulo simpligas ilin en kelkaj funkcioj.
SMTP nur traktas sendanta retpoŝtojn al aliaj. Malsama protokolo, nomita IMAP, traktas retrovi retpoŝtojn sendis al vi kaj estas priskribita en IMAP .
Sendante Email
Vi povas esti konata kun sendanta retpoŝtojn de Outlook aŭ Thunderbird aŭ tra retejo kiel Gmail aŭ Yahoo! Mail. Bedaŭrinde, Python ne proponas vin bela grafika uzantinterfaco kiel tiuj servoj. Anstataŭe, vi nomas funkcioj elfari ĉiu grava paŝo de SMTP, kiel montrita en la sekvanta interaga ŝelon ekzemplo.
noto
Ne eniri tiun ekzemplon en sencela; ĝi ne funkcios ĉar smtp.example.com , bob@example.com , MY_SECRET_PASSWORD kaj alice@example.com estas nur anstataŭiloj. Tiu kodo estas nur superrigardon de la procezo de sendi retpoŝton kun Python.
>>> Import smtplib >>> SmtpObj = smtplib.SMTP ( 'smtp.example.com', 587) >>> SmtpObj.ehlo () (250, b'mx.example.com je via servo, [216.172.148.131] \ nSIZE 35882577 \ n8BITMIME \ nSTARTTLS \ nENHANCEDSTATUSCODES \ nCHUNKING ') >>> SmtpObj.starttls () (220, b'2.0.0 Preta komenci TLS) >>> SmtpObj.login ('bob@example.com ',' MY_SECRET_PASSWORD ') (235, b'2.7.0 Accepted ') >>> SmtpObj.sendmail ('bob@example.com ',' alice@example.com ',' Afero: Do longaj. \ nDear Alice, tiel longe kaj dankon por ĉiuj fiŝoj. Sincere, Bob ') {} >>> SmtpObj.quit () (221, b'2.0.0 fermo rilato ko10sm23097611pbd.52 - gsmtp ')
En la sekvaj sekcioj, ni iros tra ĉiu paŝo, anstataŭante la
anstataŭiloj kun via informo konekti kaj ensaluti al SMTP-servilo, sendu
retmesaĝon kaj malkonekti de la servilo.
Konektante al SMTP-servilo
Se vi iam instalis Thunderbird, Outlook, aŭ alian programon por konekti
al via retpoŝta konto, vi povas esti konata kun agordi la SMTP servilo
kaj haveno. Tiuj difinoj estos malsama por ĉiu retpoŝto provizanto, sed reta serĉo <via provizanto> SMTP agordojn devus aperi la servilo kaj haveno uzi.
La domajna nomo por la SMTP servilo kutime estas la nomo de via retpoŝto provizanto domajnnomo, kun SMTP. Antaŭ ĝi. Ekzemple, Gmail SMTP servilo estas ĉe smtp.gmail.com. Tabelo 16-1 listas iuj komunaj retpoŝto provizantoj kaj iliaj SMTP-serviloj. (La haveno estas entjero valoro kaj preskaŭ ĉiam esti 587, kiu estas uzita de la komando ĉifrado normo, TLS.)
Tabelo 16-1. Email Providers kaj Ilia SMTP Serviloj
provizanto
|
SMTP servilo domajnnomo
|
---|---|
gmail
|
smtp.gmail.com
|
Outlook.com/Hotmail.com
|
smtp-mail.outlook.com
|
Yahoo-retpoŝto
|
smtp.mail.yahoo.com
|
AT & T
|
smpt.mail.att.net (haveno 465)
|
Comcast
|
smtp.comcast.net
|
verizon
|
smtp.verizon.net (haveno 465)
|
Unufoje vi havas la domajnan nomon kaj haveno informon por via retpoŝto provizanto, krei
SMTP
objekto nomante smptlib.SMTP()
, pasante la domajna nomo kiel linio argumento, kaj pasante la haveno kiel entjero argumento. La SMTP
objekto reprezentas ligon al SMTP poŝto servilo kaj havas metodojn por sendanta retpoŝtojn. Ekzemple, jena alvoko kreas SMTP
objekto por konekti al Gmail: >>> SmtpObj = smtplib.SMTP ( 'smtp.gmail.com', 587) >>> Tipo (smtpObj) <Klaso smtplib.SMTP '>
Enirante
type(smtpObj)
montras ke tie estas SMTP
objekto stokitaj en smtpObj
. Vi bezonos tiun SMTP
objekto por nomi la metodoj kiuj ensalutas vin en kaj sendi retpoŝtojn. Se la smptlib.SMTP()
alvoko ne sukcesis, via SMTP servilo eble ne subtenas TLS sur haveno 587. En tiu kazo, vi devas krei SMTP
objekton uzante smtplib.SMTP_SSL()
kaj haveno 465 anstataŭe. >>> SmtpObj = smtplib.SMTP_SSL ( 'smtp.gmail.com', 465)
noto
Se vi ne estas konektita al la Interreto, Pitono levos
socket.gaierror: [Errno 11004] getaddrinfo failed
aŭ simila escepto.
Por viaj programoj, la diferencoj inter TLS kaj SSL ne estas gravaj. Vi nur bezonas scii kiu ĉifrado normo vian SMTP servilo uzas tiel vi scias kiel konekti al ĝi. En ĉiuj interaga ŝelon ekzemploj kiuj sekvas, la
smtpObj
variablo enhavos la SMTP
objekto revenis por la smtplib.SMTP()
aŭ smtplib.SMTP_SSL()
funkcio. Sendante la SMTP "Saluton" Mesaĝo
Unufoje vi havas la
SMTP
objekto, voki lian strange nomita ehlo()
metodon por "diri saluton" al la SMTP retpoŝto servilo. Tiu saluto estas la unua paŝo en SMTP kaj estas grava por establi konekton al la servilo. Vi ne devas scii la specifaj detaloj de tiuj protokoloj. Ĝuste certi voki la ehlo()
metodo unua afero post akiranta la SMTP
objekto alie la posta metodo alvokoj rezultigos eraroj. La sekvanta estas ekzemplo de ehlo()
alvoko kaj lia reveno valoro: >>> SmtpObj.ehlo () (250, b'mx.google.com je via servo, [216.172.148.131] \ nSIZE 35882577 \ n8BITMIME \ nSTARTTLS \ nENHANCEDSTATUSCODES \ nCHUNKING ')
Se la unua elemento en la respondo opo estas la entjero
250
(la kodo por "sukceso" en SMTP), tiam la saluto sukcesis. Komencante TLS Ĉifrado
Se vi konektas al haveno 587 sur la SMTP servilo (te, vi uzas TLS ĉifrado), vi bezonos por alvoki
starttls()
metodo sekva. Ĉi postulata paŝo ebligas ĉifradon por via konekto. Se vi konektas al haveno 465 (uzante SSL), tiam ĉifrado jam instalita, Kaj vi devus salti ĉi tiun paŝon.
Jen ekzemplo de la
starttls()
metodo alvoko: >>> SmtpObj.starttls () (220, b'2.0.0 Preta komenci TLS)
starttls()
metas vian SMTP ligo en TLS modo. La 220
en la reveno valoro informas vin ke la servilo estas preta. Alirkontrolo al la SMTP servilo
Unufoje via ĉifrita konekto al la SMTP servilo instalita, vi povas
ensaluti per via salutnomo (kutime vian retadreson) kaj retpoŝta
pasvorton nomante la
login()
metodo. >>> SmtpObj.login ( 'my_email_address@gmail.com', 'MY_SECRET_PASSWORD') (235, b'2.7.0 Accepted ')
Pasas kordo de via retadreso kiel la unua argumento kaj ŝnuro de via pasvorton kiel la dua argumento. La
235
en la reveno valoro signifas autenticación sukcesis. Python levos al smtplib.SMTPAuthenticationError
escepto por malĝusta pasvortoj. Averto
Zorgi pri metanta pasvortojn en via fontkodo. Kiam ajn oni kopioj vian programon, ili havos aliron al via retpoŝta konto! Estas bona ideo nomi
input()
kaj havas la uzanton tipo en la pasvorto. Eble
estas ĝene devi eniri la pasvorton ĉiufoje vi kuras via programo, sed
tiu aliro malhelpos vin de lasanta vian pasvorton en neĉifritaj dosieron
en via komputilo kie hacker aŭ tekkomputilo ŝtelisto povus facile akiri
ĝin. Sendante Retpoŝto
Unufoje vi estas ensalutita al via retpoŝto provizanto SMTP servilo, vi povas nomi la
sendmail()
metodo por fakte sendas la retpoŝton. La sendmail()
metodo alvoko aspektas jene: >>> SmtpObj.sendmail ( 'my_email_address@gmail.com', 'recipient@example.com', 'Afero: Tiel longe. \ NDear Alice, tiel longe kaj dankon por ĉiuj fiŝoj. sincere, Bob ') {}
La
sendmail()
metodo postulas tri argumentojn. - Vian retadreson kiel linio (por la retpoŝto estas "el" adreso)
- La ricevonto retadreson kiel linio aŭ de kordoj por multnombraj adresatoj (por la "al" adreso)
- La retpoŝto korpo kiel linio
La komenco de la retpoŝto korpo ŝnuro devas komenci per
'Subject: \n'
por la temlinion de la retpoŝto. La '\n'
linion karaktero disigas la temlinion de la ĉefa korpo de la retpoŝto.
La reveno valoro de
sendmail()
estas vortaro. Estos unu klavo valoro paro en la vortaro por ĉiu ricevanto por kiu retpoŝta livero malsukcesis. Malplena vortaro signifas ĉiuj ricevantoj estis sukcese sendis la retleteron. Desconectar de la SMTP servilo
Nepre invitu
quit()
metodo kiam vi finis sendanta retpoŝtojn. Tio malkonekti via programo de la SMTP servilo. >>> SmtpObj.quit () (221, b'2.0.0 fermo rilato ko10sm23097611pbd.52 - gsmtp ')
La
221
en la reveno valoro signifas la kunsido finas.
Revizii ĉiujn paŝojn por konekti alirkontrolo al la servilo, sendante retpoŝton kaj desconexión, vidu Sendante Email .
IMAP
Kiel SMTP estas la protokolo por sendi retmesaĝon, Interreto Mesaĝo Access Protocol (IMAP) precizigas kiel komuniki kun retpoŝto provizanto servilon por elsxuti retpoŝtojn sendis al via retadreso. Python venas kun
imaplib
modulo, sed fakte la triaj imapclient
modulo estas facile uzi. Tiu ĉapitro provizas enkonduko al uzante IMAPClient; la plena dokumentado estas ĉe http://imapclient.readthedocs.org/ .
La
imapclient
modulo elŝutoj retpoŝtojn de IMAP-servilo per iom komplika formato. Plej verŝajne, ke vi deziras konverti ilin de tiu formato en simpla ŝnuro valoroj. La pyzmail
modulo faras la malfacilan laboron de sintaksa analizo tiuj retmesaghoj por vi. Vi povas trovi la kompletan dokumentaron por PyzMail ĉe http://www.magiksys.net/pyzmail/ .
Instali
imapclient
kaj pyzmail
de Terminal fenestro. Apendico A havas paŝojn sur kiel instali triaj moduloj. Retrovi kaj Forigo Retmesaĝoj kun IMAP
Trovante kaj rekuperi retpoŝton en Python estas multistep procezo kiu postulas ambaŭ la
imapclient
kaj pyzmail
triaj moduloj.
Nur por doni al vi superrigardon, jen kompleta ekzemplo de ensalutanta
al IMAP-servilo, serĉanta retpoŝtojn, serĉos ilin, kaj tiam ĉerpi la
teksto de la retpoŝto mesaĝojn de ili. >>> Import imapclient >>> ImapObj = imapclient.IMAPClient ( 'imap.gmail.com', SSL = Vera) >>> ImapObj.login ( 'my_email_address@gmail.com', 'MY_SECRET_PASSWORD') 'my_email_address@gmail.com Jane Doe aŭtentikigita (Sukceso) ' >>> ImapObj.select_folder ( 'inbox', readonly = Vera) >>> UIDs = imapObj.search ([ 'Ekde 05-jul-2014']) >>> UIDs [40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, 40040, 40041] >>> RawMessages = imapObj.fetch ([40041], [ 'BODY []', 'flagoj']) >>> Import pyzmail >>> Mesaĝo = pyzmail.PyzMessage.factory (rawMessages [40041] [ 'BODY []']) >>> Message.get_subject () Saluton! >>> Message.get_addresses ( 'el') [( 'Edward Snowden', 'esnowden@nsa.gov')] >>> Message.get_addresses ( 'al') [(Jane Doe "," jdoe@example.com ')] >>> Message.get_addresses ( 'cc') [] >>> Message.get_addresses ( 'BCC) [] >>> Message.text_part! = None veraj >>> Message.text_part.get_payload (). Malkodi (message.text_part.charset) 'Sekvu la monon. \ R \ n \ r \ n-Ed \ r \ n' >>> Message.html_part! = None veraj >>> Message.html_part.get_payload (). Malkodi (message.html_part.charset) '<Div dir = "LTR"> <div> Tiom longe, kaj dankon pro ĉiuj fiŝoj! <br> </ Div> - Al <br> </ div> \ r \ n ' >>> ImapObj.logout ()
Vi ne devas enmemorigi tiujn paŝojn. Post ni iras tra ĉiu paŝo en detalo, vi povas reveni al ĉi superrigardon refreŝigi vian memoron.
Konektante al IMAP-servilo
Kiel vi bezonas
SMTP
objekto konekti al SMTP servilo kaj sendi retpoŝton, vi bezonas IMAPClient
objekto konekti al IMAP-servilo kaj ricevi retpoŝton. Unue vi bezonos la domajna nomo de via retpoŝto provizanto IMAPan servilon. Tio estos malsama de la SMTP servilo domajnnomo. Tabelo 16-2 listigas la IMAP-serviloj por pluraj popularaj retpoŝto provizantoj.
Tabelo 16-2. Email Providers kaj Ilia IMAP Serviloj
provizanto
|
IMAPan servilon domajnnomo
|
---|---|
gmail
|
imap.gmail.com
|
Outlook.com/Hotmail.com
|
imap-mail.outlook.com
|
Yahoo-retpoŝto
|
imap.mail.yahoo.com
|
AT & T
|
imap.mail.att.net
|
Comcast
|
imap.comcast.net
|
verizon
|
incoming.verizon.net
|
Unufoje vi havas la domajna nomo de la IMAP-servilo, invitu
imapclient.IMAPClient()
funkcion por krei IMAPClient
objekto. Plej retpoŝto provizantoj postulas SSL ĉifrado, tiel pasas la ssl=True
ŝlosilvorto argumento. Eniri la sekva en la interaga ŝelo (uzante via provizanto domajno nomo): >>> Import imapclient >>> ImapObj = imapclient.IMAPClient ( 'imap.gmail.com', SSL = Vera)
En ĉiuj interaga ŝelon ekzemploj en la sekvaj sekcioj, la
imapObj
variablo enhavos la IMAPClient
objekto revenis de la imapclient.IMAPClient()
funkcio. En tiu kunteksto, kliento estas la objekto kiu konektas al la servilo. Alirkontrolo al la IMAP-servilo
Unufoje vi havas
IMAPClient
objekto, voki lian login()
metodon, pasante en la salutnomo (ĉi estas kutime via retadreso) kaj pasvorton kiel kordoj. >>> ImapObj.login ( 'my_email_address@gmail.com', 'MY_SECRET_PASSWORD') 'my_email_address@gmail.com Jane Doe aŭtentikigita (Sukceso) '
Averto
Memori, neniam skribos pasvorton rekte en vian kodon! Anstataŭe, desegni vian programon akcepti la pasvorton revenis de
input()
.
Se la IMAP-servilo malakceptas tiun uzantnomon / pasvorton kombinaĵo, Pitono levos al
imaplib.error
escepto. Gmail kontoj, vi eble bezonas uzi apliko-specifaj pasvorton; por pliaj detaloj, vidu Gmail Apliko-Specifaj Pasvortoj . Serĉanta Retpoŝto
Unufoje vi ensalutis, fakte retrovi retpoŝtan ke vi interesiĝas estas du-paŝa procezo. Unue, vi devas elekti dosierujon vi volas serĉi tra. Do vi devas nomi la
IMAPClient
objekto search()
metodon, pasante en ĉeno de IMAP sxlosilvortojn. Selekti Dosierujo
Preskaŭ ĉiu konto havas
INBOX
teko defaŭlte, sed vi povas ankaŭ ricevi liston de dosierujoj nomante la IMAPClient
objekto list_folders()
metodo. Ĉi resendas liston de opoj. Ĉiu opo enhavas informojn pri ununura dosierujo. Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj: >>> Import pprint >>> Pprint.pprint (imapObj.list_folders ()) [(( '\\ HasNoChildren',), '/', 'Skizoj'), (( '\\ HasNoChildren',), '/', 'kompletigo'), (( '\\ HasNoChildren',), '/', 'inbox'), (( '\\ HasNoChildren',), '/', 'Sendita'), --snip- (( '\\ HasNoChildren', '\\ flagged'), '/', '[Gmail] / Frakasita'), (( '\\ HasNoChildren', '\\ Trash'), '/', '[Gmail] / Trash')]
Jen kion via eligo povus aspekti se vi havas Gmail konto. (Gmail nomas lian dosierujoj etiketoj, sed ili funkcias sammaniere kiel dosierujoj.) La tri valoroj en ĉiu de la opoj-ekzemple,
(('\\HasNoChildren',), '/', 'INBOX')
-are kiel sekvas: - Al opo de la dosierujo de la flagoj. (Precize kion tiuj flagoj reprezentas estas preter la kadro de tiu libro, kaj vi povas sekure ignori ĉi kampo.)
- La delimitador uzata en la nomo ŝnuro disigi gepatro dosierujoj kaj subdosierujojn.
- La plena nomo de la dosierujo.
Elekti dosierujon por traserĉi, pasi la dosierujo nomon kiel linio en la
IMAPClient
objekto select_folder()
metodo. >>> ImapObj.select_folder ( 'inbox', readonly = Vera)
Vi povas ignori
select_folder()
's reveno valoro. Se la elektita dosierujo ne ekzistas, Pitono levos al imaplib.error
escepto.
La
readonly=True
ŝlosilvorto argumento malebligas vin hazarde fari ŝanĝojn aŭ forigoj al
iu el la retpoŝtoj en tiu dosierujo dum la posta metodo alvokoj. Se vi volas forviŝi retpoŝtojn, estas bona ideo por ĉiam fiksita readonly
al True
. Plenumante la Serĉo
Kun dosierujo elektita, vi povas nun serĉi retpoŝtojn kun la
IMAPClient
objekto search()
metodo. La argumento por search()
estas listo de kordoj, unu formatita por la IMAP serĉo klavoj. Tabelo 16-3 priskribas la diversajn serĉo klavoj.
Tabelo 16-3. IMAP Serĉu Ŝlosiloj
serĉo ŝlosilo
|
signifanta
|
---|---|
'ALL' |
Revenas ĉiujn mesaĝojn en la dosierujo. Vi kuros al
imaplib grandeco limoj se vi peti ĉiujn mesaĝojn en granda dosierujo. Vidu Grandeco Limoj . |
'BEFORE date' , 'ON date' , 'SINCE date' |
Tiuj tri serĉo klavoj revenas, respektive, mesaĝoj kiuj estis ricevitaj fare de la IMAP-servilo antaŭe, sur aŭ post la donita
date . La dato devas esti formatita kiel 05-Jul-2015 . Ankaŭ, dum 'SINCE 05-Jul-2015' kongruas mesaĝojn sur kaj post julio 5, 'BEFORE 05-Jul-2015' kongruas nur mesaĝojn antaŭ julio 5 sed ne sur julio 5 mem. |
'SUBJECT string' , 'BODY string' , 'TEXT string' |
Revenas mesaĝojn kie
string troviĝas en la temo, korpo, aŭ ĉu, respektive. Se string havas spacojn en gxi, tiam oni cxirkauxu per citiloj: 'TEXT "search with spaces"' . |
'FROM string' , 'TO string' , 'CC string' , 'BCC string' |
Revenas ĉiujn mesaĝojn kie
string troviĝas en la "el" emailaddress, "al" adresoj, "cc" (kopio) adresojn, aŭ "BCC" (blinda karbono kopio) adresojn, respektive. Se ekzistas multoblaj retadresoj en string , tiam apartigu ilin per spacoj kaj enfermas ilin ĉiuj kun citiloj: 'CC "firstcc@example.com secondcc@example.com"' . |
'SEEN' , 'UNSEEN' |
Revenas ĉiujn mesaĝojn kun kaj sen la \ Vidita flago, respektive. Retmesaĝon akiras la \ Vidita flago se Montrita kun
fetch()
metodo alvoko (priskribita poste) aŭ se ĝi estas klakis kiam vi estas
kontrolanta vian retpoŝton en retmesaĝon programo aŭ retumilo. Ĝi estas pli komuna por diri la retpoŝto estis "legi" anstataŭ "vidita" sed ili signifas la samon. |
'ANSWERED' , 'UNANSWERED' |
Revenas ĉiujn mesaĝojn kun kaj sen la \ Answered flago, respektive. Mesaĝo akiras la \ Answered flago kiam respondis al.
|
'DELETED' , 'UNDELETED' |
Revenas ĉiujn mesaĝojn kun kaj sen la \ Forigita flago, respektive. Retmesaghoj forigita kun la
delete_messages() metodo estas donitaj la \ Forigita flago sed ne konstante forigita ĝis la expunge() metodo nomata (vidu Forigo Retmesaĝoj ). Notu ke iuj retpoŝto provizantoj, kiel Gmail, aŭtomate expunge retpoŝtojn. |
'DRAFT' , 'UNDRAFT' |
Revenas ĉiujn mesaĝojn kun kaj sen la \ Skizo flago, respektive. Skizo mesaĝoj normale tenis en aparta
Drafts dosierujo prefere ol en la INBOX dosierujo. |
'FLAGGED' , 'UNFLAGGED' |
Revenas ĉiujn mesaĝojn kun kaj sen la \ markita flago, respektive. Tiu flago estas kutime uzata por marki retmesaghoj kiel "Grava" aŭ "Urĝa".
|
'LARGER N' , 'SMALLER N' |
Revenas ĉiujn mesaĝojn grandaj aŭ pli malgrandaj ol
N bajtoj, respektive. |
'NOT search-key' |
Redonas la mesaĝojn kiujn
search-key ne revenis. |
'OR search-key1 search-key2' |
Revenas la mesaĝoj kiuj kongruas ĉu la unua aŭ dua
search-key . |
Notu ke iuj IMAP serviloj povas havi iomete malsamaj implementaciones por kiel ili manipulas liajn flagojn kaj serĉo klavoj. Ĝi povas postuli iun experimentación en la interaga ŝelo vidi ĝuste kiel kondutas.
Vi povas pasi plurajn IMAP serĉo ŝlosilo kordoj en la lerta argumento por la
search()
metodo. La mesaĝoj revenis estas kiuj kongruas ĉiuj serĉante ŝlosilojn. Se vi volas kongruas ajna de la serĉo klavojn, uzu la OR
serĉu ŝlosilo. Por la NOT
kaj OR
serĉo ŝlosilojn, unu kaj du kompletaj serĉo klavoj sekvi la NOT
kaj OR
, respektive.
Jen kelkaj ekzemple
search()
metodo vokas kune kun iliaj signifoj: imapObj.search(['ALL'])
. Revenas ĉiu mesaĝo en la elektitan dosierujon.imapObj.search(['ON 05-Jul-2015'])
. Revenas ĉiu mesaĝo sendita sur julio 5, 2015.imapObj.search(['SINCE 01-Jan-2015', 'BEFORE 01-Feb-2015', 'UNSEEN'])
. Revenas ĉiu mesaĝo sendita en januaro 2015 ke estas nelegita. (Notu ke tio signifas sur kaj post januaro 1 kaj ĝis sed ne inkluzive februaro 1.)imapObj.search(['SINCE 01-Jan-2015', 'FROM alice@example.com'])
. Revenas ĉiun mesaĝon el alice@example.com sendita ekde la komenco de 2015.imapObj.search(['SINCE 01-Jan-2015', 'NOT FROM alice@example.com'])
. Revenas ĉiu mesaĝo sendita de ĉiuj krom alice@example.com ekde la komenco de 2015.imapObj.search(['OR FROM alice@example.com FROM bob@example.com'])
. Revenas ĉiu mesaĝo iam sendis el alice@example.com aŭ bob@example.com .imapObj.search(['FROM alice@example.com', 'FROM bob@example.com'])
. Trompi ekzemplo! Tiu serĉo neniam revenos tien mesaĝojn, ĉar mesaĝoj devas parigi ĉiuj sxlosilvortojn. Ekde tie povas esti nur unu "de" adreso, ĝi estas neebla por mesaĝo al esti de ambaŭ alice@example.com kaj bob@example.com .
La
search()
metodo ne revenas la retpoŝtoj mem sed prefere unika IDs (UIDs) por la retpoŝtoj, kiel entjero valoroj. Vi povas tiam pasas tiujn UIDs la fetch()
metodo por akiri la retpoŝto enhavo.
Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj:
>>> UIDs = imapObj.search ([ 'Ekde 05-jul-2015']) >>> UIDs [40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, 40040, 40041]
Tie, la lerta de mesaĝo IDs (por mesaĝoj ricevitaj julio 5 pluen) revenis de
search()
estas stokita en UIDs
. La listo de UIDs revenis sur via komputilo estos malsama de tiuj montritaj tie; ili estas unikaj al aparta retpoŝta konto. Kiam vi poste pasi UIDs al alia funkcio alvokoj, uzu la UID valorojn vi ricevis, ne tiuj presitaj en tiu libro ekzemplojn. grandeco Limoj
Se via serĉo alumetoj granda nombro da retmesaghoj, Pitono povas levi escepto kiu diras
imaplib.error: got more than 10000 bytes
. Kiam tio okazas, vi devos malkonekti kaj rekonekti al la IMAPan servilon kaj reprovu.
Tiu limo estas modloko por malhelpi vian Python programoj manĝi tro da memoro. Bedaŭrinde, la defaŭlta grandeco limo estas ofte tro malgranda. Vi povas difini la limon de 10.000 bitokoj al 10,000,000 bajtoj por kuri ĉi kodo
>>> Import imaplib >>> Imaplib._MAXLINE = 10000000
Ĉi devus malhelpi tiun erarmesaĝon iri supren denove. Vi eble volas fari tiuj du linioj parto de ĉiu IMAP programo vi skribas.
Ricevado de Retpoŝto kaj Marking Ĝi Kiel Legi
Unufoje vi havas liston de UIDs, vi povas nomi la
IMAPClient
objekto fetch()
metodo por akiri la reala retpoŝto enhavo.
La listo de UIDs estos
fetch()
unua argumento. La dua argumento devus esti la listo ['BODY[]']
, kiu rakontas fetch()
elŝuti la tuta korpo enhavo por la retpoŝtoj specifita en via UID listo.
Ni daŭrigos nian interaga ŝelon ekzemplo.
>>> RawMessages = imapObj.fetch (UIDs, [ 'BODY []']) >>> Import pprint >>> Pprint.pprint (rawMessages) {40040: { 'BODY []': 'Transdonitaj-To: my_email_address@gmail.com \ r \ n' 'Ricevitaj: per 10.76.71.167 kun SMTP id' --snip-- '\ R \ n' '------ = _ Part_6000970_707736290.1404819487066 - \ r \ n', 'Seq': 5430}}
Import
pprint
migru la reveno valoro de fetch()
, stokitaj en la variablo rawMessages
, al pprint.pprint()
por "belaj print" ĝin, kaj vi vidos ke ĉi tiu reveno valoro estas nestitaj vortaro de mesaĝoj kun UIDs kiel la ŝlosilojn. Ĉiu mesaĝo estas stokita kiel vortaro kun du ŝlosilojn: 'BODY[]'
kaj 'SEQ'
. La 'BODY[]'
klavomapojn por la fakta korpo de la retpoŝto. La 'SEQ'
ŝlosilo por vico nombro, kiu havas similan rolon al la UID. Vi povas sekure ignori ĝin.
Kiel vi povas vidi, la mesaĝo enhavo en la
'BODY[]'
klavo estas sufiĉe nekomprenebla. Ĝi estas en formato nomita RFC 822, kiu estas desegnita por IMAP serviloj legi. Sed vi ne bezonas kompreni la RFC 822 formato; poste en ĉi tiu ĉapitro, la pyzmail
modulo faros signifon por vi.
Kiam elektita dosierujo sercxi tra, vi nomis
select_folder()
kun la readonly=True
ŝlosilvorto argumento.
Farante ĉi malhelpos vin de hazarde viŝante retmesaĝon-sed ankaŭ
signifas ke retpoŝtoj ne get markita kiel legita se vi prenos ilin kun
la fetch()
metodo. Se vi volas retpoŝtoj estu markitaj kiel legi kiam vi prenos ilin, vi bezonos pasi readonly=False
al select_folder()
. Se la elektita leterujo jam en readonly moduso, vi povas reselect la nuna dosierujo kun alia alvoko al select_folder()
, tiu tempon kun la readonly=False
ŝlosilvorto argumento: >>> ImapObj.select_folder ( 'inbox', readonly = False)
Getting Retpoŝto Adresoj de Kruda mesaĝo
La kruda mesaĝojn revenis de la
fetch()
metodo ankoraŭ ne estas tre utilaj al homoj kiuj volas nur legi sian retpoŝton. La pyzmail
modulo parses tiuj krudaj mesaĝojn kaj redonas ilin PyzMessage
objektoj, kiuj faras la temon, korpo, "Al" kampo "De" kampo, kaj aliaj
sekcioj de la retpoŝto facile atingebla al via Python kodo.
Daŭrigi la interaga ŝelo ekzemple kun la jena (uzante UIDs el via retpoŝta konto, ne tiuj montritaj tie):
>>> Import pyzmail >>> Mesaĝo = pyzmail.PyzMessage.factory (rawMessages [40041] [ 'BODY []'])
Unua, importado
pyzmail
. Do krei PyzMessage
objekto de retpoŝto, invitu pyzmail.PyzMessage.factory()
funkcio kaj pasi ĝin la 'BODY[]'
sekcio de la kruda mesaĝo. Stoki la rezulton en message
. Nun message
enhavas oni PyzMessage
objekto, kiu havas plurajn metodojn kiuj faras ĝin facila por ricevi la
poŝto la temo linio, same kiel ĉiujn sendinto kaj ricevanto adresoj. La get_subject()
metodo revenas la temo kiel simpla ĉeno valoro. La get_addresses()
metodo revenas listo de adresoj por la kampo vi pasas ĝin. Ekzemple, la metodo alvokoj povus aspekti kiel ĉi: >>> Message.get_subject () Saluton! >>> Message.get_addresses ( 'el') [( 'Edward Snowden', 'esnowden@nsa.gov')] >>> Message.get_addresses ( 'al') [(Jane Doe "," my_email_address@gmail.com ')] >>> Message.get_addresses ( 'cc') [] >>> Message.get_addresses ( 'BCC) []
Rimarku ke la argumento por
get_addresses()
estas 'from'
, 'to'
, 'cc'
, aŭ 'bcc'
. La reveno valoro de get_addresses()
estas listo de opoj. Ĉiu opo enhavas du fadenojn: La unua estas la nomo asociita kun la retadreson, kaj la dua estas la retadreso mem. Se ekzistas neniuj adresoj en la petita kampo get_addresses()
redonas malplenan liston. Tie, la 'cc'
karbono kopio kaj 'bcc'
blinda kopio kampoj ambaŭ enhavis neniun adresoj mi revenis malplena listoj. Ricevi la Korpo de Kruda mesaĝo
Retpoŝtoj povas esti sendita kiel teksto, HTML, aŭ ambaŭ.
Kompleta teksto retpoŝtojn enhavas nur teksto, dum HTML retpoŝtoj povas
havi kolorojn, tiparojn, bildojn, kaj aliajn funkciojn kiuj la retpoŝta
mesaĝo aspektas kiel malgranda retpaĝo. Se retmesaĝon estas nur teksto, ĝia
PyzMessage
objekto havos lian html_part
atributoj metita None
. Simile, se retmesaĝon estas nur HTML, lia PyzMessage
objekto havos lian text_part
atributon al None
.
Alie, la
text_part
aŭ html_part
valoro havos get_payload()
metodo kiu redonas la retpoŝto korpo kiel valoro de la bajtoj datumtipo. (La bajtoj datumtipo estas preter la kadro de tiu ĉi libro.) Sed tio ankoraŭ ne estas signoĉeno valoro kiun ni povas uzi. Uf! La lasta paŝo estas nomi la decode()
metodon sur la bitokoj valoro revenis por get_payload()
. La decode()
metodo prenas unu argumento: la mesaĝo karaktero kodoprezenton, stokitaj en la text_part.charset
aŭ html_part.charset
atributo. Tiun, fine, denove la ligilo de la retpoŝto korpo.
Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj:
❶ >>> message.text_part! = None veraj >>> Message.text_part.get_payload (). Malkodi (message.text_part.charset) ❷ 'Tiom longe, kaj dankon pro ĉiuj fiŝoj! \ R \ n \ r \ n-Al \ r \ n' ❸ >>> message.html_part! = None veraj ❹ >>> message.html_part.get_payload (). Malkodi (message.html_part.charset) '<Div dir = "LTR"> <div> Tiom longe, kaj dankon pro ĉiuj fiŝoj! <br> </ Div> -Al <br> </ div> \ r \ n '
La retpoŝta ni laboras kun ĝi ambaŭ teksto kaj HTML enhavo, do la
PyzMessage
objekto stokitaj en message
havas text_part
kaj html_part
atributoj ne egalas None
❶ ❸. Nomante get_payload()
sur la mesaĝo de text_part
kaj tiam vokanta decode()
sur la bitokoj valoro redonas ĉenon de la teksto versio de la retpoŝta ❷. Uzante get_payload()
kaj decode()
kun la mesaĝo de html_part
redonas ĉenon de la HTML-versio de la retpoŝta ❹. viŝante Retmesaĝoj
Forviŝi retpoŝtojn, pasi Listo mesaĝon UIDs al la
IMAPClient
objekto delete_messages()
metodo. Tio markas la retpoŝtojn kun la \ Forigita flago. Nomante la expunge()
metodo forigos ĉiuj retpoŝtoj kun la \ Forigita flago en la elektitan dosierujon. Konsideri jena interaga ŝelon ekzemple: ❶ >>> imapObj.select_folder ( 'inbox', readonly = False) ❷ >>> UIDs = imapObj.search ([ 'SUR 09-jul-2015']) >>> UIDs [40066] >>> ImapObj.delete_messages (UIDs) ❸ {40066: ( '\\ Vidita', '\\ Deleted')} >>> ImapObj.expunge () ( 'Sukceso', [(5452, 'ekzistas')])
Tie ni elektu la enirkesto nomante
select_folder()
sur la IMAPClient
objekto kaj pasante 'INBOX'
kiel la unua argumento; ni ankaŭ pasas la ŝlosilvorto argumento readonly=False
por ke ni povas forviŝi retpoŝtojn ❶. Ni serĉu la inbox por mesaĝoj ricevitaj sur specifa dato kaj stoki la reiris mesaĝon IDs en UIDs
❷. Vokante delete_message()
kaj pasante ĝin UIDs
resendas vortaron; ĉiu klavo valoro paro estas mesaĝo ID kaj opo de la mesaĝo la flagoj, kiuj devus nun inkludas \ Forigita ❸. Nomante expunge()
tiam konstante forigas mesaĝojn kun la \ Forigita flago kaj resendas sukceso mesaĝon se ekzistis neniuj problemoj expunging la retpoŝtoj. Notu ke iuj retpoŝto provizantoj, kiel Gmail, aŭtomate expunge retpoŝtojn forigita kun delete_messages()
anstataŭ atendante expunge komando de la IMAP kliento.Desconectar de la IMAP-servilo
Kiam via programo finis retrovi aŭ forigi retpoŝtojn, simple nomas la IMAPClient la
logout()
metodo por malkonekti de la IMAP-servilo.>>> ImapObj.logout ()
Se via programo kuras por pluraj minutoj aŭ pli, la IMAP-servilo eble Penspaŭzo , aŭ aŭtomate malkonekti. En tiu kazo, la sekvanta telefono vokas vian programon faras la
IMAPClient
objekton levos escepto kiel la sekvaj:imaplib.abort: socket eraro: [WinError 10054] An ekzistanta rilato estis perforte fermita de la defora gastiganto
En tiu okazaĵo, via programo devos alvoki
imapclient.IMAPClient()
konekti denove.
Whew! Jen ĝi. Ekzistis
multajn aros salti tra, sed vi nun havas vojon akiri via Python
programoj ensaluti por retpoŝto rakontas kaj venigu retpoŝtojn. Vi povas ĉiam konsulti la superrigardon en Ekprenante kaj Forigo Retmesaĝoj kun IMAP whenever vi devas memori ĉiuj la paŝoj.
Projekto: Sendado Membro Dues Rememorigilo Retmesaĝoj
Diru vi estis "volontulis" spuri membro kotizojn por la Deviga volunteerism Klubo. Jen
vere enuiga laboro, engaĝante subteni kalkultabelo de ĉiuj, kiuj pagis
ĉiumonate kaj retpoŝtiganta recordatorios por tiuj kiuj ne havas. Anstataŭ
iri tra la kalkultabelo mem kaj kopio kaj alglui la sama mail al ĉiuj
kiu estas malantaŭ la kotizojn, let's-vi konjektis ĝin-skribi skripto
kiu faras tion por vi.
Je alta nivelo, jen kion via programo faros:
- Legi datumojn de Excel kalkultabelo.
- Trovu ĉiujn membrojn kiuj ne pagis kotizojn por la lasta monato.
- Trovi iliajn retadresojn kaj sendos ilin personecigita recordatorios.
Tio signifas via kodo devos fari la sekvan:
- Malfermi kaj legi la ĉeloj de Excel dokumenton kun la
openpyxl
modulo. (Vidu Ĉapitro 12 por labori kun Excel dosierojn.) - Krei vortaro de membroj kiuj estas malantaŭ iliajn kotizojn.
- Ensaluti al SMTP servilo nomante
smtplib.SMTP()
,ehlo()
,starttls()
, kajlogin()
. - Por ĉiuj membroj malantaŭ iliajn kotizojn sendu personecigita rememorigilo retpoŝto nomante la
sendmail()
metodo.
Malfermi novan dosieron redaktanto fenestro kaj savi ĝin kiel sendDuesReminders.py .
Paŝo 1: Malfermu la Excel Dosiero
Diru la Excel spreadsheet vi uzas por spuri membriĝo dues pagoj aspektas kiel Figuro 16-2 kaj estas en dosiero nomita duesRecords.xlsx . Vi povas elŝuti ĉi dosiero de http://nostarch.com/automatestuff/ .
Figuro 16-2. La kalkultabelo por spuri membro kotizojn pagoj
Tiu kalkultabelo havas ĉiu membro nomon kaj retadreson. Ĉiu monato havas kolumnon sekvado membroj 'pago statuses. La ĉelo por ĉiu membro estas markita kun la teksto pagis iam ili pagis sian kotizon.
La programo devos malfermi duesRecords.xlsx kaj eltrovi la kolumno por la lasta monato nomante la
get_highest_column()
metodo. (Vi povas konsulti Ĉapitro 12 por plua informo pri alirante ĉeloj en Excel kalkultabelo dosierojn kun la openpyxl
modulo.) Enmetu la sekvan kodon en la dosiero redaktoro fenestro:#! python3 # SendDuesReminders.py - Sendas retpoŝtojn surbaze pago statuson en kalkultabelo. importado openpyxl, smtplib, sys # Malfermu la kalkultabelo kaj akiri la lastan kotizon statuso. ❶ WB = openpyxl.load_workbook ( 'duesRecords.xlsx') ❷ folio = wb.get_sheet_by_name ( 'Sheet1') ❸ lastCol = sheet.get_highest_column () ❹ latestMonth = sheet.cell (vico = 1, kolumno = lastCol) .value # TODO: Check ĉiu membro pago statuso. # TODO: Saluto al retpoŝta konto. # TODO: Elirigu rememorigilo retmesaĝoj.
Post importi la
openpyxl
, smtplib
kaj sys
moduloj, ni malfermas nian duesRecords.xlsx dosiero kaj stoki la rezultanta Workbook
objekto en wb
❶. Tiam ni preni Folio 1 kaj stoki la rezultanta Worksheet
objekto en sheet
❷. Nun ke ni havas Worksheet
celon, oni povas aliri vicoj, kolumnoj kaj ĉeloj. Ni stokas la plej alta kolono en lastCol
❸ kaj ni tiam utiligas vico numeron 1 kaj lastCol
aliri la ĉelo kiu devus teni la plej lastatempa monato. Ni preni la valoron en tiu ĉelo kaj stoki ĝin en latestMonth
❹.Paŝo 2: Trovu Ĉiuj Sensalajraj Membroj
Kiam vi determinas la kolumno numero de la lasta monato (stokita en
lastCol
), vi povas buklo tra ĉiu vicoj post la unua vico (kiu havas la kolumnon titolaj) vidi kiuj membroj havas la tekston pagitaj en la ĉelo por ke monatan kotizon. Se la membro ne pagis, vi povas ekpreni la membro nomon kaj retadreson de kolumnoj 1 kaj 2, respektive. Tiu informo iros en la unpaidMembers
vortaro, kiu spuras ĉiuj membroj kiuj ne pagis la plej lastatempa monato. Aldonu la sekvan kodon por sendDuesReminder.py .#! python3 # SendDuesReminders.py - Sendas retpoŝtojn surbaze pago statuson en kalkultabelo. --snip-- # Kontroli ĉiu membro pago statuso. UnpaidMembers = {} ❶ por r en gamo (2, sheet.get_highest_row () + 1): ❷ pago = sheet.cell (vico = r, kolumno = lastCol) .value se pago! = ' pagitaj ': ❸ nomo = sheet.cell (vico = r, kolumno = 1) .value ❹ retpoŝto = sheet.cell (vico = r, kolumno = 2) .value ❺ unpaidMembers [nomo] = retpoŝto
Tiu kodo starigas malplena vortaro
unpaidMembers
kaj tiam cikloj tra ĉiuj vicoj post la unua ❶. Por ĉiu vico, la valoro en la plej freŝa kolumno estas stokita en payment
❷. Se payment
estas ne egala al 'paid'
, tiam la valoro de la unua kolumno estas stokita en name
❸, la valoro de la dua kolumno estas stokita en email
❹ kaj name
kaj email
estas aldonitaj al unpaidMembers
❺.Paŝo 3: Sendu personecigitaj Retpoŝto Rememoroj
Unufoje vi havas liston de ĉiuj sensalajraj membroj, estas tempo por sendi ilin email recordatorios. Aldonu la sekvan kodon al via programo, krom kun via vera retadreso kaj provizanto informo:
#! python3 # SendDuesReminders.py - Sendas retpoŝtojn surbaze pago statuson en kalkultabelo. --snip-- # Ensalutu por retpoŝta konto. SmtpObj = smtplib.SMTP ( 'smtp.gmail.com', 587) smtpObj.ehlo () smtpObj.starttls () smtpObj.login ( ' my_email_address@gmail.com ', sys.argv [1 ])
Krei
SMTP
objekton nomante smtplib.SMTP()
kaj pasante ĝin la domajnan nomon kaj haveno por via provizanto. Nomu ehlo()
kaj starttls()
, kaj tiam voki login()
kaj fordoni vian retadreson kaj sys.argv[1]
, kiu konservos vian pasvorton ŝnuro. Vi
eniras la pasvorton kiel komandlinia argumento ĉiu tempo vi kuras la
programon, por eviti savanta vian pasvorton en via fontkodo.
Unufoje via programo ensalutinta por via retpoŝta konto, ĝi devus iri tra la
unpaidMembers
vortaro kaj sendi personecigita retpoŝto al ĉiu membro la retadreson. Aldonu la sekvan al sendDuesReminders.py :#! python3 # SendDuesReminders.py - Sendas retpoŝtojn surbaze pago statuson en kalkultabelo. --snip-- # Elirigu rememorigilo retmesaĝoj. Por nomo, retpoŝto en unpaidMembers.items (): ❶ korpo = "Subjekto:% s kotizojn sensalajra. \ NDear% s, \ nRecords montras ke vi ne pagis kotizojn por% s. Bonvolu fari tiun pagon kiel eble plej baldaŭ. Dankon! "% (latestMonth, nomo, latestMonth) ❷ print ( 'Sendante retpoŝton al% s ...'% email) ❸ sendmailStatus = smtpObj.sendmail ( ' my_email_address@gmail.com ', retpoŝto , korpo) ❹ se sendmailStatus! = {}: Print ( 'Okazis problemo sendi retpoŝton al% s:% s'% (retpoŝto, sendmailStatus)) smtpObj.quit ()
Tiu kodo cikloj tra la nomoj kaj retpoŝtoj en
unpaidMembers
. Por ĉiu membro kiu ne pagis, ni personecigi mesaĝon kun la lasta monato kaj la membro nomon kaj stoki la mesaĝon en body
❶. Ni presi eligo dirante ke ni sendos retmesaĝon al tiu membro retadreson ❷. Tiam ni nomas sendmail()
, pasante ĝin la de adreso kaj la personecigita mesaĝon ❸. Ni stoki la reveno valoro en sendmailStatus
.
Memoru ke la
sendmail()
metodo revenos nemalplena vortaro valoro se la SMTP servilo raportis eraron sendado ke aparta retpoŝto. La lasta parto de la for
banto
ĉe ❹ ĉekojn se la reiris vortaro estas nemalplena, kaj se ĝi estas, ĝi
presas la ricevonto retadreson kaj la Revenis vortaro.
Post la programo estas farita sendanta ĉiujn retpoŝtojn, la
quit()
metodo estas nomita por malkonekti de la SMTP servilo.
Kiam vi kuros la programo, la eligo aspektos ion kiel jene:
Sendi retpoŝton al alice@example.com ... Sendi retpoŝton al bob@example.com ... Sendi retpoŝton al eve@example.com ...
La ricevantoj ricevos retmesaĝon kiu similas Figuro 16-3 .
Figuro 16-3. Aŭtomate sendita retpoŝton de sendDuesReminders.py
Sendante Teksto Mesaĝoj per Twilio
Plejpartoj
de homoj estas pli verŝajna al esti proksime de liaj telefonoj ol iliaj
komputiloj, do tekston mesaĝojn povas esti pli tuja kaj fidinda vojo
sendi sciigojn ol retpoŝto. Ankaŭ, la mallonga longo de teksto mesaĝojn faras ĝin pli verŝajne ke persono ricevos ĉirkaŭe por legi ilin.
En
tiu sekcio, vi lernos kiel subskribi supre por la libera Twilio servo
kaj uzi lia Python modulo por sendi mesaĝojn de teksto. Twilio estas SMS enirejo servo , kiu signifas ĝi estas servo kiu permesas al vi sendi mesaĝojn de teksto de viaj programoj. Kvankam vi estos limigita en kiel multaj tekstoj vi povas sendi por monato kaj la tekstoj estos prefiksita kun la vortoj Sendita de Twilio elprovo konton , tiu juĝo servo verŝajne adekvata por via persona programoj. La libera juĝo estas nedifinita; vi ne devos ĝisdatigi al pagita plano poste.
Twilio ne estas la sola SMS enirejo servo. Se vi preferas ne uzi Twilio, vi povas trovi alternativajn servoj de serĉado online por libera sms enirejo , python sms api , aŭ eĉ Twilio alternativoj .
Antaŭ subskribanta supre por Twilio konto, instali la
twilio
modulon. Apendico A havas pli detaloj pri instalado triaj moduloj.noto
Tiu sekcio estas specifa por Usono. Twilio faras proponon SMS texting servoj por landoj ekster Usono, sed tiuj specifaj ne estas kovritaj en tiu libro. La
twilio
modulo kaj liaj funkcioj tamen funkcios la saman ekster Usono. Vidu http://twilio.com/ por pli informo. Subskribanta supre por Twilio Konto
Iru http://twilio.com/ kaj plenigi la signo-supren formo. Kiam vi aliĝis al nova konto, vi devos kontroli poŝtelefono numeron kiun vi volas sendi tekstojn al. (Tiu konfirmo estas necesa por malebligi ke homoj uzanta la servon al spamo hazarda telefonnumerojn kun teksto mesaĝojn.)
Post
ricevi la tekston kun la konfirmo numeron, eniri ĝin en la Twilio
retejo por pruvi ke vi posedas la poŝtelefonon vi kontrolas. Vi nun povos sendi tekstojn al ĉi telefonnumero uzante la
twilio
modulon.
Twilio provizas vian juĝon konton per telefonnumero uzi kiel la sendinto de teksto mesaĝojn. Vi bezonos du pecojn de informo: via konto SID kaj la auth (identigan) ĵetono. Vi povas trovi tiun informon en la Dashboard paĝon kiam vi estas ensalutita al via Twilio konto. Tiuj valoroj agi kiel via Twilio uzantnomon kaj pasvorton kiam ensalutanta de Python programo.
Sendante Teksto Mesaĝoj
Unufoje vi instalis la
twilio
modulon,
registriĝis por Twilio konto, kontrolita via telefonnumero, registris
Twilio telefonnumero kaj akiris vian konton SID kaj auth ĝin, vi fine
esti preta por sendi al vi tekston mesaĝojn el via Python skriptoj.
Kompare kun ĉiuj registriĝo paŝoj, la fakta Python kodo estas sufiĉe simpla. Kun via komputilo konektita al la Interreto, eniri la sekva en la interaga ŝelo, anstataŭante la
accountSID
, authToken
, myTwilioNumber
, kaj myCellPhone
variablo valoroj kun via vera informo:❶ >>> de twilio.rest importado TwilioRestClient >>> accountSID = ' ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' >>> authToken = ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' ❷ >>> twilioCli = TwilioRestClient (accountSID, authToken) >>> myTwilioNumber = '+14955551234' >>> myCellPhone = '+14955558888' ❸ >>> mesaĝo = twilioCli.messages.create (korpo = 'ro. Watson - Venu - mi volas vidi vin.', from_ = myTwilioNumber, al = myCellPhone)
Kelkaj momentoj poste tajpi la lastan linion, vi devus ricevi mesaĝon de teksto kiuj legas Sendita de via Twilio elprovo konton - Mr. Watson - Venu - Mi volas vidi vin .
Pro la maniero la
twilio
modulo estas instalita, vi devas importi ĝin uzanta from twilio.rest import TwilioRestClient
, ne nur import twilio
❶. Stoki via konto SID en accountSID
via auth signo en authToken
kaj tiam voki TwilioRestClient()
kaj fordoni accountSID
kaj authToken
. La alvoko al TwilioRestClient()
revenoj de TwilioRestClient
objekto ❷. Tiu celo havas messages
atributon, kiu siavice havas create()
metodo vi povas uzi por sendi mesaĝojn de teksto. Tiu estas la metodo kiu gvidados Twilio servantoj sendi vian tekstmesaĝo. Post stokante via Twilio nombro kaj poŝtelefono nombro en myTwilioNumber
kaj myCellPhone
, respektive, voki create()
kaj fordoni ŝlosilvorto argumentoj preciziganta la korpo de la teksto mesaĝo, la sendinto de nombro ( myTwilioNumber
), kaj la ricevanto de nombro ( myCellPhone
) ❸.
La
Message
objekto revenis de la create()
telefono havos informon pri la tekstmesaĝo ke estis sendita. Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj:>>> message.to '+14955558888' >>> Message.from _ '+14955551234' >>> Message.body 'Mr. Watson - Venu - Mi volas vidi vin. '
La
to
, from_
kaj body
atributojn devus teni vian poŝtelefonon numeron, Twilio nombro, kaj mesaĝo, respektive. Notu ke la sendado telefonnumero estas la from_
atributo-kun substreko ĉe la fino ne from
. Tiu estas ĉar from
estas ŝlosilvorto en Python (vi vidis ĝin uzata en lafrom
modulename import *
formo de import
komunikaĵo, ekzemple), do ĝi ne povas esti uzata kiel atributo nomo. Daŭrigi la interaga ŝelo ekzemple kun la sekvaj:>>> message.status 'Vosto' >>> message.date_created datetime.datetime (2015, 7, 8, 1, 36, 18) >>> Message.date_sent == None veraj
La
status
atributo devus doni al vi ŝnuron. La date_created
kaj date_sent
atributoj devus doni vin datetime
objekto se la mesaĝo estis kreita kaj sendita. Eble ŝajnas strange ke la status
atributo estas metita 'queued'
kaj la date_sent
atributo estas metita None
kiam vi jam ricevis la tekstmesaĝo. Tiu estas ĉar vi kaptis la Message
celon en la message
variablo antaŭ la teksto estis reale sendis. Vi bezonos refetch la Message
objekton por vidi lian plej supre-ĝis-dato status
kaj date_sent
. Ĉiun Twilio mesaĝo havas unikan ŝnuro ID (SID) kiu povas esti uzita por preni la lastan ĝisdatigon de la Message
objekto. Daŭrigi la interaga ŝelo ekzemplo enmetante la sekvaj:>>> message.sid 'SM09520de7639ba3af137c6fcb7c5f4b51' ❶ >>> updatedMessage = twilioCli.messages.get (message.sid) >>> updatedMessage.status 'Transdonis' >>> UpdatedMessage.date_sent datetime.datetime (2015, 7, 8, 1, 36, 18)
Enirante
message.sid
al vi tiun mesaĝon longa SID. Pasante ĉi SID la Twilio kliento get()
metodo ❶, vi povas elsxuti nova Message
objekto kun la plej supre-ĝis-dato informo. En tiu nova Message
objekto, La status
kaj date_sent
atributoj estas korekta.
La
status
atributo estos fiksita al unu el la jenaj ŝnuro valoroj: 'queued'
, 'sending'
, 'sent'
, 'delivered'
, 'undelivered'
, aŭ 'failed'
. Tiuj statusoj estas mem-klariga, sed por pli precizaj detaloj, rigardu la rimedoj je http://nostarch.com/automatestuff/ .Projekto: "Ĝuste Teksto Min" Modulo
La persono vi plej ofte teksto de viaj programoj estas probable vi. Texting estas granda vojo por sendi mem sciigojn kiam vi estas for de via komputilo. Se
vi aŭtomatigitaj enuigan taskon kun programo kiu prenas paron de horoj
por kuri, vi povus havi ŝin sciigi vin kun teksto, kiam ĝi estos finita.
Aŭ vi povas havi regule planita programo kuranta ke
kelkfoje bezonas kontakti vin, kiel ekzemple vetero-kontrolanta programo
ke tekstoj vi rememorigilo paki ombrelon.
Kiel simpla ekzemplo, jen malgranda Python programo kun
textmyself()
funkcio kiu sendas mesaĝon pasis al ĝi kiel linio argumento. Malfermi
novan dosieron redaktanto fenestro kaj eniri la sekvan kodon,
anstataŭante la konto SID, auth ĵetono kaj telefonnumerojn kun via
propra informo. Konservi ĝin kiel textMyself.py .#! python3 # TextMyself.py - Difinas la textmyself () funkcio kiu tekstoj mesaĝon # Pasis al ĝi kiel linio. # Antaŭdifinitaj valoroj: accountSID = ' ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' authToken = ' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ' myNumber = '+15559998888' twilioNumber = '+15552225678' el twilio.rest importado TwilioRestClient ❶ def textmyself (mesaĝo): ❷ twilioCli = TwilioRestClient (accountSID, authToken) ❸ twilioCli.messages.create (korpo = mesaĝo, from_ = twilioNumber, al = myNumber)
Tiu programo stokas konton SID, auth ĵetono, sendante numeron, kaj ricevi numeron. Ĝi tiam difinis
textmyself()
al alpreni argumento ❶, fari TwilioRestClient
objekton ❷ alvokos create()
la mesaĝo vi pasis ❸.
Se vi volas fari la
textmyself()
funkcion havebla al viaj aliaj programoj, simple meti la textMyself.py dosiero en la sama dosierujo kiel la Python plenumebla ( C: \ Python34 sur Vindozo, /usr/local/lib/python3.4 sur OS X, kaj / usr / bin / python3 sur Linukso). Nun vi povas uzi la funkcion en viaj aliaj programoj. Kiam ajn vi volas unu el viaj programoj tekston vi, nur aldonu la sekvan:importado textmyself textmyself.textmyself ( 'La enuiga tasko estas finita.')
Vi devas subskribi por Twilio kaj skribi la texting kodo nur unufoje. Post tio, ĝi estas nur du linioj de kodo por sendi tekston el iu el viaj aliaj programoj.
resumo
Ni interkomuniki en Interreto kaj super poŝtelefono retoj en dekoj de malsamaj manieroj, sed retpoŝto kaj texting superregas. Viaj programoj povas komuniki tra tiuj kanaloj, kiuj donas al ili potencan novan sciigo karakterizaĵoj. Vi
povas eĉ skribi programojn kuranta sur malsamaj komputiloj kiuj
komunikas kun unu la alian rekte retpoŝte, per unu programo sendas
retpoŝtojn kun SMTP kaj la aliaj retrovi ilin per IMAP.
Python
smtplib
provizas funkciojn por uzi la SMTP por sendi retpoŝtojn tra via retpoŝto provizanto SMTP servilo. Same, la triaj imapclient
kaj pyzmail
moduloj lasu vin aliri IMAP serviloj kaj elsxuti retpoŝtoj senditaj al vi. Kvankam
IMAP estas iom pli implikitaj ol SMTP, ĝi estas ankaŭ sufiĉe potenca
kaj permesas vin serĉi apartan retpoŝtojn, elŝuti ilin, kaj analizi ilin
por ĉerpi la subjekto kaj korpo kiel ĉeno valoroj.
Texting estas iom malsama de retpoŝto, pro tio ke, kontraste kun retpoŝto, pli ol nur retkonekto necesas sendi SMS tekstoj. Feliĉe, servoj kiel Twilio provizas modulojn por permesi al vi sendi mesaĝojn de teksto de viaj programoj. Unufoje vi iras tra komenca agordo procezo, vi povos sendi tekstojn kun nur kelkaj linioj de kodo.
Kun
tiuj moduloj en via lerteco aro, vi povos plani la specifajn kondiĉojn
viaj programoj devus sendi sciigojn aŭ recordatorios. Nun viaj programoj havos atingo ege pretere la komputilo ili estas kurante sur!
praktiko Demandoj
Q:
|
1. Kio estas la protokolo por sendi retmesaĝon? Por kontrolanta kaj ricevi retpoŝton?
|
Q:
|
2. Kio kvar
smtplib funkcioj / metodoj devas vi nomas ensaluti al SMTP-servilo? |
Q:
|
3. Kio du
imapclient funkcioj / metodoj devas vi nomas ensaluti por IMAP-servilo? |
Q:
|
4. Kiajn argumento vi pasas al
imapObj.search() ? |
Q:
|
5. Kion fari se via kodo ricevas erarmesagxon, ke diras
got more than 10000 bytes ? |
Q:
|
6. La
imapclient modulo manipulas konektanta al IMAP-servilo kaj trovi retpoŝtojn. Kio estas modulo kiu ansoj legante la retpoŝtojn kiuj imapclient kolektas? |
Q:
|
7. Kio tri pecoj de informo vi bezonos el Twilio antaŭ vi povas sendi mesaĝojn de teksto?
|
praktiko Projektoj
Por praktiko, skribi programojn kiuj faras la sekvan.
Hazarda Chore Tasko Emailer
Skribi
programon kiu prenas liston de popola retadresoj kaj listo de taskoj
kiuj bezonas esti farita kaj hazarde asignas taskojn al homoj. Retpoŝti ĉiu persono ilia asignita taskoj. Se
vi sentas ambicia, teni rekordon de ĉiu persono antaŭe atribuita taskoj
tiel ke vi povas certigi la programo evitas atribui al iu ajn la sama
tasko ili lastfoje. Por alia ebla funkcio, plani la programon kuri unufoje semajne aŭtomate.
Jen sugesto: se sekvinberoj lerta al la
random.choice()
funkcio, ĝi revenos hazarde elektitan eron el la listo. Parto de via kodo povus aspekti jene:taskoj = [ 'pladoj', 'banĉambro', 'vakuo', 'piediro hundo'] randomChore = random.choice (taskoj) chores.remove (randomChore) # tiu tasko nun prenita, do forigu ĝin
ombrelo Rememorigilo
Ĉapitro 11 montris vin kiel uzi la
requests
modulon por skrapadi datumoj de http://weather.gov/ . Skribi programon kiu kuras ĝuste antaŭ vi vekiĝas matene kaj ĉekojn ĉu pluvas tiun tagon. Se jes, ili havas la programon teksto vi rememorigilo paki ombrelon antaŭ forlasi la domon.auto Unsubscriber
Skribi
programon kiu escanea tra via retpoŝta konto, trovas ĉiujn malaboni
ligilojn en ĉiuj viaj retpoŝtoj, kaj aŭtomate malfermiĝas ilin en
retumilo. Tiu programo devos ensaluti al via retpoŝta provizanto IMAPan servilon kaj elŝuti ĉiujn viajn retpoŝtojn. Vi povas uzi BeautifulSoup (kovrita en ĉapitro 11 ) por kontroli por ajna okazo kie la vorto malaboni okazas ene HTML ligilon etikedo.
Unufoje vi havas liston de tiuj adresoj, vi povas uzi
webbrowser.open()
por aŭtomate malfermi ĉiujn tiujn ligilojn en retumilo.
Vi ankoraŭ devos permane trairu kaj kompletigi ajnan aldonan paŝoj al malaboni mem de tiuj listoj. Plejofte, ĉi engaĝas klakante ligilon por konfirmi.
Sed tiu skripto savas vin el devi iri tra ĉiuj viaj retpoŝtoj serĉas malaboni ligiloj. Vi povas tiam pasas ĉi skripton kune al viaj amikoj por ke ili povas kuri ĝin sur sian retpoŝton kontoj. (Nur certigi vian retpoŝtan pasvorto ne hardcoded en la fontkodo!)
Kontrolante Via Komputilo Tra Retpoŝto
Skribi
programon kiu kontrolas retpoŝton konton ĉiu 15 minutoj por ajna
instrukcioj vin retmesaĝi kaj ekzekutas tiujn instrukcioj aŭtomate. Ekzemple, BitTorrent estas samulo-al-samulo elŝutanta sistemo. Uzante libera BitTorrent programaro kiel qBittorrent, vi povas elŝuti grandajn amaskomunikiloj dosierojn en via komputilo. Se
vi retpoŝtu la programo (plene laŭleĝa, neniom piratical) BitTorrent
ligilo, la programo eventuale kontrolu lia retpoŝto, trovi tiun mesaĝon,
ĉerpi la ligilo, kaj tiam lanĉi qBittorrent komenci elŝutanta la
dosieron. Tiel, vi povas havi vian hejmon komputilo
komencos malŝarĝoj dum vi estas for kaj la (tute leĝa, neniom piratical)
malŝarĝo povas esti finita antaŭ la tempo vi revenos hejmen.
Ĉapitro 15 kovras kiel lanĉi programojn sur via komputilo uzante la
subprocess.Popen()
funkcion. Ekzemple, jena alvoko ĵetus la qBittorrent programo, kune kun torento dosieron:qbProcess = subprocess.Popen ([ 'C: \\ Program Files (x86) \\ qBittorrent \\ qbittorrent.exe ',' shakespeare_complete_works.torrent '])
Kompreneble, vi volas ke la programo por certigi la retpoŝtoj venas de vi. En
aparta, vi eble volas postuli ke la retpoŝtoj enhavas pasvorto, pro tio
ke estas sufiĉe bagatela por hackers falsa a "el" Adreso en retpoŝtoj. La programo devus forigi la retpoŝtoj trovas por ke ĝi ne ripetas instrukcioj ĉiufoje ĝi kontrolas la retpoŝta konto. Kiel ekstra trajto, havas la programon retpoŝto aŭ teksto vi konfirmon ĉiufoje ĝi ekzekutas komando. Ĉar vi ne sidis antaŭ la komputilo kiu kuras la programo, ĝi estas bona ideo uzi la tala funkcioj (vidu Ĉapitro 10 ) skribi tekstdosiero trabon vi povas kontroli ĉu eraroj supreniru.
qBittorrent (same kiel aliaj BitTorrent aplikoj) havas karakterizaĵon kie povas forlasi aŭtomate post la malŝarĝo kompletigas. Ĉapitro 15 klarigas kiel vi povas determini kiam ĵetis aplikon forlasi kun la
wait()
metodo por Popen
objektoj. La wait()
metodo
alvoko blokos ĝis qBittorrent haltis, kaj tiam via programo povas
retpoŝti aŭ tekston vi sciigo ke la malŝarĝo kompletigis.
Ekzistas multe da eblaj karakterizaĵoj vi povus aldoni al tiu projekto. Se vi blokiĝas, vi povas elŝuti ekzemplo efektivigo de ĉi tiu programo de http://nostarch.com/automatestuff/ .
Nenhum comentário:
Postar um comentário