<?php
/**
 * SMTP邮件配置
 * 配置WordPress使用SMTP发送邮件
 */

// 防止直接访问
if (!defined('ABSPATH')) {
    exit;
}

/**
 * 配置WordPress使用SMTP发送邮件
 */
function nenghui_configure_smtp($phpmailer) {
    $smtp_host = get_option('nenghui_smtp_host');
    $smtp_port = get_option('nenghui_smtp_port', '587');
    $smtp_username = get_option('nenghui_smtp_username');
    $smtp_password = get_option('nenghui_smtp_password');
    $smtp_secure = get_option('nenghui_smtp_secure', 'tls');
    $smtp_from_email = get_option('nenghui_smtp_from_email');
    $smtp_from_name = get_option('nenghui_smtp_from_name');
    
    // 如果SMTP配置不完整，则不启用SMTP
    if (empty($smtp_host) || empty($smtp_username) || empty($smtp_password)) {
        return;
    }
    
    $phpmailer->isSMTP();
    $phpmailer->Host = $smtp_host;
    $phpmailer->SMTPAuth = true;
    $phpmailer->Port = $smtp_port;
    $phpmailer->Username = $smtp_username;
    $phpmailer->Password = $smtp_password;
    
    // 设置加密方式
    if ($smtp_secure === 'ssl') {
        $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS;
    } elseif ($smtp_secure === 'tls') {
        $phpmailer->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS;
    }
    
    // 设置发件人信息
    if (!empty($smtp_from_email)) {
        $phpmailer->setFrom($smtp_from_email, $smtp_from_name ?: get_bloginfo('name'));
    }
    
    // 设置超时时间
    $phpmailer->Timeout = 30;
    $phpmailer->SMTPKeepAlive = false;
    
    // 启用调试（测试时总是启用）
    if (defined('WP_DEBUG') && WP_DEBUG || isset($_GET['nenghui_test_smtp'])) {
        $phpmailer->SMTPDebug = 2;
        $phpmailer->Debugoutput = function($str, $level) {
            error_log('SMTP Debug: ' . $str);
        };
    }
}

// 挂载SMTP配置
add_action('phpmailer_init', 'nenghui_configure_smtp');



/**
 * 测试SMTP连接
 */
