#!/usr/bin/env python # -*- coding: utf-8 -*- """ SMTP服务器测试脚本 用于验证邮件系统的发送和接收功能 """ import smtplib import argparse import socket import time import sys import json import random import string import requests from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from datetime import datetime # ANSI颜色代码 class Colors: GREEN = '\033[92m' YELLOW = '\033[93m' RED = '\033[91m' BLUE = '\033[94m' BOLD = '\033[1m' ENDC = '\033[0m' def generate_random_string(length=8): """生成随机字符串""" return ''.join(random.choices(string.ascii_letters + string.digits, k=length)) def print_step(step, message): """打印测试步骤""" print(f"\n{Colors.BLUE}{Colors.BOLD}[步骤 {step}]{Colors.ENDC} {message}") def print_success(message): """打印成功消息""" print(f"{Colors.GREEN}✓ {message}{Colors.ENDC}") def print_warning(message): """打印警告消息""" print(f"{Colors.YELLOW}⚠ {message}{Colors.ENDC}") def print_error(message): """打印错误消息""" print(f"{Colors.RED}✗ {message}{Colors.ENDC}") def check_smtp_connection(host, port, timeout=5): """检查SMTP服务器连接""" print_step(1, f"检查SMTP服务器连接 ({host}:{port})") try: # 尝试创建TCP连接 sock = socket.create_connection((host, port), timeout) banner = sock.recv(1024).decode('utf-8', errors='ignore') sock.close() if banner and banner.startswith('2'): print_success(f"SMTP服务器连接成功,服务器响应: {banner.strip()}") return True else: print_warning(f"SMTP服务器连接成功,但响应不标准: {banner.strip()}") return True except socket.timeout: print_error(f"连接超时,请检查SMTP服务器是否运行在 {host}:{port}") return False except ConnectionRefusedError: print_error(f"连接被拒绝,请检查SMTP服务器是否运行在 {host}:{port}") return False except Exception as e: print_error(f"连接失败: {str(e)}") return False def check_smtp_handshake(host, port): """测试SMTP握手过程""" print_step(2, "测试SMTP协议握手") try: # 创建SMTP连接并打印通信过程 smtp = smtplib.SMTP(host, port, timeout=10) smtp.set_debuglevel(1) # 打开调试模式 # 发送EHLO命令 _, ehlo_response = smtp.ehlo() ehlo_success = all(code == 250 for code, _ in ehlo_response) if ehlo_success: print_success("SMTP握手成功,服务器支持的功能:") for code, feature in ehlo_response: print(f" {feature.decode('utf-8')}") else: print_warning("SMTP握手部分成功,可能有功能受限") smtp.quit() return ehlo_success except Exception as e: print_error(f"SMTP握手失败: {str(e)}") return False def check_api_status(api_base_url): """检查API服务器状态""" print_step(3, f"检查API服务器状态 ({api_base_url})") try: response = requests.get(f"{api_base_url}/status", timeout=5) response.raise_for_status() data = response.json() print_success("API服务器状态正常") print(f" 状态信息: {json.dumps(data, indent=2)}") return True except requests.exceptions.RequestException as e: print_error(f"API服务器连接失败: {str(e)}") return False def get_test_mailbox(api_base_url): """获取或创建测试邮箱""" print_step(4, "获取测试邮箱") try: # 获取所有域名 response = requests.get(f"{api_base_url}/domains") response.raise_for_status() domains = response.json().get("domains", []) if not domains: print_error("没有可用的域名,请先创建域名") return None # 获取第一个域名 domain = domains[0] domain_id = domain.get("id") domain_name = domain.get("name") print_success(f"使用域名: {domain_name} (ID: {domain_id})") # 生成随机地址前缀 address_prefix = f"test-{generate_random_string(6)}" # 创建新邮箱 mailbox_data = { "domain_id": domain_id, "address": address_prefix } response = requests.post(f"{api_base_url}/mailboxes", json=mailbox_data) response.raise_for_status() mailbox = response.json().get("mailbox", {}) mailbox_id = mailbox.get("id") full_address = mailbox.get("full_address") if not mailbox_id or not full_address: print_error("创建邮箱失败,使用现有邮箱") # 尝试获取现有邮箱 response = requests.get(f"{api_base_url}/mailboxes") response.raise_for_status() mailboxes = response.json().get("mailboxes", []) if not mailboxes: print_error("没有可用的邮箱") return None mailbox = mailboxes[0] mailbox_id = mailbox.get("id") full_address = mailbox.get("full_address") print_success(f"使用邮箱: {full_address} (ID: {mailbox_id})") return {"id": mailbox_id, "address": full_address} except Exception as e: print_error(f"获取邮箱失败: {str(e)}") return None def send_test_email(smtp_host, smtp_port, recipient, verbose=False): """发送测试邮件""" print_step(5, f"发送测试邮件到 {recipient}") # 生成随机验证码 verification_code = ''.join(random.choices(string.digits, k=6)) # 生成随机主题标识 subject_id = generate_random_string(8) try: # 创建邮件 msg = MIMEMultipart() msg['From'] = 'test@example.com' msg['To'] = recipient msg['Subject'] = f'测试邮件 {subject_id} - 验证码 {verification_code}' # 添加HTML内容 html_content = f"""
您好!
这是一封测试邮件,用于验证邮箱系统的功能。
您的验证码是:
此测试邮件发送时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
测试ID: {subject_id}
请不要回复此邮件。