【python】python如何收邮件呢

在 Python 中监测并接收邮件通常使用 imaplib 库,它实现了 IMAP4rev1 协议(Internet Message Access Protocol version 4 revision 1)。以下是使用 imaplib 监测并接收邮件的一般步骤:

  1. 连接到 IMAP 服务器: 使用 imaplib 连接到你的邮箱的 IMAP 服务器。
  2. 登录邮箱账户: 使用你的邮箱地址和密码进行登录。
  3. 选择邮箱文件夹: 通常情况下,你需要选择“收件箱”(INBOX)来查看收到的邮件。
  4. 搜索邮件: 使用搜索命令(如 UID SEARCHSEARCH)查找符合条件的邮件。
  5. 获取邮件: 使用 UID FETCHFETCH 命令获取邮件内容。
  6. 解析邮件: 使用 email 库解析邮件内容,提取主题、发件人、正文、附件等信息。
  7. 处理邮件: 根据你的需求处理邮件,例如下载附件、标记已读等。
  8. 关闭连接: 完成操作后,关闭与 IMAP 服务器的连接。

代码示例:

以下是一个简单的示例代码,演示如何连接到 Gmail 的 IMAP 服务器,搜索未读邮件,并打印邮件的主题和发件人:

import imaplib
import email
from email.header import decode_header

def check_email(username, password, imap_server="imap.gmail.com"):
    """
    监测并接收邮件

    Args:
        username: 邮箱用户名
        password: 邮箱密码 (或授权码)
        imap_server: IMAP 服务器地址 (默认为 Gmail)
    """

    # 1. 连接到 IMAP 服务器
    try:
        mail = imaplib.IMAP4_SSL(imap_server)
    except Exception as e:
        print(f"连接到 IMAP 服务器失败: {e}")
        return

    # 2. 登录邮箱账户
    try:
        mail.login(username, password)
    except Exception as e:
        print(f"登录失败: {e}")
        mail.close()
        return

    # 3. 选择邮箱文件夹 (例如:收件箱)
    mail.select("inbox")

    # 4. 搜索未读邮件 (可以根据需要修改搜索条件)
    status, data = mail.search(None, "UNSEEN")  # 搜索未读邮件
    if status != "OK":
        print("搜索邮件失败")
        mail.close()
        mail.logout()
        return

    mail_ids = data[0].split()

    # 5. 获取并解析邮件
    for mail_id in mail_ids:
        status, data = mail.fetch(mail_id, "(RFC822)")
        if status != "OK":
            print(f"获取邮件 {mail_id} 失败")
            continue

        raw_email = data[0][1]
        msg = email.message_from_bytes(raw_email)

        # 6. 解析邮件内容
        # 解码邮件主题
        subject, encoding = decode_header(msg["Subject"])[0]
        if isinstance(subject, bytes):
            subject = subject.decode(encoding or "utf-8")

        # 获取发件人
        from_ = msg.get("From")

        print(f"主题: {subject}")
        print(f"发件人: {from_}")

        # 7. 处理邮件 (例如:下载附件、标记已读等)
        # 这里可以添加你自己的邮件处理逻辑

        # 示例:将邮件标记为已读
        # mail.store(mail_id, "+FLAGS", "\\Seen")

    # 8. 关闭连接
    mail.close()
    mail.logout()

# 使用示例
username = "[email protected]"  # 替换为你的邮箱
password = "your_password"  # 替换为你的邮箱密码或授权码

check_email(username, password)

使用说明和注意事项:

  1. 替换占位符:[email protected]your_password 替换为你的邮箱地址和密码(或授权码)。
  2. 邮箱设置:
    • Gmail: 你可能需要启用 “安全性较低的应用访问” 或者生成一个 “应用专用密码”。(注意: 建议使用应用专用密码,安全性更高。) 你还需要在 Gmail 设置中启用 IMAP 访问。
    • 其他邮箱: 请参考你的邮箱提供商的帮助文档,了解如何获取 IMAP 服务器地址以及如何进行身份验证。
  3. 授权码: 对于一些邮箱(如 QQ 邮箱),你需要使用授权码而不是邮箱密码进行登录。
  4. 搜索条件: 代码中使用 UNSEEN 搜索未读邮件。你可以根据需要修改搜索条件,例如:
    • "ALL":所有邮件
    • "SEEN":已读邮件
    • "ANSWERED":已回复邮件
    • "FROM [email protected]":来自特定发件人的邮件
    • "SUBJECT '邮件主题'":包含特定主题的邮件
    • "SINCE 01-Jan-2023":指定日期之后的邮件
    • 可以组合多个条件,例如 "UNSEEN FROM [email protected]"
    • 更多搜索条件请参考 IMAP 协议文档 (RFC 3501)。
  5. 解析邮件内容: 代码中只解析了邮件主题和发件人。你可能还需要解析邮件正文、附件等信息。
  6. 下载附件: 解析邮件内容后,你可以遍历邮件的各个部分,找到附件部分并下载保存。
  7. 处理邮件: 你可以根据需要对邮件进行标记(如标记为已读、删除等)、移动到其他文件夹等操作。
  8. 错误处理: 代码中包含了基本的错误处理,但你还可以根据需要添加更详细的错误处理逻辑。
  9. 持续监测: 这个代码示例只会检查一次邮件。如果你需要持续监测新邮件,你需要使用循环和定时器(例如 time.sleep())定期执行检查。更高级的方法可以使用 IMAP 的 IDLE 命令,它可以让服务器在新邮件到达时通知客户端,而无需客户端不断轮询。
  10. IMAP IDLE: 使用 IDLE 命令可以实现实时监测新邮件,但需要服务器支持。一些邮箱可能不支持或者需要特别配置。

