如何用Python3获取Gmail未读邮件?已掌握smtplib发信方法
接收邮件的实现方法
首先明确:smtplib库只负责发送邮件,没有接收邮件的相关方法(包括不存在你说的connection.getmail这类接口)。要接收邮件,得用Python内置的imaplib库(基于IMAP协议),下面是具体的实现示例:
用imaplib接收邮件的示例代码(以Gmail为例)
注意:Gmail需要先在账号设置里开启IMAP服务;如果开启了两步验证,得用应用专用密码登录,不能直接用原账号密码。普通邮箱一般直接用原密码即可。
import imaplib import email from email.header import decode_header # 配置信息 email_addr = 'me@gmail.com' email_passwd = '你的应用专用密码' # Gmail需用应用密码,普通邮箱填原密码 imap_server = 'imap.gmail.com' imap_port = 993 # 连接IMAP服务器 conn = imaplib.IMAP4_SSL(imap_server, imap_port) conn.login(email_addr, email_passwd) # 选择收件箱(这里选默认的INBOX) conn.select('INBOX') # 搜索未读邮件,换成'ALL'可以搜索所有邮件 status, msg_ids = conn.search(None, 'UNSEEN') email_ids = msg_ids[0].split() # 遍历并解析邮件 for id in email_ids: # 获取邮件的原始内容 status, msg_data = conn.fetch(id, '(RFC822)') for part in msg_data: if isinstance(part, tuple): msg = email.message_from_bytes(part[1]) # 解码邮件主题 subject, encoding = decode_header(msg['Subject'])[0] if isinstance(subject, bytes): subject = subject.decode(encoding) # 获取发件人信息 sender = msg.get('From') print(f"主题: {subject}") print(f"发件人: {sender}") # 处理邮件正文 if msg.is_multipart(): # 多部分邮件(带附件或富文本),只提取纯文本内容 for sub_part in msg.walk(): content_type = sub_part.get_content_type() disp = str(sub_part.get('Content-Disposition')) try: body = sub_part.get_payload(decode=True).decode() except: continue if content_type == 'text/plain' and 'attachment' not in disp: print(f"正文: {body}") else: # 纯文本邮件直接提取正文 body = msg.get_payload(decode=True).decode() print(f"正文: {body}") print("---分割线---") # 关闭连接 conn.close() conn.logout()
重要提示
- 不同邮箱的IMAP服务器地址和端口可能不同,比如QQ邮箱的IMAP服务器是
imap.qq.com,端口同样为993。 - 接收邮件的逻辑比发送复杂,因为要处理邮件的编码、多部分内容(比如附件、HTML正文)等,所以没有像
sendmail那样极简的接口,必须走“连接服务器→选择邮箱→搜索邮件→获取内容→解析内容”这一套流程。
内容的提问来源于stack exchange,提问作者pico
相关产品推荐
相关产品推荐

