#!/usr/bin/env python # -*- coding: utf-8 -*- """ 测试IMAP邮件获取功能 单独测试邮箱取件功能 """ import imaplib import email import email.header import sys from email.parser import BytesParser from email.policy import default import re import time from urllib.parse import urlparse, parse_qs # 邮箱配置 EMAIL_ADDRESS = "5ulxb79e@evnmail.com" EMAIL_PASSWORD = "dr!mueh15ahG" IMAP_SERVER = "mail.evnmail.com" USE_SSL = True def decode_mime_words(text): """解码MIME编码的文本""" if not text: return "" try: decoded = email.header.decode_header(text) return " ".join([ (str(t[0], t[1] or 'utf-8') if isinstance(t[0], bytes) else str(t[0])) for t in decoded ]) except: return text def get_body_text(msg): """获取邮件正文文本内容""" if msg.is_multipart(): # 如果邮件包含多个部分,递归处理 text_parts = [] for part in msg.get_payload(): if part.get_content_type() == 'text/plain': charset = part.get_content_charset() or 'utf-8' try: text_parts.append(part.get_payload(decode=True).decode(charset)) except: text_parts.append("[无法解码的内容]") elif part.is_multipart(): # 递归处理多部分 text_parts.append(get_body_text(part)) return "\n".join(text_parts) else: # 单部分邮件 content_type = msg.get_content_type() if content_type == 'text/plain': charset = msg.get_content_charset() or 'utf-8' try: return msg.get_payload(decode=True).decode(charset) except: return "[无法解码的内容]" else: return f"[内容类型: {content_type}]" def extract_urls_from_body(body, pattern): """从邮件正文中提取URL""" found_urls = re.findall(pattern, body) return [url.replace('&', '&').replace("=3D", "=").replace("=\r\n", "") .replace("\r\n", "").replace("=\n", "").replace("\n", "") for url in found_urls] def test_imap_connection(): """测试IMAP连接""" print(f"正在测试连接到 {IMAP_SERVER}...") try: # 连接到IMAP服务器 if USE_SSL: mail = imaplib.IMAP4_SSL(IMAP_SERVER) else: mail = imaplib.IMAP4(IMAP_SERVER) # 登录 print(f"正在登录邮箱 {EMAIL_ADDRESS}...") mail.login(EMAIL_ADDRESS, EMAIL_PASSWORD) print("登录成功!") # 关闭连接 mail.logout() return True except Exception as e: print(f"连接失败: {str(e)}") return False def fetch_emails(): """获取邮件""" urls = [] try: # 连接到IMAP服务器 if USE_SSL: mail = imaplib.IMAP4_SSL(IMAP_SERVER) else: mail = imaplib.IMAP4(IMAP_SERVER) # 登录 print(f"正在登录邮箱 {EMAIL_ADDRESS}...") mail.login(EMAIL_ADDRESS, EMAIL_PASSWORD) print("登录成功!") # 只检查INBOX文件夹 steam_verification_pattern = r'https://store\.steampowered\.com/account/newaccountverification\?[^\s"\'<>]+' try: print("\n检查文件夹: INBOX") mail.select("INBOX") status, messages = mail.search(None, "ALL") if status != "OK" or not messages[0]: print(" INBOX为空或无法访问") else: # 获取邮件ID列表,从最新的开始 message_ids = messages[0].split() message_count = len(message_ids) print(f" 找到 {message_count} 封邮件") # 最多检查10封最新邮件 check_count = min(10, message_count) message_ids = message_ids[-check_count:] message_ids.reverse() # 最新的邮件放在前面 for i, msg_id in enumerate(message_ids): print(f"\n 正在检查邮件 {i+1}/{check_count}, ID: {msg_id.decode()}...") status, msg_data = mail.fetch(msg_id, "(RFC822)") if status != "OK": print(" 无法获取邮件内容") continue # 解析邮件内容 raw_email = msg_data[0][1] msg = email.message_from_bytes(raw_email, policy=default) # 提取信息 subject = decode_mime_words(msg["Subject"]) from_addr = decode_mime_words(msg["From"]) date = decode_mime_words(msg["Date"]) print(f" 主题: {subject}") print(f" 发件人: {from_addr}") print(f" 日期: {date}") # 获取正文 body = get_body_text(msg) body_preview = body[:100] + "..." if len(body) > 100 else body print(f" 正文预览: {body_preview}") # 查找Steam验证链接 found_urls = extract_urls_from_body(body, steam_verification_pattern) if found_urls: print(f" 发现 {len(found_urls)} 个可能的Steam验证链接:") for url in found_urls: print(f" {url[:80]}...") urls.append(url) else: print(" 未发现Steam验证链接") except Exception as e: print(f"处理INBOX出错: {str(e)}") # 尝试关闭连接 try: mail.close() except: pass mail.logout() except Exception as e: print(f"IMAP连接错误: {str(e)}") return urls def main(): print("=" * 60) print("IMAP邮件获取测试") print("=" * 60) # 测试连接 if not test_imap_connection(): print("IMAP连接测试失败,程序退出") return 1 print("\n开始获取邮件...") urls = fetch_emails() if urls: print("\n" + "=" * 60) print(f"共找到 {len(urls)} 个可能的Steam验证链接:") for i, url in enumerate(urls): print(f"{i+1}. {url}") else: print("\n没有找到任何Steam验证链接") return 0 if __name__ == "__main__": sys.exit(main())