function nenghui_test_smtp_connection() {
    if (!current_user_can('manage_options')) {
        wp_die('权限不足');
    }
    
    // 检查SMTP配置是否完整
    $smtp_host = get_option('nenghui_smtp_host');
    $smtp_username = get_option('nenghui_smtp_username');
    $smtp_password = get_option('nenghui_smtp_password');
    $smtp_from_email = get_option('nenghui_smtp_from_email');
    
    $config_errors = [];
    if (empty($smtp_host)) {
        $config_errors[] = 'SMTP服务器地址未配置';
    }
    if (empty($smtp_username)) {
        $config_errors[] = 'SMTP用户名未配置';
    }
    if (empty($smtp_password)) {
        $config_errors[] = 'SMTP密码未配置';
    }
    if (empty($smtp_from_email)) {
        $config_errors[] = '发件人邮箱未配置';
    }
    
    if (!empty($config_errors)) {
        add_action('admin_notices', function() use ($config_errors) {
            $error_list = implode('、', $config_errors);
            echo '<div class="notice notice-error is-dismissible"><p><strong>SMTP配置不完整：</strong>' . esc_html($error_list) . '</p></div>';
        });
        return;
    }
    
    $test_email = get_option('admin_email');
    $subject = '[' . get_bloginfo('name') . '] SMTP测试邮件';
    $message = '这是一封SMTP配置测试邮件。如果您收到此邮件，说明SMTP配置正确。\n\n发送时间：' . current_time('Y-m-d H:i:s');
    
    // 启用错误捕获
    $original_error_reporting = error_reporting(E_ALL);
    $original_display_errors = ini_get('display_errors');
    ini_set('display_errors', 1);
    
    // 捕获PHPMailer错误
    global $phpmailer;
    $error_message = '';
    $debug_output = '';
    
    // 捕获调试输出
    ob_start();
    
    add_action('wp_mail_failed', function($wp_error) use (&$error_message) {
        $error_message = $wp_error->get_error_message();
    });
    
    // 临时启用错误日志记录（使用允许的路径）
    $log_file = '/tmp/smtp_debug.log';
    $original_log_errors = ini_get('log_errors');
    $original_error_log = ini_get('error_log');
    ini_set('log_errors', 1);
    ini_set('error_log', $log_file);
    
    $sent = wp_mail($test_email, $subject, $message);
    
    // 获取调试输出
    $debug_output = ob_get_clean();
    
    // 恢复设置
    error_reporting($original_error_reporting);
    ini_set('display_errors', $original_display_errors);
    ini_set('log_errors', $original_log_errors);
    ini_set('error_log', $original_error_log);
    
    // 读取最新的错误日志
    $recent_errors = '';
    if (file_exists($log_file)) {
        $log_content = file_get_contents($log_file);
        $log_lines = explode("\n", $log_content);
        $recent_lines = array_slice($log_lines, -10); // 获取最后10行
        $recent_errors = implode("\n", array_filter($recent_lines));
    }
    
    if ($sent) {
        add_action('admin_notices', function() use ($test_email) {
            echo '<div class="notice notice-success is-dismissible"><p><strong>测试邮件发送成功！</strong><br>测试邮件已发送到：' . esc_html($test_email) . '<br>请检查您的邮箱（包括垃圾邮件文件夹）。</p></div>';
        });
    } else {
        add_action('admin_notices', function() use ($error_message, $smtp_host, $smtp_username, $debug_output, $recent_errors) {
            $smtp_port = get_option('nenghui_smtp_port', '587');
            $smtp_secure = get_option('nenghui_smtp_secure', 'tls');
            
            $error_info = '<strong>测试邮件发送失败！</strong><br>';
            $error_info .= '<br><strong>当前SMTP配置：</strong><br>';
            $error_info .= '• 服务器：' . esc_html($smtp_host) . '<br>';
            $error_info .= '• 端口：' . esc_html($smtp_port) . '<br>';
            $error_info .= '• 加密：' . esc_html($smtp_secure) . '<br>';
            $error_info .= '• 用户名：' . esc_html($smtp_username) . '<br>';
            
            if (!empty($error_message)) {
                $error_info .= '<br><strong>WordPress错误信息：</strong><br><code>' . esc_html($error_message) . '</code><br>';
            }
            
            if (!empty($debug_output)) {
                $error_info .= '<br><strong>SMTP调试输出：</strong><br><pre style="background:#f1f1f1;padding:10px;font-size:12px;max-height:200px;overflow-y:auto;">' . esc_html($debug_output) . '</pre>';
            }
            
            if (!empty($recent_errors)) {
                $error_info .= '<br><strong>最近的错误日志：</strong><br><pre style="background:#f1f1f1;padding:10px;font-size:12px;max-height:200px;overflow-y:auto;">' . esc_html($recent_errors) . '</pre>';
            }
            
            $error_info .= '<br><strong>常见问题排查：</strong><br>';
            
            // 检查是否是认证失败错误
            if (strpos($debug_output, '526 Authentication failure') !== false || strpos($debug_output, 'Authentication failure') !== false) {
                $error_info .= '<span style="color:red;"><strong>⚠️ 认证失败 (526错误) 解决方案：</strong></span><br>';
                $error_info .= '• <strong>阿里云邮箱</strong>：必须使用授权码，不能使用登录密码<br>';
                $error_info .= '• <strong>QQ邮箱</strong>：需要开启SMTP服务并使用授权码<br>';
                $error_info .= '• <strong>163邮箱</strong>：需要开启客户端授权密码<br>';
                $error_info .= '• <strong>Gmail</strong>：需要开启两步验证并使用应用专用密码<br>';
                $error_info .= '• 确认用户名格式正确（通常是完整邮箱地址）<br>';
                $error_info .= '• 检查是否已在邮箱设置中开启SMTP服务<br><br>';
            }
            
            $error_info .= '• 检查SMTP服务器地址和端口是否正确<br>';
            $error_info .= '• 验证用户名和密码是否正确<br>';
            $error_info .= '• 确认加密方式（SSL/TLS）设置正确<br>';
            $error_info .= '• 检查邮箱服务商是否允许SMTP发送<br>';
            $error_info .= '• 确认服务器防火墙没有阻止SMTP端口<br>';
            $error_info .= '• 检查服务器的PHP扩展是否支持SSL/TLS';
            
            echo '<div class="notice notice-error is-dismissible"><p>' . $error_info . '</p></div>';
        });
    }
}

