🔍 SMTP功能测试

 

方法1:使用telnet直接测试SMTP

#!/bin/bash
echo "=== SMTP功能直接测试 ==="

echo "1. 首先检查SMTP端口状态:"
sudo netstat -tlnp | grep :25

echo -e "\n2. 使用telnet测试SMTP协议(手动步骤):"
cat << 'EOF'
请手动执行以下telnet命令测试SMTP:

步骤1: telnet localhost 25
步骤2: 依次输入以下命令(注意每行输入后按回车):
EHLO localhost
MAIL FROM: <test@localhost>;
RCPT TO: <root>
DATA
Subject: SMTP直接测试
这是一封通过SMTP协议直接发送的测试邮件。
.
QUIT

如果看到"250 OK"等响应,说明SMTP工作正常。
EOF

# 自动测试版本
echo -e "\n3. 自动SMTP测试..."
cat > /tmp/smtp_test.txt << 'EOF'
EHLO localhost
MAIL FROM:<test@localhost>;
RCPT TO:<root>
DATA
Subject: 自动SMTP测试
From: smtp-test@localhost />Date: $(date)

这是通过自动化脚本测试SMTP协议发送的邮件。
如果收到此邮件,说明SMTP服务完全正常。
.
QUIT
EOF

echo "正在发送SMTP测试命令..."
timeout 10 telnet localhost 25 < /tmp/smtp_test.txt 2>&1 | tee /tmp/smtp_result.txt

echo -e "\n4. 检查测试结果:"
if grep -q "250.*OK" /tmp/smtp_result.txt; then
echo "✅ SMTP协议响应正常"
else
echo "❌ SMTP协议可能有问题"
fi

echo -e "\n5. 检查邮件日志:"
sudo tail -5 /var/log/mail.log

方法2:使用专业工具测试SMTP

#!/bin/bash
echo "=== 使用专业工具测试SMTP ==="

# 安装邮件测试工具
echo "1. 安装邮件测试工具..."
sudo apt-get update
sudo apt-get install -y swaks msmtp telnet 2>/dev/null

echo -e "\n2. 使用swaks测试SMTP:"
if command -v swaks >/dev/null; then
echo "使用swaks发送测试邮件..."
swaks --to root --from test@localhost --server localhost --port 25 --h-Subject "swaks SMTP测试" --body "swaks工具测试SMTP功能" 2>&1 | tee /tmp/swaks_test.log

if grep -q "250" /tmp/swaks_test.log; then
echo "✅ swaks测试成功"
else
echo "❌ swaks测试失败"
fi
else
echo "swaks未安装,跳过测试"
fi

echo -e "\n3. 测试外部SMTP连接:"
echo "测试连接到公共SMTP服务器..."
timeout 5 telnet smtp.gmail.com 587 2>&1 | head -5
if [ $? -eq 0 ]; then
echo "✅ 可以连接到外部SMTP服务器"
else
echo "⚠️ 无法连接到外部SMTP服务器,可能是网络问题"
fi

echo -e "\n4. 测试邮件发送和接收完整流程:"
echo "发送端测试..."
echo "SMTP测试邮件 $(date)" | mail -s "SMTP端到端测试" root

sleep 2

echo "接收端测试..."
echo "检查是否收到邮件..."
if [ -f /var/mail/root ]; then
echo "最近收到的邮件:"
grep -A2 "Subject.*SMTP" /var/mail/root | tail -10
else
echo "未找到邮件文件"
fi

方法3:PHP SMTP测试

#!/bin/bash
echo "=== PHP SMTP功能测试 ==="

# 创建PHP SMTP测试脚本
cat > /tmp/test_smtp_php.php << 'PHP'
<?php
echo "PHP SMTP功能测试\n";
echo "================\n\n";

// 测试1:使用PHP的mail()函数(使用sendmail)
echo "测试1:mail()函数测试\n";
$test1 = mail('root', 'PHP mail() 测试', '测试内容', 'From: php-test@localhost');
echo "结果: " . ($test1 ? "✅ 成功" : "❌ 失败") . "\n\n";

// 测试2:使用SMTP协议直接发送(需要socket支持)
echo "测试2:直接SMTP协议测试\n";
function testSMTP($host = 'localhost', $port = 25) {
$smtp = fsockopen($host, $port, $errno, $errstr, 10);
if (!$smtp) {
return "❌ 连接失败: $errstr ($errno)";
}

$response = fgets($smtp, 512);
if (strpos($response, '220') === 0) {
fwrite($smtp, "QUIT\r\n");
fclose($smtp);
return "✅ 连接成功: $response";
} else {
fclose($smtp);
return "❌ 响应异常: $response";
}
}

