PHP Classes

File: app/Assets/Solution/Views/Config/Sections/mail.php

Recommend this page to a friend!
  Classes of Francisco Núñez   Catalyst   app/Assets/Solution/Views/Config/Sections/mail.php   Download  
File: app/Assets/Solution/Views/Config/Sections/mail.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Catalyst
Framework to develop MVC-based PHP applications
Author: By
Last change:
Date: 2 days ago
Size: 58,775 bytes
 

Contents

Class file image Download
<?php declare(strict_types=1); /************************************************************************************** * * Catalyst PHP Framework * PHP Version 8.3 (Required). * * @package Catalyst * @subpackage Assets * @see https://github.com/arcanisgk/catalyst * * @author Walter Nuñez (arcanisgk/original founder) <[email protected]> * @copyright 2023 - 2025 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * * @note This program is distributed in the hope that it will be useful * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. * * @category Framework * @filesource * * @link https://catalyst.dock Local development URL * */ use Catalyst\Helpers\Security\CsrfProtection; $csrfProtection = CsrfProtection::getInstance(); ?> <div class="row"> <!-- Template for new mail connections --> <template id="mail-connection-template"> <div class="mail-connection" id="connection-__ID__"> <div class="ibox"> <div class="ibox-title"> <h5>New Mail Connection</h5> <div class="ibox-tools"> <button type="button" class="btn btn-success btn-xs test-connection" data-connection-id="__ID__"> <i class="fa fa-check-circle"></i> Test </button> <button type="button" class="btn btn-danger btn-xs remove-connection" data-connection-id="__ID__"> <i class="fa fa-trash"></i> Remove </button> </div> </div> <div class="ibox-content"> <form class="mail-config-form" data-connection-id="__ID__"> <?= $csrfProtection->getTokenField('mail_config'); ?> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_name___ID__">Connection Name</label> <input type="text" class="form-control" id="mail_name___ID__" name="mail_name___ID__" required> </div> </div> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_host___ID__">Mail Server Host</label> <input type="text" class="form-control" id="mail_host___ID__" name="mail_host___ID__" required> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_port___ID__">Port</label> <input type="number" class="form-control" id="mail_port___ID__" name="mail_port___ID__" value="587" required> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_protocol___ID__">Security Protocol</label> <select class="form-control" id="mail_protocol___ID__" name="mail_protocol___ID__"> <option value="tls" selected>TLS</option> <option value="ssl">SSL</option> <option value="none">None</option> </select> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_debug___ID__">Debug Level</label> <select class="form-control" id="mail_debug___ID__" name="mail_debug___ID__"> <option value="0" selected>Off</option> <option value="1">Client</option> <option value="2">Client & Server</option> <option value="3">Client, Server & Connection</option> <option value="4">Low Level</option> </select> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_user___ID__">Username</label> <input type="text" class="form-control" id="mail_user___ID__" name="mail_user___ID__" required> </div> </div> <div class="col-md-6"> <label class="form-label" for="mail_password___ID__">Password</label> <div class="input-group"> <input type="password" class="form-control" id="mail_password___ID__" name="mail_password___ID__" required> <button class="btn btn-outline-secondary toggle-password" type="button"> <i class="bi bi-eye"></i> </button> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_support___ID__">Support Email</label> <input type="email" class="form-control" id="mail_support___ID__" name="mail_support___ID__"> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_postmaster___ID__">Postmaster Email</label> <input type="email" class="form-control" id="mail_postmaster___ID__" name="mail_postmaster___ID__"> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_default___ID__">Default From</label> <input type="text" class="form-control" id="mail_default___ID__" name="mail_default___ID__" placeholder="[email protected]::Name"> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_test_smg___ID__">Test Message Prefix</label> <input type="text" class="form-control" id="mail_test_smg___ID__" name="mail_test_smg___ID__" value="[TEST]"> </div> </div> <div class="col-md-6"> <div class="mb-3 mt-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_test___ID__" name="mail_test___ID__"> <label class="form-check-label" for="mail_test___ID__">Enable Test Mode</label> </div> <small class="form-text text-muted">For dev only, be careful.</small> </div> </div> </div> <div class="hr-line-dashed"></div> <h4>Authentication Options</h4> <div class="row"> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_authentication___ID__" name="mail_authentication___ID__" checked> <label class="form-check-label" for="mail_authentication___ID__">Authentication</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_verify___ID__" name="mail_verify___ID__" checked> <label class="form-check-label" for="mail_verify___ID__">Verify SSL Certificate</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_verify_peer_name___ID__" name="mail_verify_peer_name___ID__" checked> <label class="form-check-label" for="mail_verify_peer_name___ID__">Verify Peer Name</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_self_signed___ID__" name="mail_self_signed___ID__"> <label class="form-check-label" for="mail_self_signed___ID__">Allow Self-Signed</label> </div> </div> </div> </div> <div class="hr-line-dashed"></div> <div class="d-flex align-items-center mb-2"> <h4 class="mb-0 me-2">DKIM Options</h4> <input type="hidden" class="form-check-input" id="mail_dkim_copy_header_fields___ID__" name="mail_dkim_copy_header_fields___ID__" value="false"> <div id="dkim-header-status-__ID__" class="dkim-header-status"> <!-- Los badges se añadirán dinámicamente por JavaScript --> </div> </div> <div class="row"> <div class="col-md-3"> <div class="form-group"> <label class="d-block">DKIM Domain Source</label> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="dkim_domain_source___ID__" id="dkim_domain_source_email___ID__" value="email" checked> <label class="form-check-label" for="dkim_domain_source_email___ID__"> Use Email Domain </label> </div> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="dkim_domain_source___ID__" id="dkim_domain_source_custom___ID__" value="custom"> <label class="form-check-label" for="dkim_domain_source_custom___ID__"> Use Current Domain </label> </div> </div> </div> <div class="col-md-5"> <label class="form-label" for="mail_dkim_passphrase___ID__">DKIM Passphrase <small class="text-muted">(Optional)</small></label> <div class="input-group"> <input type="password" class="form-control" id="mail_dkim_passphrase___ID__" name="mail_dkim_passphrase___ID__" placeholder="Only needed for encrypted keys"> <button class="btn btn-outline-secondary toggle-password" type="button"> <i class="bi bi-eye"></i> </button> </div> <small class="form-text text-muted">Leave empty unless your private key is encrypted with a passphrase.</small> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_dkim_sign___ID__">DKIM Selector</label> <div class="input-group"> <input type="text" class="form-control" id="mail_dkim_sign___ID__" name="mail_dkim_sign___ID__" placeholder="e.g. s1"> <button type="button" class="btn btn-primary generate-dkim-keys" data-connection-id="__ID__"> <i class="fa fa-key"></i> Generate Keys </button> </div> <small class="form-text text-muted">The system will use the domain from your email address on Username.</small> </div> </div> </div> </form> </div> </div> </div> </template> <div class="col-lg-12"> <div class="ibox"> <div class="ibox-title"> <h5>Mail Connections</h5> <div class="ibox-tools"> <button type="button" id="add-mail-connection" class="btn btn-primary btn-xs"> <i class="fa fa-plus"></i> Add Mail Connection </button> </div> </div> <div class="ibox-content"> <div id="mail-connections-container"> <?php $connections = $configData ?? []; if (empty($connections)) { $connections = ['mail1' => [ 'mail_name' => '', 'mail_host' => '', 'mail_port' => 587, 'mail_user' => '', 'mail_support' => '', 'mail_postmaster' => '', 'mail_password' => '', 'mail_default' => '', 'mail_test_smg' => '[TEST]', 'mail_protocol' => 'tls', 'mail_authentication' => true, 'mail_verify' => true, 'mail_verify_peer_name' => true, 'mail_self_signed' => false, 'mail_dkim_sign' => '', 'mail_dkim_passphrase' => '', 'mail_dkim_copy_header_fields' => false, 'mail_debug' => 0, 'mail_test' => false ]]; } foreach ($connections as $id => $connection): $connectionId = substr($id, 4); // Extract the numeric part (mail1 -> 1) ?> <div class="mail-connection" id="connection-<?= $connectionId ?>"> <div class="ibox"> <div class="ibox-title"> <h5><?= $connection['mail_name'] ? $connection['mail_name'] : 'New Mail Connection' ?></h5> <div class="ibox-tools"> <button type="button" class="btn btn-success btn-xs test-connection" data-connection-id="<?= $connectionId ?>"> <i class="fa fa-check-circle"></i> Test </button> <?php if (count($connections) > 1): ?> <button type="button" class="btn btn-danger btn-xs remove-connection" data-connection-id="<?= $connectionId ?>"> <i class="fa fa-trash"></i> Remove </button> <?php endif; ?> </div> </div> <div class="ibox-content"> <form class="mail-config-form" data-connection-id="<?= $connectionId ?>"> <?= $csrfProtection->getTokenField('mail_config'); ?> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_name_<?= $connectionId ?>">Connection Name</label> <input type="text" class="form-control" id="mail_name_<?= $connectionId ?>" name="mail_name_<?= $connectionId ?>" value="<?= $connection['mail_name'] ?? '' ?>" required> </div> </div> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_host_<?= $connectionId ?>">Mail Server Host</label> <input type="text" class="form-control" id="mail_host_<?= $connectionId ?>" name="mail_host_<?= $connectionId ?>" value="<?= $connection['mail_host'] ?? '' ?>" required> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_port_<?= $connectionId ?>">Port</label> <input type="number" class="form-control" id="mail_port_<?= $connectionId ?>" name="mail_port_<?= $connectionId ?>" value="<?= $connection['mail_port'] ?? 587 ?>" required> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_protocol_<?= $connectionId ?>">Security Protocol</label> <select class="form-control" id="mail_protocol_<?= $connectionId ?>" name="mail_protocol_<?= $connectionId ?>"> <option value="tls" <?= ($connection['mail_protocol'] ?? '') === 'tls' ? 'selected' : '' ?>>TLS</option> <option value="ssl" <?= ($connection['mail_protocol'] ?? '') === 'ssl' ? 'selected' : '' ?>>SSL</option> <option value="none" <?= ($connection['mail_protocol'] ?? '') === 'none' ? 'selected' : '' ?>>None</option> </select> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_debug_<?= $connectionId ?>">Debug Level</label> <select class="form-control" id="mail_debug_<?= $connectionId ?>" name="mail_debug_<?= $connectionId ?>"> <option value="0" <?= ($connection['mail_debug'] ?? 0) == 0 ? 'selected' : '' ?>>Off</option> <option value="1" <?= ($connection['mail_debug'] ?? 0) == 1 ? 'selected' : '' ?>>Client</option> <option value="2" <?= ($connection['mail_debug'] ?? 0) == 2 ? 'selected' : '' ?>>Client & Server</option> <option value="3" <?= ($connection['mail_debug'] ?? 0) == 3 ? 'selected' : '' ?>>Client, Server & Connection</option> <option value="4" <?= ($connection['mail_debug'] ?? 0) == 4 ? 'selected' : '' ?>>Low Level</option> </select> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_user_<?= $connectionId ?>">Username</label> <input type="text" class="form-control" id="mail_user_<?= $connectionId ?>" name="mail_user_<?= $connectionId ?>" value="<?= $connection['mail_user'] ?? '' ?>" required> </div> </div> <div class="col-md-6"> <label class="form-label" for="mail_password_<?= $connectionId ?>">Password</label> <div class="input-group"> <input type="password" class="form-control" id="mail_password_<?= $connectionId ?>" name="mail_password_<?= $connectionId ?>" value="<?= $connection['mail_password'] ?? '' ?>" required> <button class="btn btn-outline-secondary toggle-password" type="button"> <i class="bi bi-eye"></i> </button> </div> </div> </div> <div class="row"> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_support_<?= $connectionId ?>">Support Email</label> <input type="email" class="form-control" id="mail_support_<?= $connectionId ?>" name="mail_support_<?= $connectionId ?>" value="<?= $connection['mail_support'] ?? '' ?>"> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_postmaster_<?= $connectionId ?>">Postmaster Email</label> <input type="email" class="form-control" id="mail_postmaster_<?= $connectionId ?>" name="mail_postmaster_<?= $connectionId ?>" value="<?= $connection['mail_postmaster'] ?? '' ?>"> </div> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_default_<?= $connectionId ?>">Default From</label> <input type="text" class="form-control" id="mail_default_<?= $connectionId ?>" name="mail_default_<?= $connectionId ?>" value="<?= $connection['mail_default'] ?? '' ?>" placeholder="[email protected]::Name"> </div> </div> </div> <div class="row"> <div class="col-md-6"> <div class="form-group mb-3"> <label for="mail_test_smg_<?= $connectionId ?>">Test Message Prefix</label> <input type="text" class="form-control" id="mail_test_smg_<?= $connectionId ?>" name="mail_test_smg_<?= $connectionId ?>" value="<?= $connection['mail_test_smg'] ?? '[TEST]' ?>"> </div> </div> <div class="col-md-6"> <div class="mb-3 mt-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_test_<?= $connectionId ?>" name="mail_test_<?= $connectionId ?>" <?= isset($connection['mail_test']) && $connection['mail_test'] ? 'checked' : '' ?>> <label class="form-check-label" for="mail_test_<?= $connectionId ?>">Enable Test Mode</label> </div> <small class="form-text text-muted">For dev only, be careful.</small> </div> </div> </div> <div class="hr-line-dashed"></div> <h4>Authentication Options</h4> <div class="row"> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_authentication_<?= $connectionId ?>" name="mail_authentication_<?= $connectionId ?>" <?= isset($connection['mail_authentication']) && $connection['mail_authentication'] ? 'checked' : '' ?>> <label class="form-check-label" for="mail_authentication_<?= $connectionId ?>">Authentication</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_verify_<?= $connectionId ?>" name="mail_verify_<?= $connectionId ?>" <?= isset($connection['mail_verify']) && $connection['mail_verify'] ? 'checked' : '' ?>> <label class="form-check-label" for="mail_verify_<?= $connectionId ?>">Verify SSL Certificate</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_verify_peer_name_<?= $connectionId ?>" name="mail_verify_peer_name_<?= $connectionId ?>" <?= isset($connection['mail_verify_peer_name']) && $connection['mail_verify_peer_name'] ? 'checked' : '' ?>> <label class="form-check-label" for="mail_verify_peer_name_<?= $connectionId ?>">Verify Peer Name</label> </div> </div> </div> <div class="col-md-3"> <div class="mb-3"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="mail_self_signed_<?= $connectionId ?>" name="mail_self_signed_<?= $connectionId ?>" <?= isset($connection['mail_self_signed']) && $connection['mail_self_signed'] ? 'checked' : '' ?>> <label class="form-check-label" for="mail_self_signed_<?= $connectionId ?>">Allow Self-Signed</label> </div> </div> </div> </div> <div class="hr-line-dashed"></div> <div class="d-flex align-items-center mb-2"> <h4 class="mb-0 me-2">DKIM Options</h4> <input type="hidden" class="form-check-input" id="mail_dkim_copy_header_fields_<?= $connectionId ?>" name="mail_dkim_copy_header_fields_<?= $connectionId ?>" value="false"> <div id="dkim-header-status-<?= $connectionId ?>" class="dkim-header-status"> <?php if (!empty($connection['mail_dkim_sign'])): ?> <span class="badge bg-success dkim-badge text-white"> <i class="bi bi-shield-check"></i> DKIM Active <?php if (!empty($connection['mail_dkim_generated'])): ?> (<?= date("m/d/Y", strtotime($connection['mail_dkim_generated'])) ?>) <?php endif; ?> </span> <?php // Determine which domain to display $displayDomain = ''; if (!empty($connection['mail_dkim_domain_source']) && $connection['mail_dkim_domain_source'] === 'custom') { $displayDomain = $connection['mail_dkim_custom_domain'] ?? ''; } else { // Extract domain from email $email = $connection['mail_user'] ?? ''; if (str_contains($email, '@')) { $parts = explode('@', $email); $displayDomain = end($parts); } } ?> <?php if (!empty($displayDomain)): ?> <span class="badge bg-info mt-1 text-white"> <i class="bi bi-globe"></i> Domain: <?= $displayDomain ?> </span> <?php endif; ?> <?php endif; ?> </div> </div> <div class="row"> <div class="col-md-3"> <div class="form-group"> <label class="d-block">DKIM Domain Source</label> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="dkim_domain_source_<?= $connectionId ?>" id="dkim_domain_source_email_<?= $connectionId ?>" value="email" <?= (!isset($connection['mail_dkim_domain_source']) || $connection['mail_dkim_domain_source'] === 'email') ? 'checked' : '' ?>> <label class="form-check-label" for="dkim_domain_source_email_<?= $connectionId ?>"> Use Email Domain </label> </div> <div class="form-check form-check-inline"> <input class="form-check-input" type="radio" name="dkim_domain_source_<?= $connectionId ?>" id="dkim_domain_source_custom_<?= $connectionId ?>" value="custom" <?= (isset($connection['mail_dkim_domain_source']) && $connection['mail_dkim_domain_source'] === 'custom') ? 'checked' : '' ?>> <label class="form-check-label" for="dkim_domain_source_custom_<?= $connectionId ?>"> Use Current Domain </label> </div> </div> </div> <div class="col-md-5"> <label class="form-label" for="mail_dkim_passphrase_<?= $connectionId ?>">DKIM Passphrase <small class="text-muted">(Optional)</small></label> <div class="input-group"> <input type="password" class="form-control" id="mail_dkim_passphrase_<?= $connectionId ?>" name="mail_dkim_passphrase_<?= $connectionId ?>" value="<?= $connection['mail_dkim_passphrase'] ?? '' ?>" placeholder="Only needed for encrypted keys"> <button class="btn btn-outline-secondary toggle-password" type="button"> <i class="bi bi-eye"></i> </button> </div> <small class="form-text text-muted">Leave empty unless your private key is encrypted with a passphrase.</small> </div> <div class="col-md-4"> <div class="form-group mb-3"> <label for="mail_dkim_sign_<?= $connectionId ?>">DKIM Selector</label> <div class="input-group"> <input type="text" class="form-control" id="mail_dkim_sign_<?= $connectionId ?>" name="mail_dkim_sign_<?= $connectionId ?>" value="<?= $connection['mail_dkim_sign'] ?? '' ?>" placeholder="e.g. s1"> <button type="button" class="btn btn-primary generate-dkim-keys" data-connection-id="<?= $connectionId ?>"> <i class="fa fa-key"></i> Generate Keys </button> </div> <small class="form-text text-muted">The system will use the domain from your email address on Username.</small> </div> </div> </div> </form> </div> </div> </div> <?php endforeach; ?> </div> <div class="row m-t-md"> <div class="col-md-12 text-center"> <button type="button" id="save-all-connections" class="btn btn-primary btn-lg"> <i class="fa fa-save"></i> Save All Connections </button> </div> </div> </div> </div> </div> </div> <div class="modal fade" id="dkimDnsModal" tabindex="-1" aria-labelledby="dkimDnsModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="dkimDnsModalLabel">DKIM DNS Record</h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div class="alert alert-info"> <p>Add this DNS record to your domain to enable DKIM authentication for your emails:</p> </div> <pre id="dkimDnsRecord" class="bg-light p-3"></pre> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button> <button type="button" class="btn btn-primary" id="copyDkimRecord">Copy to Clipboard</button> </div> </div> </div> </div> <script> 'use strict'; /** * Mail Configuration Manager * Modern ES6+ implementation for mail connections management */ document.addEventListener('DOMContentLoaded', () => { // Initialize state let connectionCounter = document.querySelectorAll('.mail-connection').length; /** * Add a new mail connection */ const addConnection = () => { connectionCounter++; const connectionId = connectionCounter; // Get the template and clone it const template = document.getElementById('mail-connection-template'); const newConnection = template.content.cloneNode(true); // Replace all __ID__ placeholders with the actual connection ID replaceTemplateId(newConnection, '__ID__', connectionId); // Add the new connection to the container document.getElementById('mail-connections-container').appendChild(newConnection); }; /** * Replace all occurrences of a placeholder in a template with actual value * * @param {DocumentFragment} fragment - The template fragment * @param {string} placeholder - The placeholder to replace * @param {string|number} value - The value to replace with */ const replaceTemplateId = (fragment, placeholder, value) => { // Replace in element IDs fragment.querySelectorAll(`[id*="${placeholder}"]`).forEach(el => { el.id = el.id.replace(placeholder, value); }); // Replace in element names fragment.querySelectorAll(`[name*="${placeholder}"]`).forEach(el => { el.name = el.name.replace(placeholder, value); }); // Replace in data attributes fragment.querySelectorAll(`[data-connection-id="${placeholder}"]`).forEach(el => { el.setAttribute('data-connection-id', value); }); // Replace in labels' for attributes fragment.querySelectorAll(`[for*="${placeholder}"]`).forEach(el => { el.setAttribute('for', el.getAttribute('for').replace(placeholder, value)); }); // Replace in the connection div ID const connectionDiv = fragment.querySelector('.mail-connection'); if (connectionDiv && connectionDiv.id.includes(placeholder)) { connectionDiv.id = connectionDiv.id.replace(placeholder, value); } }; /** * Test a mail connection * @param {number} connectionId - The ID of the connection to test */ const testConnection = async (connectionId) => { try { const form = document.querySelector(`form[data-connection-id="${connectionId}"]`); const formData = new FormData(form); formData.append('type', 'mail'); formData.append('connection_id', connectionId); // Display loading indicator const testButton = document.querySelector(`.test-connection[data-connection-id="${connectionId}"]`); const originalContent = testButton ? testButton.innerHTML : null; if (testButton) { testButton.disabled = true; testButton.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Testing...'; } const response = await fetch('/configure/test-connection', { method: 'POST', body: formData }); const data = await response.json(); // Restore button state if (testButton && originalContent) { testButton.disabled = false; testButton.innerHTML = originalContent; } if (data.success) { window.toasts.success('Connection successful: ' + data.message); } else { window.toasts.error('Connection failed: ' + data.message); } } catch (error) { console.error('Test connection error:', error); window.toasts.error('An error occurred while testing the connection'); // Restore button state on error const testButton = document.querySelector(`.test-connection[data-connection-id="${connectionId}"]`); if (testButton) { testButton.disabled = false; testButton.innerHTML = '<i class="fa fa-check-circle"></i> Test'; } } }; /** * Remove a mail connection * @param {number} connectionId - The ID of the connection to remove */ const removeConnection = (connectionId) => { const connectionElement = document.getElementById(`connection-${connectionId}`); if (connectionElement) { connectionElement.remove(); } }; /** * Save all mail connections */ const saveAllConnections = async () => { await handleConfigSubmit( document.querySelector('.mail-config-form'), '/configure/mail/save', { collectFromForms: '.mail-config-form', submitSelector: '#save-all-connections' } ); }; // Event Listeners document.getElementById('add-mail-connection').addEventListener('click', addConnection); document.getElementById('save-all-connections').addEventListener('click', saveAllConnections); // Event delegation for dynamically created elements document.addEventListener('click', (event) => { // Test connection button click if (event.target.closest('.test-connection')) { const button = event.target.closest('.test-connection'); const connectionId = button.getAttribute('data-connection-id'); testConnection(connectionId); } // Remove connection button click if (event.target.closest('.remove-connection')) { const button = event.target.closest('.remove-connection'); const connectionId = button.getAttribute('data-connection-id'); removeConnection(connectionId); } }); // Initialize iCheck if available if (typeof $.fn !== 'undefined' && $.fn.iCheck) { $('.i-checks input').iCheck({ checkboxClass: 'icheckbox_square-green', radioClass: 'iradio_square-green', }); } }); // Add to your existing DOMContentLoaded event handler document.addEventListener('DOMContentLoaded', () => { // DKIM key generation document.addEventListener('click', (event) => { if (event.target.closest('.generate-dkim-keys')) { const button = event.target.closest('.generate-dkim-keys'); const connectionId = button.getAttribute('data-connection-id'); generateDkimKeys(connectionId); } }); // Copy DKIM record to clipboard document.getElementById('copyDkimRecord').addEventListener('click', () => { const recordText = document.getElementById('dkimDnsRecord').textContent; navigator.clipboard.writeText(recordText).then(() => { window.toasts.success('DNS record copied to clipboard'); }).catch(err => { console.error('Failed to copy: ', err); window.toasts.error('Failed to copy DNS record'); }); }); }); /** * Check for existing DKIM keys when opening connection form * @param {string} connectionId - The connection ID to check */ function checkExistingDkimKeys(connectionId) { const mailUserField = document.getElementById(`mail_user_${connectionId}`); if (!mailUserField || !mailUserField.value) return; // Extract domain from email const emailParts = mailUserField.value.split('@'); if (emailParts.length !== 2) return; const domain = emailParts[1]; // Check if we have a custom domain source const domainSourceCustom = document.getElementById(`dkim_domain_source_custom_${connectionId}`); const domainSourceEmail = document.getElementById(`dkim_domain_source_email_${connectionId}`); if (domainSourceCustom && domainSourceCustom.checked) { // If we're using a custom domain, check configuration // This is just to ensure the radio buttons are checked correctly // The actual domain check will still happen via the API } else if (domainSourceEmail) { domainSourceEmail.checked = true; } // API endpoint to check existing keys fetch(`/configure/check-dkim-keys?domain=${domain}&connection_id=${connectionId}`) .then(response => response.json()) .then(data => { if (data.success && data.keys.length > 0) { // Update selector field with existing key info const selectorField = document.getElementById(`mail_dkim_sign_${connectionId}`); if (selectorField) { // Sort keys by creation time (newest first) data.keys.sort((a, b) => b.created - a.created); selectorField.value = data.keys[0].selector; // Format date for display const createDate = new Date(data.keys[0].created * 1000); const formattedDate = createDate.toLocaleDateString(); // Update the header status indicator let headerStatus = document.getElementById(`dkim-header-status-${connectionId}`); if (headerStatus) { headerStatus.innerHTML = ` <span class="badge bg-success dkim-badge text-white"> <i class="bi bi-shield-check"></i> DKIM Active (${formattedDate}) </span> <span class="badge bg-info mt-1 text-white"> <i class="bi bi-globe"></i> Domain: ${data.domain || domain} </span> `; } } } }) .catch(error => console.error('Error checking DKIM keys:', error)); } /** * Generate DKIM keys for a mail connection * @param {string} connectionId - The connection ID */ async function generateDkimKeys(connectionId) { try { // Get mail address (domain) from the connection form const mailUserField = document.getElementById(`mail_user_${connectionId}`); if (!mailUserField || !mailUserField.value) { window.toasts.error('Please enter a valid email address in the Username field first'); return; } // Extract domain from email const emailParts = mailUserField.value.split('@'); if (emailParts.length !== 2) { window.toasts.error('Invalid email format in the Username field'); return; } const emailDomain = emailParts[1]; // Get domain source selection const domainSourceEmail = document.getElementById(`dkim_domain_source_email_${connectionId}`); const domainSource = domainSourceEmail.checked ? 'email' : 'custom'; // Get selector (use value from input or default to 's1') const selectorField = document.getElementById(`mail_dkim_sign_${connectionId}`); const selector = selectorField && selectorField.value ? selectorField.value : 's1'; // Show loading indicator const button = document.querySelector(`.generate-dkim-keys[data-connection-id="${connectionId}"]`); const originalContent = button.innerHTML; button.disabled = true; button.innerHTML = '<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Generating...'; // Send request to generate keys const formData = new FormData(); formData.append('connection_id', connectionId); formData.append('email_domain', emailDomain); formData.append('domain_source', domainSource); formData.append('selector', selector); const response = await fetch('/configure/generate-dkim-keys', { method: 'POST', body: formData }); const result = await response.json(); // Restore button button.disabled = false; button.innerHTML = originalContent; // En la parte donde se procesa la respuesta exitosa en generateDkimKeys: if (result.success) { // Update the selector field with the generated selector if (selectorField && result.data.selector) { selectorField.value = result.data.selector; // Update the header status indicator const headerStatus = document.getElementById(`dkim-header-status-${connectionId}`); if (headerStatus) { headerStatus.innerHTML = ` <span class="badge bg-success dkim-badge text-white"> <i class="bi bi-shield-check"></i> DKIM Active (${new Date().toLocaleDateString()}) </span> <span class="badge bg-info mt-1 text-white"> <i class="bi bi-globe"></i> Domain: ${result.data.domain} </span> `; } } // Show DNS record in modal document.getElementById('dkimDnsRecord').textContent = result.data.dnsRecord; const dkimModal = new bootstrap.Modal(document.getElementById('dkimDnsModal')); dkimModal.show(); window.toasts.success(result.message); } else { window.toasts.error(result.message); } } catch (error) { console.error('DKIM generation error:', error); window.toasts.error('An error occurred while generating DKIM keys'); // Restore button state on error const button = document.querySelector(`.generate-dkim-keys[data-connection-id="${connectionId}"]`); if (button) { button.disabled = false; button.innerHTML = '<i class="fa fa-key"></i> Generate Keys'; } } } // Add this to initialize the DKIM key checking when mail connections are shown document.getElementById('add-mail-connection').addEventListener('click', () => { // Wait for DOM to update with new connection setTimeout(() => { const newConnection = document.querySelector('.mail-connection:last-child'); if (newConnection) { const connectionId = newConnection.id.replace('connection-', ''); // Wait for user to enter email before checking const mailUserField = document.getElementById(`mail_user_${connectionId}`); if (mailUserField) { mailUserField.addEventListener('blur', () => { checkExistingDkimKeys(connectionId); }); } } }, 500); }); </script>