【问题标题】:Reading unread emails using python script使用 python 脚本读取未读邮件
【发布时间】:2023-03-24 03:06:02
【问题描述】:

我正在尝试阅读来自 gmail 帐户的所有未读电子邮件。 上面的代码可以建立连接但无法获取邮件。

我想打印每封邮件的内容。

我收到错误,因为无法将 int 连接到字节。

代码:

import smtplib
import time
import imaplib
import email

def read_email_from_gmail():
        mail = imaplib.IMAP4_SSL('imap.gmail.com')
        mail.login('my_mail','my_pwd')
        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):
            result, data = mail.fetch(i, '(RFC822)' )

            for response_part in data:
                if isinstance(response_part, tuple):
                    msg = email.message_from_string(response_part[1])
                    email_subject = msg['subject']
                    email_from = msg['from']
                    print ('From : ' + email_from + '\n')
                    print ('Subject : ' + email_subject + '\n')



print(read_email_from_gmail())

错误:

Traceback (most recent call last):
  File "C:/Users/devda/Desktop/Internship/access_email.py", line 32, in <module>
    print(read_email_from_gmail())
  File "C:/Users/devda/Desktop/Internship/access_email.py", line 20, in read_email_from_gmail
    result, data = mail.fetch(i, '(RFC822)' )
  File "C:\Users\devda\AppData\Local\Programs\Python\Python36\lib\imaplib.py", line 529, in fetch
    typ, dat = self._simple_command(name, message_set, message_parts)
  File "C:\Users\devda\AppData\Local\Programs\Python\Python36\lib\imaplib.py", line 1191, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "C:\Users\devda\AppData\Local\Programs\Python\Python36\lib\imaplib.py", line 956, in _command
    data = data + b' ' + arg
TypeError: can't concat int to bytes
>>> 

我按照here的教程学习

我想要做的是从图像中显示的电子邮件中提取内容

【问题讨论】:

  • 我猜你需要str(i) 虽然我现在没有时间好好研究一下。
  • 顺便说一句,该函数不会返回任何可以打印的有用信息;所以最终打印出来的只是None。也许更好的设计是让函数return 获取您提取的信息,并让调用者决定是要print() 还是用它做其他事情。
  • 我试过 str(i) 它给了我初始值的类型错误必须是 str 或 none ,而不是字节。
  • 嗯,你在哪里改的?我的意思是result, data = mail.fetch(str(i), '(RFC822)' )
  • 是的,在那边。我应该发布回溯吗?

标签: python python-3.x smtp imaplib


【解决方案1】:

我必须对您的代码进行一些更改才能使其在 Python 3.5.1 上运行。我在下面内联了 cmets。

# no need to import smtplib for this code
# no need to import time for this code
import imaplib
import email


def read_email_from_gmail():
        mail = imaplib.IMAP4_SSL('imap.gmail.com')
        mail.login('my_mail','my_pwd')
        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):
            # 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 ('From : ' + email_from + '\n')
                    print ('Subject : ' + email_subject + '\n')

# nothing to print here
read_email_from_gmail()

也许向该博客的作者提交错误报告。

【讨论】:

  • 我得到了正确的部分和主题部分。我也应该如何获取内容。
  • 这远远超出了这个问题的范围。简而言之,检查 MIME 结构并提取所需的部分。看看stackoverflow.com/questions/16411710/…
  • 在阅读只有一封电子邮件的邮箱时,第一个 for 循环有些奇怪,而且我将过滤器更改为只阅读 UNSEEN 电子邮件,并将它们标记为已读:gist.github.com/philshem/4ee388f7dc045366c16eb9730ca630a9跨度>
  • 如果您不关心枚举,为什么还要enumerate?你为什么要转换成int,然后立即转换成str?
【解决方案2】:

这对我有用: 它将发件人地址、主题、内容(文本)存储到所有未读电子邮件的文件中。 代码:

import email
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
(retcode, capabilities) = mail.login('mymail','mypassword')
mail.list()
mail.select('inbox')

n=0
(retcode, messages) = mail.search(None, '(UNSEEN)')
if retcode == 'OK':

   for num in messages[0].split() :
      print ('Processing ')
      n=n+1
      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 (original['From'])
            # print (original['Subject'])
             raw_email = data[0][1]
             raw_email_string = raw_email.decode('utf-8')
             email_message = email.message_from_string(raw_email_string)
             for part in email_message.walk():
                        if (part.get_content_type() == "text/plain"): # ignore attachments/html
                              body = part.get_payload(decode=True)
                              save_string = str(r"C:\Users\devda\Desktop\Internship\Dumpemail_" + str('richboy') + ".txt" )
                              myfile = open(save_string, 'a')
                              myfile.write(original['From']+'\n')
                              myfile.write(original['Subject']+'\n')            
                              myfile.write(body.decode('utf-8'))
                              myfile.write('**********\n')
                              myfile.close()
                        else:
                              continue

             typ, data = mail.store(num,'+FLAGS','\\Seen')

print (n)

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 2016-07-07
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多