【问题标题】:Trying to read emails with specific subject from Gmail尝试从 Gmail 中阅读具有特定主题的电子邮件
【发布时间】:2021-01-31 04:03:31
【问题描述】:

我正在尝试阅读 Gmail 中具有特定主题的电子邮件并获取电子邮件中的 OTP 值。我正在使用 imaplib

  import imaplib  
  def get_CreateAccount_OTP(self, email_type):
        gmail = imaplib.IMAP4_SSL("imap.gmail.com", 993)
        gmail.login(self.gmail_username, self.gmail_password)
        gmail.select('Inbox', readonly=True)

     type, data = gmail.search(None, '(SUBJECT "Here\'s your Texas by Texas email verification.")')

我得到的类型返回为 Ok,但数据如下

 data = {list: 1} [b'']
 0 = {bytes: 0} b''
  __len__ = {int} 1

在那一行之后,它不会进入下面的“for循环”

    for num in data[0].split():
        typ, data = gmail.fetch(num, '(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = str(email.message_from_string(raw_email_string))
    email_message_list = email_message.split('\n')
    RE_TIME_STAMP_PATTERN = re.compile((r'\d{6}'))
    for line in email_message_list:
        print(line)
        if 'Your sign-in verification code is ' in line:
            self.OTP = re.findall(RE_TIME_STAMP_PATTERN, line)[0]
            break
    self.log.info("OTP:",self.OTP)
    return self.OTP
   

注意:我是 Python 新手,学习缓慢。请坦白我的愚蠢问题 提前致谢

【问题讨论】:

  • 嗨!您在代码中使用Gmail IMAP 吗?另外,您对这段代码的实际意图是什么?您遇到的主要问题是什么,即数据没有进入 for 循环?您能否在 data[0] 进入 for 循环之前记录它以确保问题不存在?您收到任何错误消息吗?
  • 嗨@MateoRandwolf,我正在使用iMaplib.py。我想阅读所有具有指定主题的电子邮件。但数据返回空。我用正文替换了主题,现在脚本正在运行。不确定主题方法是否错误。没有显示错误
  • 很高兴您设法解决了您的问题。您能否将您的评论正式化为答案,以便其他有类似问题的用户可以轻松找到答案?谢谢 ! :D
  • 它与我使用的脚本相同,问题在于字符串中的特殊字符。 “这是”一旦我删除了该文本,它就可以正常工作。现在我想尝试使用特殊字符,因为我将使用带有 Unicode ex 的西班牙语。 “Favoor de verificar su correo electronic”。 “ó”是 unicode,搜索方法不返回任何电子邮件。不知道如何处理特殊字符。此外,当字符串具有“'”字符时,不会返回任何电子邮件。感谢您的帮助

标签: python gmail-imap imaplib


【解决方案1】:

我发现字符串有特殊字符并且 implib 没有将字符转换为 Unicode 的问题。所以我必须删除字符串中包含特殊字符的单词。

 import imaplib  
  def get_CreateAccount_OTP(self, email_type):
        subject="your Texas by Texas email verification."
        gmail = imaplib.IMAP4_SSL("imap.gmail.com", 993)
        gmail.login(self.gmail_username, self.gmail_password)
        gmail.select('Inbox', readonly=True)

     type, data = gmail.search(None, '(UNSEEN SUBJECT "%s")' % subject)
  
    for num in data[0].split():
        typ, data = gmail.fetch(num, '(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = str(email.message_from_string(raw_email_string))
    email_message_list = email_message.split('\n')
    RE_TIME_STAMP_PATTERN = re.compile((r'\d{6}'))
    for line in email_message_list:
        print(line)
        if 'Your sign-in verification code is ' in line:
            self.OTP = re.findall(RE_TIME_STAMP_PATTERN, line)[0]
            break
    self.log.info("OTP:",self.OTP)
    return self.OTP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2015-04-09
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多