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()
关键点说明:
- 使用
imaplib.IMAP4_SSL建立SSL连接,163企业邮箱IMAP服务器是imap.qiye.163.com - 通过UID跟踪已处理邮件,避免重复获取
- 循环检查新邮件,间隔时间可调整
- 使用
decode_header正确处理邮件主题编码
注意替换your_email@yourcompany.com和your_password为实际邮箱凭证。如果需要解析邮件正文,可以添加对msg.walk()的处理来获取text/html或text/plain部分。
用UID而不是邮件序号来跟踪进度更可靠。
请问可以贴下廖雪峰的代码的链接吗?