/**
 * 测试SMTP连接（不发送邮件）
 */
function nenghui_test_smtp_connection_only() {
    if (!current_user_can('manage_options')) {
        wp_die('权限不足');
    }
    
    // 检查SMTP配置
    $smtp_host = get_option('nenghui_smtp_host');
    $smtp_port = get_option('nenghui_smtp_port', '587');
    $smtp_username = get_option('nenghui_smtp_username');
    $smtp_password = get_option('nenghui_smtp_password');
    $smtp_secure = get_option('nenghui_smtp_secure', 'tls');
    
    if (empty($smtp_host) || empty($smtp_username) || empty($smtp_password)) {
        add_action('admin_notices', function() {
            echo '<div class="notice notice-error is-dismissible"><p><strong>SMTP配置不完整！</strong>请先完成所有必要的SMTP配置。</p></div>';
        });
        return;
    }
    
    // 尝试连接SMTP服务器
    $connection_result = '';
    $error_message = '';
    
    try {
        // 创建socket连接测试
        $context = stream_context_create();
        if ($smtp_secure === 'ssl') {
            $host_with_ssl = 'ssl://' . $smtp_host;
        } else {
            $host_with_ssl = $smtp_host;
        }
        
        $socket = @stream_socket_client(
            $host_with_ssl . ':' . $smtp_port,
            $errno,
            $errstr,
            10,
            STREAM_CLIENT_CONNECT,
            $context
        );
        
        if ($socket) {
            $connection_result = 'success';
            fclose($socket);
        } else {
            $connection_result = 'failed';
            $error_message = "连接失败: $errstr ($errno)";
        }
    } catch (Exception $e) {
        $connection_result = 'failed';
        $error_message = $e->getMessage();
    }
    
    if ($connection_result === 'success') {
        add_action('admin_notices', function() use ($smtp_host, $smtp_port) {
            echo '<div class="notice notice-success is-dismissible"><p><strong>SMTP连接测试成功！</strong><br>成功连接到 ' . esc_html($smtp_host) . ':' . esc_html($smtp_port) . '<br>现在可以尝试发送测试邮件。</p></div>';
        });
    } else {
        add_action('admin_notices', function() use ($smtp_host, $smtp_port, $error_message) {
            echo '<div class="notice notice-error is-dismissible"><p><strong>SMTP连接测试失败！</strong><br>无法连接到 ' . esc_html($smtp_host) . ':' . esc_html($smtp_port) . '<br>错误信息：' . esc_html($error_message) . '</p></div>';
        });
    }
}

// 处理SMTP测试请求
if (isset($_GET['nenghui_test_smtp']) && $_GET['nenghui_test_smtp'] === '1') {
    add_action('admin_init', 'nenghui_test_smtp_connection');
}

// 处理SMTP连接测试请求
if (isset($_GET['nenghui_test_smtp_connection']) && $_GET['nenghui_test_smtp_connection'] === '1') {
    add_action('admin_init', 'nenghui_test_smtp_connection_only');
}



?>