Sindbad~EG File Manager
<?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