通过 Python 使用电子邮件地址和密码连接到 Gmail

问题描述 投票:0回答:1

我正在尝试使用 Python 连接到我的 Gmail 帐户。我想使用 SMTP 和 IMAP 连接到它。我知道可以使用应用程序密码来建立此连接,但有没有办法改为使用实际的电子邮件密码?

我一直在读这篇文章,
https://support.google.com/accounts/answer/6010255#zippy=%2Cif-less-secure-app-access-is-on-for-your-account%2Cif-less-secure-app-access-您的帐户已关闭

顶部给出的警告告诉我,即使允许“不太安全的应用程序访问”,也不可能这样做,

我说得对吗?

下面给出的是我用来发送和搜索电子邮件的代码。就像我说的,这只适用于应用程序密码,

import smtplib
import imaplib
import email
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import pandas as pd


class EmailClient:
    def __init__(self, email, password, smtp_server='smtp.gmail.com', smtp_port=587, imap_server="imap.gmail.com"):
    self.email = email
    self.password = password
    self.smtp_server = smtplib.SMTP(smtp_server, smtp_port)
    self.imap_server = imaplib.IMAP4_SSL(imap_server)

def send_email(self, to_addr, subject, body):
    msg = MIMEMultipart()
    msg['From'] = self.email
    msg['To'] = to_addr
    msg['Subject'] = subject
    msg.attach(MIMEText(body, 'plain'))

    self.smtp_server.starttls()
    self.smtp_server.login(self.email, self.password)
    self.smtp_server.send_message(msg)
    self.smtp_server.quit()

def search_email(self, mailbox="INBOX", subject=None, to=None, from_=None, since_date=None, until_date=None,
                 since_emailid=None):

    self.imap_server.login(self.email, self.password)

    self.imap_server.select(mailbox)

    query_parts = []
    if subject is not None:
        query_parts.append(f'(SUBJECT "{subject}")')
    if to is not None:
        query_parts.append(f'(TO "{to}")')
    if from_ is not None:
        query_parts.append(f'(FROM "{from_}")')
    if since_date is not None:
        since_date_str = since_date.strftime("%d-%b-%Y")
        query_parts.append(f'(SINCE "{since_date_str}")')
    if until_date is not None:
        until_date_str = until_date.strftime("%d-%b-%Y")
        query_parts.append(f'(BEFORE "{until_date_str}")')
    if since_emailid is not None:
        query_parts.append(f'(UID {since_emailid}:*)')

    query = ' '.join(query_parts)

    ret = []

    resp, items = self.imap_server.uid('search', None, query)
    items = items[0].split()
    for emailid in items[::-1]:
        resp, data = self.imap_server.uid('fetch', emailid, "(BODY[HEADER.FIELDS (SUBJECT TO FROM DATE)])")
        try:
            raw_email = data[0][1].decode("utf-8")
        except UnicodeDecodeError:
            ValueError(f"Could not decode email with id {emailid}")
        email_message = email.message_from_string(raw_email)

        email_line = {}
        email_line['id'] = emailid
        email_line["to"] = email_message['To']
        email_line["from"] = email_message['From']
        email_line["subject"] = str(email_message['Subject'])
        email_line["created_at"] = email_message['Date']
        resp, email_data = self.imap_server.uid('fetch', emailid, '(BODY[TEXT])')
        email_line["body"] = email_data[0][1].decode('utf-8')

        ret.append(email_line)

    self.imap_server.logout()

    return pd.DataFrame(ret)
python email smtp gmail imap
1个回答
0
投票

我知道可以使用应用程序密码来建立此连接,但有没有办法改为使用实际的电子邮件密码?

不,没有,您需要做两件事之一。

  1. 在帐户上启用 2fa 并创建应用程序密码
  2. 使用 Xoauth2 并请求用户授权访问其帐户。

你的代码对我来说看起来不错,只需创建一个应用程序密码即可。

© www.soinside.com 2019 - 2024. All rights reserved.