继续阅读完整内容
支持我们的网站,请点击查看下方广告
🔍 SMTP功能测试
方法1:使用telnet直接测试SMTP
#!/bin/bashecho "=== SMTP功能直接测试 ==="
echo "1. 首先检查SMTP端口状态:"sudo netstat -tlnp | grep :25
echo -e "\n2. 使用telnet测试SMTP协议(手动步骤):"cat << 'EOF'请手动执行以下telnet命令测试SMTP:
步骤1: telnet localhost 25步骤2: 依次输入以下命令(注意每行输入后按回车):EHLO localhostMAIL FROM: <test@localhost>;RCPT TO: <root>DATASubject: SMTP直接测试这是一封通过SMTP协议直接发送的测试邮件。.QUIT
如果看到"250 OK"等响应,说明SMTP工作正常。EOF
# 自动测试版本echo -e "\n3. 自动SMTP测试..."cat > /tmp/smtp_test.txt << 'EOF'EHLO localhostMAIL FROM:<test@localhost>;RCPT TO:<root>DATASubject: 自动SMTP测试From: smtp-test@localhost
/>Date: $(date)
这是通过自动化脚本测试SMTP协议发送的邮件。如果收到此邮件,说明SMTP服务完全正常。.QUITEOF
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; thenecho "✅ SMTP协议响应正常"elseecho "❌ SMTP协议可能有问题"fi
echo -e "\n5. 检查邮件日志:"sudo tail -5 /var/log/mail.log
方法2:使用专业工具测试SMTP
#!/bin/bashecho "=== 使用专业工具测试SMTP ==="
# 安装邮件测试工具echo "1. 安装邮件测试工具..."sudo apt-get updatesudo apt-get install -y swaks msmtp telnet 2>/dev/null
echo -e "\n2. 使用swaks测试SMTP:"if command -v swaks >/dev/null; thenecho "使用swaks发送测试邮件..."swaks --to root --from test@localhost --server localhost --port 25 --h-Subject "swaks SMTP测试" --body "swaks工具测试SMTP功能" 2>&1 | tee /tmp/swaks_test.logif grep -q "250" /tmp/swaks_test.log; thenecho "✅ swaks测试成功"elseecho "❌ swaks测试失败"fielseecho "swaks未安装,跳过测试"fi
echo -e "\n3. 测试外部SMTP连接:"echo "测试连接到公共SMTP服务器..."timeout 5 telnet smtp.gmail.com 587 2>&1 | head -5if [ $? -eq 0 ]; thenecho "✅ 可以连接到外部SMTP服务器"elseecho "⚠️ 无法连接到外部SMTP服务器,可能是网络问题"fi
echo -e "\n4. 测试邮件发送和接收完整流程:"echo "发送端测试..."echo "SMTP测试邮件 $(date)" | mail -s "SMTP端到端测试" root
sleep 2
echo "接收端测试..."echo "检查是否收到邮件..."if [ -f /var/mail/root ]; thenecho "最近收到的邮件:"grep -A2 "Subject.*SMTP" /var/mail/root | tail -10elseecho "未找到邮件文件"fi
方法3:PHP SMTP测试
#!/bin/bashecho "=== PHP SMTP功能测试 ==="
# 创建PHP SMTP测试脚本cat > /tmp/test_smtp_php.php << 'PHP'<?phpecho "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:<
RCPT TO:<
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/bashecho "=== 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/bashecho "=== 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 :25echo -e "\n"
echo "2. SMTP协议测试"echo "--------------"echo "测试连接..."timeout 3 telnet localhost 25 <<< "QUIT" 2>&1 | grep -i "220\|connected" | head -1echo -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" rootsleep 2
echo "检查邮件日志..."tail -5 /var/log/mail.log | grep -i "$TEST_MAIL_ID\|sent\|delivered" | tail -2echo -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 -1echo -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.txtecho "RCPT TO:<test@gmail.com>;" >> /tmp/relay.txtecho "QUIT" >> /tmp/relay.txttimeout 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}; doecho "性能测试 $i" | mail -s "性能测试 $i" root 2>/dev/null &donewaitEND_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 :25sudo lsof -i :25
# 6. 测试外部连接(需要网络)telnet smtp.gmail.com 587
# 7. 队列状态mailq
# 8. 检查收到的邮件mail -u root# 或cat /var/mail/root