0

so basically i have this script that runs continuously and when a new email arrives in the inbox with specific text in the subject, it grabs information from the email. I have only managed to get it to pull the subject from the email but I cant get it do get the body of the email no matter what I try, I believe the email body is in HTML so i attempted to use BeautifulSoup to parse the body but that doesnt work at all. Please help!!! :( Here is what i have so far:

import email
import imaplib
from bs4 import BeautifulSoup
import time
import sys

username = 'xxx.xxx@xxx.xx'
password = 'xxxxxx'

mail = imaplib.IMAP4_SSL('imap-mail.outlook.com')
(retcode, capabilities) = mail.login(username, password)
mail.list()

n=0
while True:
    mail.select('inbox')
    (retcode, messages) = mail.search(None, 'UNSEEN', '(SUBJECT "xxxxxxx- 
     ")', '(FROM "xx.xx@xxxx.xx")')
    if retcode == 'OK':
        for num in messages[0].split():
            n=n+1
            print('Processing Email ' + str(n))
            typ, data = mail.fetch(num, '(RFC822)')
            for response_part in data:
                if isinstance(response_part, tuple):
                    original = email.message_from_bytes(response_part[1])
                    print("Subject: " + original['Subject'])
                    typ, data = mail.store(num,'+FLAGS','\\Seen')
                    time.sleep(120)
  • @stovfl its says Message[b'1240']: 50 – Collette jorike Sep 26 '18 at 19:58
  • Nothing what i expected , what Python version you are using? Please show `print("Message[{}]:\n{}".format(num, original))` – stovfl Sep 26 '18 at 20:13
  • 1
    @stovfl its python version 3.7.0, and it prints out a bunch of stuff, i think its html version of the email, there's information from the email like sender address, a

    tag and an

    tag at the end

    – Collette jorike Sep 26 '18 at 20:46
  • Possible duplicate of [How to fetch an email body using imaplib in python?](https://stackoverflow.com/questions/2230037/how-to-fetch-an-email-body-using-imaplib-in-python) – stovfl Sep 27 '18 at 06:17

1 Answers1

1

Comment: The "body" returned by imap.fetch are usually bytes, not a string, which throws an exception

Change to:

msg = email.message_from_bytes(body)

Question: I cant get it do get the body of the email

For example:

import email, imaplib

username = 'xxx.xxx@xxx.xx'
password = 'xxxxxx'
imap = imaplib.IMAP4_SSL('imap-mail.outlook.com')
imap.login(username, password)
imap.select("inbox")

resp, items = imap.search(None, "(UNSEEN)")

for n, num in enumerate(items[0].split(), 1):
    resp, data = imap.fetch(num, '(RFC822)')

    body = data[0][1]
    msg = email.message_from_string(body)
    content = msg.get_payload(decode=True)

    print("Message content[{}]:{}".format(n, content))
stovfl
  • 14,998
  • 7
  • 24
  • 51
  • The "body" returned by imap.fetch are usually bytes, not a string, which throws an exception. – Janman Dec 06 '18 at 14:09