Python中如何实时接收163企业邮箱的邮件?

现在想使用 python 实时收取 163 企业邮箱,怎么搞? 参考了廖雪峰的代码,可以实时接收 yeah.net 的网易邮件,就是企业邮箱搞定不了


Python中如何实时接收163企业邮箱的邮件?
2 回复

要实时接收163企业邮箱邮件,可以用imaplib配合IDLE命令。下面这个示例会持续监听新邮件:

import imaplib
import email
from email.header import decode_header
import time

def connect_email():
    """连接邮箱服务器"""
    imap_server = "imap.qiye.163.com"
    username = "your_email@yourcompany.com"
    password = "your_password"
    
    mail = imaplib.IMAP4_SSL(imap_server)
    mail.login(username, password)
    mail.select("INBOX")
    return mail

def fetch_new_emails(mail, last_uid):
    """获取新邮件"""
    mail.select("INBOX")
    
    # 搜索比last_uid更大的邮件
    result, data = mail.uid('search', None, f'UID {last_uid}:*')
    if result != 'OK':
        return last_uid, []
    
    email_uids = data[0].split()
    new_emails = []
    
    for email_uid in email_uids:
        if int(email_uid) > last_uid:
            result, msg_data = mail.uid('fetch', email_uid, '(RFC822)')
            if result == 'OK':
                raw_email = msg_data[0][1]
                msg = email.message_from_bytes(raw_email)
                
                # 解码主题
                subject, encoding = decode_header(msg["Subject"])[0]
                if isinstance(subject, bytes):
                    subject = subject.decode(encoding if encoding else 'utf-8')
                
                # 获取发件人
                from_ = msg.get("From")
                
                new_emails.append({
                    'uid': int(email_uid),
                    'subject': subject,
                    'from': from_,
                    'date': msg.get("Date")
                })
    
    # 更新最后处理的UID
    if email_uids:
        last_uid = max(last_uid, max(int(uid) for uid in email_uids))
    
    return last_uid, new_emails

def main():
    mail = connect_email()
    last_uid = 0
    
    try:
        while True:
            last_uid, new_emails = fetch_new_emails(mail, last_uid)
            
            for email_info in new_emails:
                print(f"新邮件: {email_info['subject']}")
                print(f"发件人: {email_info['from']}")
                print(f"时间: {email_info['date']}")
                print("-" * 50)
            
            time.sleep(10)  # 每10秒检查一次
            
    except KeyboardInterrupt:
        print("\n停止监听")
    finally:
        mail.logout()

if __name__ == "__main__":
    main()

关键点说明:

  1. 使用imaplib.IMAP4_SSL建立SSL连接,163企业邮箱IMAP服务器是imap.qiye.163.com
  2. 通过UID跟踪已处理邮件,避免重复获取
  3. 循环检查新邮件,间隔时间可调整
  4. 使用decode_header正确处理邮件主题编码

注意替换your_email@yourcompany.comyour_password为实际邮箱凭证。如果需要解析邮件正文,可以添加对msg.walk()的处理来获取text/html或text/plain部分。

用UID而不是邮件序号来跟踪进度更可靠。


请问可以贴下廖雪峰的代码的链接吗?

回到顶部