views:

667

answers:

3

I have a postfix server listening and receiving all emails received at mywebsite.com Now I want to show these postfix emails in a customized interface and that too for each user

To be clear, all the users of mywebsite.com will be given mail addresses like [email protected] who receives email on my production machine but he sees them in his own console built into his dashboard at mywebsite.com.

So to make the user see the mail he received, I need to create an email replica of the postfix mail so that mywebsite(which runs on django-python) will be reflecting them readily. How do I achieve this. To be precise this is my question, how do I convert a postfix mail to a python mail object(so that my system/website)understands it?

Just to be clear I have written psuedo code to achieve what I want:

email_as_python_object = postfix_email_convertor(postfix_email)
attachments_list = email_as_python_object.attachments
body = email_as_python_object.body # be it html or whatever

And by the way I have tried default email module which comes with python but thats not handy for all the cases. And even I need to deal with mail attachments manually(which I hate). I just need a simple way to deal with cases like these(I was wondering how postfix understands a email received. ie.. how it automatically figures out different headers,attachments etc..). Please help me.

A: 

I'm not sure that I understand the question.

If you want your remote web application to be able to view users' mailbox, you could install a pop or imap server and use a mail client (you should be able to find one off the shelf) to read the emails. Alternatively, you could write something to interrogate the pop/imap server using the relevant libraries that come with Python itself.

If you want to replicate the mail to another machine, you could use procmail and set up actions to do this. Postfix can be set up to invoke procmail in this wayy.

ConcernedOfTunbridgeWells
Nope NXC. What I want is, I want the user to see his email message in my website's dashboard. So my website should know what the email message is right(to show it properly)? So I need a way to let my application/website know what the email message already has(body, attachments etc..). How do I do?
Maddy
I have written psuedo code to get what I want. Please have a a look at it.
Maddy
+7  A: 

You want to have postfix deliver to a local mailbox, and then use a webmail system for people to access that stored mail.

Don't get hung up on postfix - it just a transfer agent - it takes messages from one place, and puts them somewhere else, it doesn't store messages. So postfix will take the messages over SMTP, and put them in local mail files.

Then IMAP or some webmail system will display those messages to your users.

If you want the mail integrated in your webapp, then you should probably run an IMAP server, and use python IMAP libraries to get the messages.

Douglas Leeder
This sounds like a stronger and more scalable application design... using a system like this, the app can grow seamlessly across multiple layers if load demands it, plus there are existing libraries to help with implementing this.
Jarret Hardie
+3  A: 

First of all, Postfix mail routing rules can be very complex and your presumably preferred solution involves a lot of trickery in the wrong places. You do not want to accidentally show some user anothers mails, do you? Second, although Postfix can do almost anything, it shouldn't as it only is a MDA (mail delivery agent).

Your solution is best solved by using a POP3 or IMAP server (Cyrus IMAPd, Courier, etc). IMAP servers can have "superuser accounts" who can read mails of all users. Your web application can then connect to the users mailbox and retreive the headers and bodys.

If you only want to show the subject-line you can fetch those with a special IMAP command and very low overhead. The Python IMAP library has not the easiest to understand API though. I'll give it a shot (not checked!) with an example taken from the standard library:

import imaplib

sess = imaplib.IMAP4()
sess.login('superuser', 'password')
# Honor the mailbox syntax of your server!
sess.select('INBOX/Luke') # Or something similar. 
typ, data = sess.search(None, 'ALL') # All Messages.

subjectlines = []
for num in data[0].split():
    typ, msgdata = sess.fetch(num, '(RFC822.SIZE BODY[HEADER.FIELDS (SUBJECT)])')
    subject = msgdata[0][1].lstrip('Subject: ').strip()
    subjectlines.append(subject)

This logs into the IMAP server, selects the users mailbox, fetches all the message-ids then fetches (hopefully) only the subjectlines and appends the resulting data onto the subjectlines list.

To fetch other parts of the mail vary the line with sess.fetch. For the specific syntax of fetch have a look at RFC 2060 (Section 6.4.5).

Good luck!

pi