Sindbad~EG File Manager

Current Path : /home/copmadinaarea/thecopmadinaarea.org/attendance/includes/
Upload File :
Current File : /home/copmadinaarea/thecopmadinaarea.org/attendance/includes/email_functions_improved.php

<?php
// Improved email notification functions with better error handling
require_once 'smtp_mailer.php';

/**
 * Send attendance confirmation email with improved error handling
 */
function sendAttendanceConfirmationEmail($conn, $attendance_record) {
    try {
        // Get email settings
        $settings_query = "SELECT * FROM email_settings WHERE is_active = 1 ORDER BY created_at DESC LIMIT 1";
        $settings_stmt = $conn->prepare($settings_query);
        $settings_stmt->execute();
        $email_settings = $settings_stmt->fetch();
        
        if (!$email_settings) {
            logEmailActivity($conn, $attendance_record['email'] ?? 'unknown', 'N/A', 'failed', 'Email settings not configured');
            return false;
        }
        
        if (empty($attendance_record['email'])) {
            logEmailActivity($conn, 'empty', 'N/A', 'failed', 'No recipient email provided');
            return false;
        }
        
        // Validate email address
        if (!filter_var($attendance_record['email'], FILTER_VALIDATE_EMAIL)) {
            logEmailActivity($conn, $attendance_record['email'], 'N/A', 'failed', 'Invalid email address format');
            return false;
        }
        
        // Get email template
        $template_query = "SELECT * FROM email_templates WHERE template_name = 'attendance_confirmation' AND is_active = 1 LIMIT 1";
        $template_stmt = $conn->prepare($template_query);
        $template_stmt->execute();
        $template = $template_stmt->fetch();
        
        if (!$template) {
            logEmailActivity($conn, $attendance_record['email'], 'N/A', 'failed', 'Email template not found or inactive');
            return false;
        }
        
        // Get program details
        $program_query = "SELECT p.*, l.name as location_name FROM programs p 
                         LEFT JOIN locations l ON p.location_id = l.id 
                         WHERE p.id = ?";
        $program_stmt = $conn->prepare($program_query);
        $program_stmt->execute([$attendance_record['program_id']]);
        $program = $program_stmt->fetch();
        
        // Prepare email content with variable replacement
        $variables = [
            '{{full_name}}' => $attendance_record['full_name'] ?? 'N/A',
            '{{program_name}}' => $program['name'] ?? 'Unknown Program',
            '{{tracking_code}}' => $attendance_record['tracking_code'] ?? 'N/A',
            '{{district_name}}' => $attendance_record['district_name'] ?? 'N/A',
            '{{assembly_name}}' => $attendance_record['assembly_name'] ?? 'N/A',
            '{{submission_date}}' => date('F j, Y g:i A', strtotime($attendance_record['submitted_at'] ?? 'now'))
        ];
        
        $subject = str_replace(array_keys($variables), array_values($variables), $template['subject']);
        $body = str_replace(array_keys($variables), array_values($variables), $template['body']);
        
        // Send email using SMTP (bypassing PHP mail function)
        $result = false;
        $error_message = '';
        
        // Method 1: Try custom SMTP mailer
        $result = sendEmailViaSMTP($email_settings, $attendance_record['email'], $subject, $body);
        
        if (!$result) {
            $error_message = 'SMTP connection failed - check email settings and network connectivity';
            
            // Method 2: Fallback to basic mail() function (will likely fail in XAMPP)
            $headers = [
                'From: ' . $email_settings['from_name'] . ' <' . $email_settings['from_email'] . '>',
                'Reply-To: ' . $email_settings['from_email'],
                'Content-Type: text/plain; charset=UTF-8',
                'X-Mailer: Church Attendance System'
            ];
            
            $result = @mail(
                $attendance_record['email'],
                $subject,
                $body,
                implode("\r\n", $headers)
            );
            
            if (!$result) {
                $error_message = 'Both SMTP and PHP mail() failed - configure SMTP settings in Email Management';
            } else {
                $error_message = ''; // Clear error if mail() succeeded
            }
        }
        
        // Log email attempt with detailed information
        if ($result) {
            logEmailActivity($conn, $attendance_record['email'], $subject, 'sent', 'Email sent successfully');
        } else {
            logEmailActivity($conn, $attendance_record['email'], $subject, 'failed', $error_message);
        }
        
        return $result;
        
    } catch (Exception $e) {
        $error_msg = "Email sending error: " . $e->getMessage();
        error_log($error_msg);
        logEmailActivity($conn, $attendance_record['email'] ?? 'unknown', 'N/A', 'failed', $error_msg);
        return false;
    }
}