echo "SMTP连接测试: " . testSMTP() . "\n\n";

// 测试3:检查PHP配置
echo "测试3:PHP邮件配置检查\n";
echo "sendmail_path: " . ini_get('sendmail_path') . "\n";
echo "SMTP: " . ini_get('SMTP') . "\n";
echo "smtp_port: " . ini_get('smtp_port') . "\n";

// 测试4:使用PHPMailer风格测试
echo "\n测试4:完整邮件发送流程\n";
$to = "root";
$subject = "完整SMTP测试";
$message = "如果收到此邮件,说明:\n1. PHP mail()函数工作\n2. sendmail配置正确\n3. Postfix SMTP服务正常";
$headers = "From: smtp-test@localhost\r\n";
$headers .= "Content-Type: text/plain; charset=UTF-8\r\n";

$test4 = mail($to, $subject, $message, $headers);
echo "完整流程结果: " . ($test4 ? "✅ 成功" : "❌ 失败") . "\n";
?>
PHP

echo "运行PHP SMTP测试..."
php /tmp/test_smtp_php.php

方法4:端口和连接深度测试

#!/bin/bash
echo "=== SMTP深度测试 ==="

echo "1. 测试不同连接方式:"
echo "a) IPv4连接测试:"
timeout 3 telnet 127.0.0.1 25 2>&1 | head -2

echo -e "\nb) IPv6连接测试:"
timeout 3 telnet ::1 25 2>&1 | head -2

echo -e "\nc) 本地主机名连接测试:"
timeout 3 telnet localhost 25 2>&1 | head -2

echo -e "\n2. 测试SMTP扩展命令:"
cat > /tmp/smtp_ehlo.txt << 'EOF'
EHLO localhost
QUIT
EOF

echo "测试EHLO命令响应:"
timeout 3 telnet localhost 25 < /tmp/smtp_ehlo.txt 2>&1 | grep -A10 "250-"

echo -e "\n3. 测试邮件中继(应该被拒绝):"
cat > /tmp/smtp_relay_test.txt << 'EOF'
EHLO localhost
MAIL FROM:<该 Email 地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。>;
RCPT TO:<该 Email 地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。>;
QUIT
EOF

echo "测试外部域中继(应该被拒绝):"
timeout 3 telnet localhost 25 < /tmp/smtp_relay_test.txt 2>&1 | grep -i "550\|reject"

echo -e "\n4. 测试认证机制:"
echo "列出支持的认证方式:"
timeout 3 telnet localhost 25 <<< "EHLO localhost" 2>&1 | grep -i auth

echo -e "\n5. 压力测试(快速发送多封邮件):"
echo "发送5封测试邮件..."
for i in {1..5}; do
echo "压力测试邮件 $i" | mail -s "压力测试 $i" root &
done
wait

echo "检查队列状态:"
mailq | grep -c "Request" | xargs echo "当前队列中的邮件数量:"

sleep 3
echo "检查发送结果:"
grep -c "Subject.*压力测试" /var/mail/root 2>/dev/null | xargs echo "成功收到的邮件数量:"

方法5:Web应用SMTP测试(模拟真实场景)

#!/bin/bash
echo "=== Web应用SMTP测试 ==="

# 模拟WordPress发送邮件
cat > /tmp/wp_mail_test.php << 'PHP'
<?php
// 模拟WordPress的wp_mail函数
function wp_mail($to, $subject, $message, $headers = '', $attachments = array()) {
$subject = "[WP测试] " . $subject;

if (empty($headers)) {
$headers = "From: wordpress@localhost\r\n";
}

return mail($to, $subject, $message, $headers);
}

echo "测试WordPress样式邮件发送...\n";

// 测试不同类型的邮件
$tests = [
[
'to' => 'root',
'subject' => '新用户注册',
'message' => '有新用户在您的网站注册。',
'type' => '通知邮件'
],
[
'to' => 'root',
'subject' => '密码重置请求',
'message' => '用户请求重置密码。',
'type' => '重置邮件'
],
[
'to' => 'root',
'subject' => '评论通知',
'message' => "有人在您的文章发表评论。\n\n评论内容:测试评论",
'type' => '评论邮件'
]
];

foreach ($tests as $test) {
echo "\n发送{$test['type']}...";
$result = wp_mail($test['to'], $test['subject'], $test['message']);
echo $result ? "✅ 成功" : "❌ 失败";
sleep(1);
}

echo "\n\n所有测试完成!";
?>
PHP

echo "运行Web应用邮件测试..."
php /tmp/wp_mail_test.php

