On 2019-11-14 19:43, Abdur-Rahmaan Janhangeer wrote:
Greetings,

Using this code to read mail. I'm printing to file only mails sent by some
people. For some mails i get the body as the below instead of actual text:

[<email.message.Message object at 0x02209970>, <email.message.Message
object at 0x021ECB30>]

instead of the actual mail body.

Here is the code:

#
#
import imaplib
import email
import time

my_senders = ['y...@x.com ', 'y...@y.com', 'y...@z.com']
my_mail_count = 1
open('data.txt', 'w+')
def read_email_from_gmail():
     global my_mail_count, my_senders

     mail = imaplib.IMAP4_SSL('imap.gmail.com')
     mail.login('mym...@gmail.com','password')
     mail.select('inbox')

     result, data = mail.search(None, 'ALL')
     mail_ids = data[0]

     id_list = mail_ids.split()
     first_email_id = int(id_list[0])
     latest_email_id = int(id_list[-1])

     for i in range(latest_email_id,first_email_id, -1):
       #pypi  # need str(i)
         result, data = mail.fetch(str(i), '(RFC822)' )

         for response_part in data:
             if isinstance(response_part, tuple):
                 # from_bytes, not from_string
                 msg = email.message_from_bytes(response_part[1])

                 email_subject = msg['subject']
                 email_from = msg['from']
                 print ('{} {}'.format(my_mail_count, email_subject))
                 print('        {}'.format(email_from))
                 my_mail_count += 1

                 #email_body = msg.get_payload(decode=True)

                 for m in my_senders:
                     if m in email_from:
                         if msg.is_multipart():
                             for part in msg.get_payload():
                                 print(msg.get_payload(),
file=open('data.txt', 'a'))
                                 if isinstance(msg.get_payload(), list):
                                     print(dir(msg.get_payload()[0]))
                         else:
                             print(msg.get_payload(), file=open('data.txt',
'a'))
                             if isinstance(msg.get_payload(), list):
                                     print(dir(msg.get_payload()[0]))

read_email_from_gmail()
#
#

Any idea?

The payload is sometimes split into parts that are encoded. Do something like this:

from email.header import decode_header

def decode_payload(header, default_encoding='utf-8'):
    parts = []

    for data, encoding in decode_header(header):
        if isinstance(data, str):
            parts.append(data)
        else:
            parts.append(data.decode(encoding or default_encoding))

    return ' '.join(parts)
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to