Files
steamreg/test_imap.py

203 lines
6.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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())