echo -e "\n等待邮件处理..."
sleep 5

echo -e "\n检查Web应用测试邮件:"
grep -B2 -A3 "\\[WP测试\\]" /var/mail/root 2>/dev/null || echo "未找到Web应用测试邮件"

📋 SMTP综合测试报告生成

#!/bin/bash
echo "=== SMTP综合测试报告 ==="
echo "生成时间: $(date)"
echo "========================"

# 收集测试数据
REPORT_FILE="/tmp/smtp_test_report_$(date +%Y%m%d_%H%M%S).txt"

{
echo "SMTP测试报告"
echo "============"
echo "测试时间: $(date)"
echo "主机名: $(hostname)"
echo -e "\n"

echo "1. 基础服务状态"
echo "--------------"
echo "Postfix状态: $(systemctl is-active postfix 2>/dev/null || echo '未知')"
echo "监听端口:"
netstat -tlnp | grep :25
echo -e "\n"

echo "2. SMTP协议测试"
echo "--------------"
echo "测试连接..."
timeout 3 telnet localhost 25 <<< "QUIT" 2>&1 | grep -i "220\|connected" | head -1
echo -e "\n"

echo "3. 邮件发送测试"
echo "--------------"
TEST_MAIL_ID="test_$(date +%s)"
echo "发送测试邮件 ID: $TEST_MAIL_ID"
echo "测试邮件 $TEST_MAIL_ID" | mail -s "SMTP测试报告验证 $TEST_MAIL_ID" root
sleep 2

echo "检查邮件日志..."
tail -5 /var/log/mail.log | grep -i "$TEST_MAIL_ID\|sent\|delivered" | tail -2
echo -e "\n"

echo "4. PHP邮件功能"
echo "-------------"
php -r "\$result = mail('root', 'PHP SMTP报告测试', '测试内容'); echo 'PHP mail()函数: ' . (\$result ? '✅ 正常' : '❌ 异常');"
echo -e "\n"

echo "5. 网络连接测试"
echo "-------------"
echo "本地回环测试:"
ping -c 2 127.0.0.1 2>&1 | grep -i "packet loss\|time"
echo "外部SMTP可达性:"
timeout 3 telnet smtp.gmail.com 587 2>&1 | grep -i "connected\|refused" | head -1
echo -e "\n"

echo "6. 安全配置检查"
echo "-------------"
echo "开放中继检查(应该显示拒绝):"
echo "QUIT" | timeout 3 telnet localhost 25 2>&1 | grep -i "220" >/dev/null && {
echo "MAIL FROM:<external@test.com>;" > /tmp/relay.txt
echo "RCPT TO:<test@gmail.com>;" >> /tmp/relay.txt
echo "QUIT" >> /tmp/relay.txt
timeout 3 telnet localhost 25 < /tmp/relay.txt 2>&1 | grep -i "550\|reject\|relay" | head -1
}
echo -e "\n"

echo "7. 性能测试"
echo "---------"
echo "发送10封快速邮件..."
START_TIME=$(date +%s.%N)
for i in {1..10}; do
echo "性能测试 $i" | mail -s "性能测试 $i" root 2>/dev/null &
done
wait
END_TIME=$(date +%s.%N)
ELAPSED=$(echo "$END_TIME - $START_TIME" | bc)
echo "发送10封邮件耗时: ${ELAPSED}秒"
echo -e "\n"

echo "总结"
echo "----"
echo "✅ SMTP服务基本功能正常"
echo "✅ 本地邮件收发正常"
echo "✅ PHP邮件功能正常"
echo "⚠️ 如需外部SMTP,请配置认证"
echo "📧 邮件日志: /var/log/mail.log"
echo "📁 用户邮箱: /var/mail/用户名"

} | tee "$REPORT_FILE"

echo -e "\n报告已保存到: $REPORT_FILE"
echo "查看完整报告: cat $REPORT_FILE"

🎯 关键SMTP测试命令总结:

# 1. 基本连接测试
telnet localhost 25
# 输入:EHLO localhost
# 输入:QUIT

# 2. 实际发送测试
echo "测试" | mail -s "测试主题" root

# 3. 查看SMTP日志
sudo tail -f /var/log/mail.log

# 4. 测试PHP邮件
php -r "mail('root', '测试', '内容', 'From: test@localhost');"

# 5. 测试端口占用
sudo netstat -tlnp | grep :25
sudo lsof -i :25

# 6. 测试外部连接(需要网络)
telnet smtp.gmail.com 587

# 7. 队列状态
mailq

# 8. 检查收到的邮件
mail -u root
# 或
cat /var/mail/root

 

 

 


登陆