Python: Imap, aanpassen van subject en doorsturen.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ameliusvtwil
  • Registratie: Januari 2005
  • Laatst online: 19-06 21:43
Wat wil ik oplossen:

Wij hebben een ERP software pakket dat via de mail een bestelling kan doen bij verschillende leveranciers. Nu hebben we 1 leverancier die perse een vast subject moet hebben om opgepakt te worden door hun importrobot voor de bestellingen.

Hoe is het nu opgelost:
ERP stuurt een mail naar een hiervoor aangemaakte mailbox. In deze mailbox staat een rule naar de afdeling inkoop dat ze deze mail door moeten sturen naar het adres van de leverancier en hierin staat aangegeven welk subject er gebruikt moet worden. Dit wordt dan handmatig door de afdeling inkoop gedaan.

Wat ik nu al heb gevonden:
Ik heb het volgende script samen kunnen stellen en dit werkt, maar is nog niet optimaal.

Dit script maakt verbinding met de mailbox, selecteert de eerste mail en past deze aan zoals gewenst, stuurt deze door naar een extern adres en wordt daarna verplaatst naar een map afgehandeld.
Hierdoor wordt de 2e mail de 1e en kan het script opnieuw gestart worden.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import smtplib, imaplib, email, re
#mail lezen, aanpassen en doorsturen
imap_host = "SERVERNAME"
client = imaplib.IMAP4('SERVERNAM')
client.login('USERNAME', 'PWD')
client.select('INBOX') #, readonly=True
msgid = 1
status, data = client.fetch(msgid, "(RFC822)")
email_data = data[0][1]
client.close()
client.logout()
message = email.message_from_string(email_data)
message.replace_header("Subject", "test")
message.replace_header("From", 'test@test.com')
message.replace_header("To", 'EXTERN EMAILADRES')
smtp = smtplib.SMTP('SMTP SERVER')
smtp.starttls()
smtp.login('USERNAME', 'PWD')
from_addr = "AFZENDADRES"
to_addr = "EXTERN EMAILADRES"
smtp.sendmail(from_addr, to_addr, message.as_string())
#Mail verplaatsen naar folder
client = imaplib.IMAP4('SERVERNAME')
client.login('USERNAME', 'PWD')
client.select('INBOX', readonly=False)
pattern_uid = re.compile('\d+ \(UID (?P<uid>\d+)\)')
def parse_uid(data):
    match = pattern_uid.match(data)
    return match.group('uid')
resp, items = client.search(None, 'All')
email_ids  = items[0].split()
latest_email_id = email_ids[0]
resp, data = client.fetch(latest_email_id, "(UID)")
msg_uid = parse_uid(data[0])
result = client.uid('COPY', msg_uid, 'INBOX/Afgehandeld')
if result[0] == 'OK':
    mov, data = client.uid('STORE', msg_uid , '+FLAGS', '(\Deleted)')
    client.expunge()
client.close()
client.logout()


Wat zou wel optimaal zijn:
Hij moet alle ongelezen mails waarin het woord 'bestelorder' voorkomt in subject of van een bepaald afzendadres aanpassen en doorsturen. Dit omdat de leverancier een orderbevestiging terug stuurt naar deze mailbox. We willen natuurlijk niet dat deze dan ook weer doorgestuurd wordt naar de leverancier.Het zou ook fijn zijn als er meer bestelorders in de map staan dat deze allemaal aangepast en doorgestuurd worden.

Kort samengevat: Dus hij moet checken of er in de inbox een mail staat van een afzender en/of met het woord bestelorder in het subject. Wanneer er geen mail aan de eerder benoemde voorwaarden voldoet mag het script afgebroken worden. Wanneer er wel mail aan de eerder benoemde voorwaarden voldoet moeten deze automatisch voorzien worden van een nieuwe afzender, ontvanger en subject en dan doorgestuurd worden.

Ik hoop dat ik het een beetje duidelijk heb kunnen omschrijven en dat er mensen zijn die mij ermee kunnen helpen. Ik ben redelijk beginner met python, dus hiervoor graag jullie begrip. Als je antwoord geef wil je dit dan zo uitgebreid mogelijk doen zodat ik het begrijp en er iets van kan leren.

Het is python 2.7.13
Mailserver is groupwise

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 25-07 21:51

ElCondor

Geluk is Onmisbaar

Zet je code block even tussen [ code] [/code ] tags (zonder spaties, dat leest iets makkelijker) Ik ga me er ook nog even in verdiepen ;)

-EDIT- Even goed doorgelezen.
wil je dit script handmatig om de zoveel tijd aftrappen? Of moet dit script gescheduled eens in de zoveel tijd de mailbox inlezen?
Wat je zou kunnen doen is de aanwezige emails in een array opnemen en deze dan één voor één parsen.
Met een for each loop. Verder zou je kunnen kijken of je de voorwaarden, als die aan verandering onderhevig zijn, in een eigen bestand (key value pairs) zou kunnen zetten zodat je bij nieuwe regels niet je hele code door hoeft te spitten, maar alleen dit bestand hoeft te bewerken.

[ Voor 67% gewijzigd door ElCondor op 10-05-2017 09:56 ]

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • ameliusvtwil
  • Registratie: Januari 2005
  • Laatst online: 19-06 21:43
Dank voor je reactie!

Ik heb het nu ter test ingesteld in de taakplanner van windows. Die laat hem elke 10 minuten lopen.

Dat één voor één parsen gaat mijn kennis qua code net iets te boven :(

Key value pairs ga ik even op googlen. Dat klinkt erg interessant.

Acties:
  • 0 Henk 'm!

  • ElCondor
  • Registratie: Juni 2001
  • Laatst online: 25-07 21:51

ElCondor

Geluk is Onmisbaar

ameliusvtwil schreef op woensdag 10 mei 2017 @ 11:52:
Dank voor je reactie!

Ik heb het nu ter test ingesteld in de taakplanner van windows. Die laat hem elke 10 minuten lopen.

Dat één voor één parsen gaat mijn kennis qua code net iets te boven :(

Key value pairs ga ik even op googlen. Dat klinkt erg interessant.
Je zou kunnen uitzoeken of je meerdere messages in een keer kunt ophalen met de imap library die je gebruikt.
Die stop je in een variable (dat wordt dan een array), vervolgens gebruik je een for each loop die door die array heen loopt en jouw code vanaf regel 12 tot en met regel 40 uitvoert voor ieder van die messages.

Hay 365 dias en un año y 366 occasiones para festejar (Boliviaans spreekwoord)


Acties:
  • 0 Henk 'm!

  • Montaner
  • Registratie: Januari 2005
  • Laatst online: 30-07 12:59
Hier staan wat zaken welke overeen komen met je wensen:
https://yuji.wordpress.co...-imap-example-with-gmail/

Een oud artikel, maar zou prima moeten werken gok ik zo. Met een beetje Google kom je een heel eind.