Andrise programmeerimisalane WIKI
E-post
Google App Engine võimaldab nii e-posti saatmist kui ka vastuvõtmist. Vastuvõtmiseks tuleb registreerida vastav kuular, millele suunatakse kõik tingimusele vastavad kirjad (eri aadressidele laekuvad kirjad saab suunata eri kuularile). Nii saatmine kui vastuvõtmine on tehtud programmeerija jaoks väga mugavaks - pole vaja midagi teada e-kirja tehnilisest ülesehitusest ja muust sellisest, e-kiri on Google App Engine aplikatsiooni jaoks lihtsalt järjekordne kindlate omadustega objekt.
E-posti kasutamiseks tuleb sisse laadida mail teek.
from google.appengine.api import mail
NB olulise piiranguna saab kirju välja saata ainult aplikatsiooni administraatorite või hetkel sisse loginud kasutaja e-posti aadressidelt. See tähendab, et kuigi saatja nimeks võib panna suvalise teksti, siis kasutatavad saatja e-posti aadressid on väga piiratud. Kui on soov saata mingilt muult e-posti aadressilt kirju välja, tuleb selle aadressi jaoks luua Google App Engine konto ning registreerida aadress aplikatsiooni administraatoriks.
Kirjade saatmine
Kirjade saatmine käib teegi mail klassiga EmailMessage - selle jaoks tuleb luua EmailMessage tüüpi objekt, seada vajalikud omadused nagu adressaadi andmed ning kirja sisu ja käivitada saatmiseks objekti meetod send.
kiri = mail.EmailMessage() kiri.sender = "administraator@aplikatsioon.ee" kiri.to = "saaja@aadress.ee" kiri.subject = "Pealkiri" kiri.body = "Tere, see on testkiri!" kiri.send()
Kirja sisu saab seada kahe omaduse läbi - body mis on vormindamata sisu (text/plain) ning html mis on HTML vormingus sisu (text/plain). Juhul kui seatud on vaid üks neist kahest, kasutavad e-posti kliendid lugemiseks olemasolevat, kuid kui seatud on mõlemad, siis kasutatakse kliendi poolt vaikimisi seadeid (reeglina HTML).
Võimalik on saata koos kirjaga ka manuseid. Selle jaoks on kirja objektil omadus attachments, mille sisuks on massiiv manuste andmetega. Manused koosnevad faili nimest ning faili sisust.
message.attachments = [("failinimi1.txt", "faili sisu"),("failinimi2.txt", "faili sisu")]
Kirjade vastuvõtmine
Kirjade vastuvõtmiseks tuleb aplikatsioon eelnevalt seadistada. Esiteks tuleb lisada vastav märge app.yaml konfiguratsioonifaili.
inbound_services: - mail
Järgmisena tuleb samas failis määrata ära, mis aadressidele mis skriptid vastavad. Aplikatsioon saab vastu võtta kirju ainult aadressidelt kujuga teks@ap_id.appspot.com, kuid kirjade suunamisega on seda olukorda võimalik parandada.
Määramaks, et kõik sisenevad kirjad suunatakse sama skripti juurde, tuleb lisada app.yaml handlers sektsiooni järgmine kirje:
- url: /_ah/mail/.+ script: sissetulev.py login: admin
.+ tähistab regulaaravaldist, mis püüab kinni kõik kirjad. Kui on vaja ainult mingit kindlat kirja püüda, näiteks info@app_id.appspot.com, peaks see rida välja nägema nii:
- url: /_ah/mail/info@.*app-id\.appspotmail\.com script: sissetulev.py login: admin
Pythoni skriptis tuleb täiendavalt laadida teek InboundMailHandler
from google.appengine.ext.webapp.mail_handlers import InboundMailHandler
Järgmiseks tuleb luua InboundMailHandler tüüpi klass, millele kiri edastatakse
class Sissetulev(InboundMailHandler): def receive(self, mail_message): saatja = mail_message.sender pealkiri = mail_message.subject saatmise_aeg = mail_message.date
ja viimasena lisada vastav klass aplikatsiooni ruuterile webapp.WSGIApplication, kuid erinevalt tavalisest suunamisest, kus tuleb ette anda nii aadress, millele päring vastama peab ning seejärel, klassi nimetus, sisaldab sisenevate kirjade klass vastavat meetodi mapper mis vajalikud seaded ise ära teeb.
application = webapp.WSGIApplication([Sissetulev.mapping()], debug=True)
Kui kirja saatmisel oli väga lihtne teha vahet vormindamata ja HTML vormingus siu vahel, siis kirjade vastuvõtmisel on asi veidi keerulisem, kuigi mitte väga keeruline. Soovitud kirja sisud (ühes kirjas võib olla terve hulk erinevaid sisusid, lisaks põhikirjale edastatud kirjad jne) tuleb vastavalt tüübile kirjast bodies meetodiga ise välja laadida.
Näiteks HTML vormingus sisu laadimine käiks järgnevalt:
html_sisud = message.bodies('text/html') for content_type, body in html_bodies: html = body.decode()
Sama lugu on manustega, kõigepealt tuleb manused välja otsida (erinevus seisneb selles, kas kirjal on ainult üks manus või mitu).
manused = [] if message.attachments: if isinstance(message.attachments[0], basestring): manused = [message.attachments] else: manused = message.attachments
Edasi saab manustega tegelda juba lihtsalt:
for filename, content in attachments: faili_nimi = filename faili_sisu = content tee_midagi_manusega(faili_nimi, faili_sisu)
Käidud rada: • wordpress • tookeskkond • pubsubhubbub • viited • cron • koos • mail