#!/bin/bash

# ==========================================
# 邮箱 SMTP 连通性测试脚本
# 功能：测试本机到各大主流邮箱 SMTP 端口的连通性
# 依赖：nc (netcat)
# ==========================================

# 定义颜色，用于美化输出
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
BOLD='\033[1m'

# 定义要测试的邮箱列表
# 格式： "服务商名称:SMTP地址:端口"
# 注意：云服务器常屏蔽25端口，建议优先测试465(SSL)或587(TLS)
TARGETS=(
    "Google (Gmail):smtp.gmail.com:465"
    "Microsoft (Outlook):smtp.office365.com:587"
    "Tencent (QQ):smtp.qq.com:465"
    "Tencent (Exmail):smtp.exmail.qq.com:465"
    "NetEase (163):smtp.163.com:465"
    "NetEase (126):smtp.126.com:465"
    "Sina Mail:smtp.sina.com:465"
    "Aliyun Mail:smtp.mxhichina.com:465"
    "Yahoo Mail:smtp.mail.yahoo.com:465"
    "iCloud Mail:smtp.mail.me.com:587"
)

# 检查 nc 是否安装
check_dependency() {
    if ! command -v nc &> /dev/null; then
        echo -e "${RED}错误: 未找到 'nc' (netcat) 命令。${NC}"
        echo "请使用以下命令安装:"
        echo "  CentOS/RHEL: sudo yum install nc -y"
        echo "  Ubuntu/Debian: sudo apt-get install netcat -y"
        exit 1
    fi
}

# 测试函数
test_connectivity() {
    local provider=$1
    local host=$2
    local port=$3
    
    # 打印正在测试的信息（保持对齐）
    printf "测试 %-20s -> %-25s (端口 %-3s): " "$provider" "$host" "$port"

    # 使用 nc -z (扫描模式) -w 2 (超时2秒) 进行测试
    if nc -z -w 2 "$host" "$port" 2>/dev/null; then
        echo -e "[ ${GREEN}成功/Connected${NC} ]"
    else
        echo -e "[ ${RED}失败/Failed${NC} ]"
    fi
}

# 主程序开始
clear
echo -e "${BOLD}=== SMTP 连通性一键测试工具 ===${NC}"
echo -e "当前时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo -e "--------------------------------------------------------"

check_dependency

# 循环读取数组并测试
for target in "${TARGETS[@]}"; do
    # 使用 IFS 切割字符串
    IFS=':' read -r provider host port <<< "$target"
    test_connectivity "$provider" "$host" "$port"
done

echo -e "--------------------------------------------------------"
echo -e "${BOLD}测试完成。${NC}"
echo -e "提示：如果大部分显示失败，请检查服务器防火墙的出站规则(Outbound Rules)。"