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)