首页 > 解决方案 > 如何使这个读取电子邮件的python2函数在python3中运行?

问题描述

我一直在关注如何在 python 中阅读电子邮件的指南

https://codehandbook.org/how-to-read-email-from-gmail-using-python/

import smtplib
import time
import imaplib
import email

ORG_EMAIL   = "@gmail.com"
FROM_EMAIL  = "mygmail" + ORG_EMAIL
FROM_PWD    = "mypassword"
SMTP_SERVER = "imap.gmail.com"
SMTP_PORT   = 993
def read_email_from_gmail():
    mail = imaplib.IMAP4_SSL(SMTP_SERVER)
    mail.login(FROM_EMAIL,FROM_PWD)
    mail.select('inbox')

    type, 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):
        typ, 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')

这段代码是为 python2 编写的,使用 python2 运行它可以完美运行,但我想使用 python3,所以我尝试翻译代码。print foobar首先,我更改了to的所有实例print(foobar)

但是我收到错误“TypeError:无法将字节连接到 int”

Traceback (most recent call last):
  File "mymail.py", line 37, in <module>
    read_email_from_gmail()
  File "mymail.py", line 26, in read_email_from_gmail
    typ, data = mail.fetch(i, '(RFC822)' )
  File "/usr/lib/python3.5/imaplib.py", line 518, in fetch
    typ, dat = self._simple_command(name, message_set, message_parts)
  File "/usr/lib/python3.5/imaplib.py", line 1180, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib/python3.5/imaplib.py", line 945, in _command
    data = data + b' ' + arg
TypeError: can't concat bytes to int

我对这个错误不太熟悉。但是在 python2 中使用文本中的原始代码可以完美地工作,没有任何问题。我有点理解它说它不能将字节与数字连接起来的错误。但是我不确定为什么从 python2 到 python3 会发生这个错误。

标签: pythonpython-3.xemail

解决方案


推荐阅读