imap folder scanner

K

Kun

Hey guys, I would like to have a code in python (as simple as possible)
to scan a specific folder in my mailbox and if the subject is equal to,
say, 'BIKES', I would like to have the code automatically send the
SENDER an email saying something like "We have received your Email".
Furthermore, I would also like to somehow save the sender's email into a
list which would be compiled by another python program into an html file
that would show a list of email addresses whose subject matched 'BIKE'

I know i am asking for a lot but since i am new to python, can someone
help me out with this? Whether its tips or code, i'll be very excited to
hear your answer. Thanks.
 
K

Kun

Okay So I got the 'search' part to work, which outputs me a long list of
message numbers. how do i use that list of message numbers to fetch the
'from' address for each one and send them a confirmation email?

is this some sort for loop?

any help would be greatly appreciated.

cheers.
 
S

Sebastjan Trepca

A very simple example...

import imaplib
m = imap.IMAP4(<myserver ip or host>)
m.login(username,password)
m.select('myfolder')
status, data = m.search(None,'(SUBJECT "BIKES")')
assert status=='OK', "Error. Message: %s"%data
data = data[0] #you get your results in a list and search returns only
one result
assert data,"No results"
#cool, we have results, but IMAP's search command only returns IDs so
we have to fetch
#msgs now
status,senders = m.fetch(data.replace('
',','),'(BODY.PEEK[HEADER.FIELDS (FROM)])')
assert status=='OK', "Error. Message: %s"%data

Now you just have to parse the "senders" data. There are many examples
about sending emails with python, like this one:

def send_notice():
import smtplib
msg = 'we got your mail, indeed'
from email.MIMEText import MIMEText
mail = MIMEText(msg, 'plain', 'utf-8')
mail['From'] =fro='(e-mail address removed)'
mail['Subject'] = "Spam machine"
mail['To'] = to = '(e-mail address removed)'
server = smtplib.SMTP('localhost')
errors = server.sendmail(fro, to, mail.as_string())
server.quit()

That other program should be very simple to make now.

Sebastjan
 
K

Kun

Sebastjan said:
A very simple example...

import imaplib
m = imap.IMAP4(<myserver ip or host>)
m.login(username,password)
m.select('myfolder')
status, data = m.search(None,'(SUBJECT "BIKES")')
assert status=='OK', "Error. Message: %s"%data
data = data[0] #you get your results in a list and search returns only
one result
assert data,"No results"
#cool, we have results, but IMAP's search command only returns IDs so
we have to fetch
#msgs now
status,senders = m.fetch(data.replace('
',','),'(BODY.PEEK[HEADER.FIELDS (FROM)])')
assert status=='OK', "Error. Message: %s"%data

Now you just have to parse the "senders" data. There are many examples
about sending emails with python, like this one:

def send_notice():
import smtplib
msg = 'we got your mail, indeed'
from email.MIMEText import MIMEText
mail = MIMEText(msg, 'plain', 'utf-8')
mail['From'] =fro='(e-mail address removed)'
mail['Subject'] = "Spam machine"
mail['To'] = to = '(e-mail address removed)'
server = smtplib.SMTP('localhost')
errors = server.sendmail(fro, to, mail.as_string())
server.quit()

That other program should be very simple to make now.

Sebastjan

Hey guys, I would like to have a code in python (as simple as possible)
to scan a specific folder in my mailbox and if the subject is equal to,
say, 'BIKES', I would like to have the code automatically send the
SENDER an email saying something like "We have received your Email".
Furthermore, I would also like to somehow save the sender's email into a
list which would be compiled by another python program into an html file
that would show a list of email addresses whose subject matched 'BIKE'

I know i am asking for a lot but since i am new to python, can someone
help me out with this? Whether its tips or code, i'll be very excited to
hear your answer. Thanks.

Thank you very much for your help. I am trying to use your code and
currently it works up to the 'fetch', where I am getting the following
error:

error: FETCH command error: BAD ['Protocol Error: "Specified message set
is invalid".']

I guess I do not understand why you have data.replace('',',') and what
",',' means.

Thanks so much.

Kun
 
M

Marco Carvalho

m.select('myfolder')

Some attention is required here to retrieve subfolders.
Some imap servers like Cyrus and Courier uses "INBOX.subfolder" to
access subfolders.
--
Marco Carvalho (macs) | marcoacarvalho(a)gmail.com
http://arrakis.no-ip.info | http://cdd.debian-br.org
Maceio - Alagoas - Brazil
Debian GNU/Linux unstable (Sid)
GNU-PG ID:08D82127 - Linux Registered User #141545
Notícias Semanais do Debian em Português: http://www.debian.org/News/weekly
Alertas de Segurança Debian (DSA): http://www.debian.org/security
 
K

Kun

Marco said:
Some attention is required here to retrieve subfolders.
Some imap servers like Cyrus and Courier uses "INBOX.subfolder" to
access subfolders.
--
Marco Carvalho (macs) | marcoacarvalho(a)gmail.com
http://arrakis.no-ip.info | http://cdd.debian-br.org
Maceio - Alagoas - Brazil
Debian GNU/Linux unstable (Sid)
GNU-PG ID:08D82127 - Linux Registered User #141545
Notícias Semanais do Debian em Português: http://www.debian.org/News/weekly
Alertas de Segurança Debian (DSA): http://www.debian.org/security


so i have used the following code and have successfully saved a list of
senders as a string. however, the string has much more information than
just the email address and i am wondering what is the best way to parse
the email address out of the entire string.

sample string:OK [('460 (BODY[HEADER.FIELDS (FROM)] {46}', 'From: Friend
<[email protected]>\r\n\r\n'), ')', ('462 (BODY[HEADER.FIELDS (FROM)] {37}',
'From: Kun <[email protected]>\r\n\r\n'), ')']

how do i just get the two email addresses out of there?

my code is:

from imaplib import *
import getpass
m = IMAP4("xxxxxxxx")
m.login('xxxxxx', 'xxxxxxx')
m.select('Inbox')
status, data = m.search(None,'(SUBJECT "BIKES")')
assert status=='OK', "Error. Message: %s"%data
data = data[0] #you get your results in a list and search returns only
one result
assert data,"No results"
#cool, we have results, but IMAP's search command only returns IDs so we
have to fetch
#msgs now
status,senders = m.fetch(data.replace(' ',','),'(BODY.PEEK[HEADER.FIELDS
(FROM)])')
assert status=='OK', "Error. Message: %s"%data
print senders
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,046
Latest member
Gavizuho

Latest Threads

Top