进阶:下载附件

如果你需要下载附件,可以在解析邮件内容后添加如下代码:

        # ... (解析邮件主题和发件人的代码) ...

        # 下载附件
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue

            filename = part.get_filename()
            if filename:
                filepath = os.path.join('./attachments', filename) # 将附件保存在当前目录的 attachments 文件夹下
                os.makedirs(os.path.dirname(filepath), exist_ok=True) # 如果文件夹不存在,创建文件夹
                with open(filepath, 'wb') as f:
                    f.write(part.get_payload(decode=True))
                print(f"附件已保存: {filepath}")

        # ... (处理邮件的代码) ...

这段代码会遍历邮件的每个部分,找到 Content-Disposition 不为空的部分(通常是附件),并将其保存到本地的 attachments 文件夹中。

如果是163邮箱呢
使用网易163邮箱检测收件,你需要使用 imaplib 库连接到163邮箱的 IMAP 服务器。以下是针对163邮箱修改后的代码示例,以及详细的配置说明:

import imaplib
import email
from email.header import decode_header
import os

def check_163_email(username, password):
    """
    使用 IMAP 检测并接收网易163邮箱的邮件

    Args:
        username: 163邮箱用户名 (例如:[email protected])
        password: 163邮箱密码 (或授权码)
    """

    # 1. 连接到 IMAP 服务器
    imap_server = "imap.163.com"
    imap_port = 993  # 使用 SSL 加密端口

    try:
        mail = imaplib.IMAP4_SSL(imap_server, imap_port)
    except Exception as e:
        print(f"连接到 IMAP 服务器失败: {e}")
        return

    # 2. 登录邮箱账户
    try:
        mail.login(username, password)
    except Exception as e:
        print(f"登录失败: {e}")
        mail.close()
        return

    # 3. 选择邮箱文件夹 (收件箱)
    mail.select("inbox")

    # 4. 搜索未读邮件
    status, data = mail.search(None, "UNSEEN")
    if status != "OK":
        print("搜索邮件失败")
        mail.close()
        mail.logout()
        return

    mail_ids = data[0].split()

    # 5. 获取并解析邮件
    for mail_id in mail_ids:
        status, data = mail.fetch(mail_id, "(RFC822)")
        if status != "OK":
            print(f"获取邮件 {mail_id} 失败")
            continue

        raw_email = data[0][1]
        msg = email.message_from_bytes(raw_email)

        # 6. 解析邮件内容
        subject, encoding = decode_header(msg["Subject"])[0]
        if isinstance(subject, bytes):
            subject = subject.decode(encoding or "utf-8")

        from_ = msg.get("From")

        print(f"主题: {subject}")
        print(f"发件人: {from_}")

        # 7. 下载附件
        for part in msg.walk():
            if part.get_content_maintype() == 'multipart':
                continue
            if part.get('Content-Disposition') is None:
                continue

            filename = part.get_filename()
            if filename:
                # 对文件名进行解码
                filename, encoding = decode_header(filename)[0]
                if isinstance(filename, bytes):
                    filename = filename.decode(encoding or "utf-8")

                filepath = os.path.join('./attachments', filename)
                os.makedirs(os.path.dirname(filepath), exist_ok=True)
                with open(filepath, 'wb') as f:
                    f.write(part.get_payload(decode=True))
                print(f"附件已保存: {filepath}")

        # 8. 处理邮件 (例如:标记已读)
        # mail.store(mail_id, "+FLAGS", "\\Seen")

    # 9. 关闭连接
    mail.close()
    mail.logout()

# 使用示例
username = "[email protected]"  # 替换为你的163邮箱用户名
password = "your_password_or_auth_code"  # 替换为你的163邮箱密码或授权码

check_163_email(username, password)

配置说明:

  1. imap_serverimap_port

    • imap_server: 设置为 "imap.163.com",这是网易163邮箱的 IMAP 服务器地址。
    • imap_port: 设置为 993,这是 IMAP 使用 SSL 加密连接的标准端口。
  2. username 你的163邮箱的完整地址,例如 [email protected]

  3. password

    • 强烈建议使用授权码: 出于安全考虑,建议你在163邮箱的网页设置中生成一个授权码,并使用授权码代替密码。
    • 如何获取授权码:
      1. 登录你的163邮箱网页版。
      2. 点击页面上方的“设置”选项。
      3. 在下拉菜单中选择“POP3/SMTP/IMAP”。
      4. 在页面中找到并开启“IMAP/SMTP服务”。
      5. 根据页面提示,设置客户端授权码。
  4. 附件下载: 代码中添加了解码附件文件名的部分,以处理中文文件名乱码问题。

重要提示:

  • 确保你的163邮箱已经开启了 IMAP 服务。
  • 出于安全考虑,强烈建议使用授权码而不是邮箱密码
  • 根据需要修改代码中的搜索条件、邮件处理逻辑等。

常见问题排查:

  • 登录失败:
    • 确保用户名和密码/授权码正确。
    • 确保已在163邮箱网页版中开启了 IMAP 服务。
    • 如果使用授权码,确保授权码是最新的且未过期。
  • 连接超时:
    • 检查你的网络连接是否正常。
    • 尝试禁用防火墙或代理,看是否能解决问题。

按照以上步骤和说明配置代码,你应该能够成功使用 Python 检测并接收你的163邮箱的邮件。记住,使用授权码登录更安全,并且根据你的实际需求修改代码中的邮件处理逻辑。

你可能感兴趣的:(python,github)