/**
 * Send email using PHPMailer (if available)
 */
function sendEmailWithPHPMailer($email_settings, $to_email, $subject, $body) {
    try {
        // This would require PHPMailer to be installed
        // For now, return false to use fallback method
        return false;
    } catch (Exception $e) {
        error_log("PHPMailer error: " . $e->getMessage());
        return false;
    }
}

/**
 * Enhanced email activity logging with error messages
 */
function logEmailActivity($conn, $recipient, $subject, $status, $error_message = null) {
    try {
        // Create enhanced email_logs table if it doesn't exist
        $create_table = "CREATE TABLE IF NOT EXISTS email_logs (
            id INT AUTO_INCREMENT PRIMARY KEY,
            recipient_email VARCHAR(255) NOT NULL,
            subject VARCHAR(255) NOT NULL,
            status ENUM('sent', 'failed') NOT NULL,
            error_message TEXT NULL,
            sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            INDEX idx_email_logs_recipient (recipient_email),
            INDEX idx_email_logs_date (sent_at),
            INDEX idx_email_logs_status (status)
        )";
        $conn->exec($create_table);
        
        // Check if error_message column exists, add it if not
        $check_column = "SHOW COLUMNS FROM email_logs LIKE 'error_message'";
        $result = $conn->query($check_column);
        if ($result->rowCount() == 0) {
            $conn->exec("ALTER TABLE email_logs ADD COLUMN error_message TEXT NULL AFTER status");
        }
        
        $query = "INSERT INTO email_logs (recipient_email, subject, status, error_message) VALUES (?, ?, ?, ?)";
        $stmt = $conn->prepare($query);
        $stmt->execute([$recipient, $subject, $status, $error_message]);
        
    } catch (Exception $e) {
        error_log("Email logging error: " . $e->getMessage());
    }
}

/**
 * Check if email notifications are enabled with detailed validation
 */
function isEmailNotificationEnabled($conn) {
    try {
        $query = "SELECT * FROM email_settings WHERE is_active = 1 LIMIT 1";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $settings = $stmt->fetch();
        
        if (!$settings) {
            return false;
        }
        
        // Check if basic settings are configured
        if (empty($settings['smtp_host']) || empty($settings['from_email'])) {
            return false;
        }
        
        return true;
    } catch (Exception $e) {
        error_log("Email settings check error: " . $e->getMessage());
        return false;
    }
}

/**
 * Get detailed email statistics with error information
 */
function getEmailStats($conn) {
    try {
        $stats = [];
        
        // Total emails sent today
        $query = "SELECT COUNT(*) FROM email_logs WHERE DATE(sent_at) = CURDATE() AND status = 'sent'";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $stats['today_sent'] = $stmt->fetchColumn();
        
        // Total emails failed today
        $query = "SELECT COUNT(*) FROM email_logs WHERE DATE(sent_at) = CURDATE() AND status = 'failed'";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $stats['today_failed'] = $stmt->fetchColumn();
        
        // Total emails this month
        $query = "SELECT COUNT(*) FROM email_logs WHERE MONTH(sent_at) = MONTH(CURDATE()) AND YEAR(sent_at) = YEAR(CURDATE()) AND status = 'sent'";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $stats['month_sent'] = $stmt->fetchColumn();
        
        // Recent failures with error messages
        $query = "SELECT recipient_email, subject, error_message, sent_at 
                  FROM email_logs 
                  WHERE status = 'failed' AND DATE(sent_at) >= DATE_SUB(CURDATE(), INTERVAL 7 DAYS)
                  ORDER BY sent_at DESC LIMIT 10";
        $stmt = $conn->prepare($query);
        $stmt->execute();
        $stats['recent_failures'] = $stmt->fetchAll();
        
        return $stats;
    } catch (Exception $e) {
        error_log("Email stats error: " . $e->getMessage());
        return ['today_sent' => 0, 'today_failed' => 0, 'month_sent' => 0, 'recent_failures' => []];
    }
}

/**
 * Test email configuration
 */
function testEmailConfiguration($conn, $test_email) {
    try {
        $test_record = [
            'email' => $test_email,
            'full_name' => 'Test User',
            'tracking_code' => 'TEST123',
            'program_id' => 1,
            'district_name' => 'Test District',
            'assembly_name' => 'Test Assembly',
            'submitted_at' => date('Y-m-d H:i:s')
        ];
        
        return sendAttendanceConfirmationEmail($conn, $test_record);
    } catch (Exception $e) {
        error_log("Email test error: " . $e->getMessage());
        return false;
    }
}
?>

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists