a65cb35b30
- Добавлены поля IMAP в модель SmtpSettings и миграция колонок - Реализовано сохранение копии MIME-сообщения через imaplib после SMTP/EWS/Outlook отправки - Обновлен routes.py: чтение и сохранение IMAP-настроек из формы - Обновлен шаблон admin/email_settings.html: блок настроек IMAP с подсказками
166 lines
11 KiB
HTML
166 lines
11 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}Настройки почты — InviteMe{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="row justify-content-center">
|
||
<div class="col-lg-8">
|
||
<div class="card mb-4">
|
||
<div class="card-body">
|
||
<h4 class="card-title mb-4">Настройки почты для рассылки приглашений</h4>
|
||
<form method="POST" action="{{ url_for('main.admin_email_settings') }}">
|
||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||
|
||
<div class="mb-4">
|
||
<label class="form-label d-block">Способ отправки</label>
|
||
<div class="form-check form-check-inline">
|
||
<input class="form-check-input" type="radio" name="mail_mode" id="mode_smtp" value="smtp" {% if settings.mail_mode == 'smtp' %}checked{% endif %}>
|
||
<label class="form-check-label" for="mode_smtp">SMTP</label>
|
||
</div>
|
||
<div class="form-check form-check-inline">
|
||
<input class="form-check-input" type="radio" name="mail_mode" id="mode_ews" value="ews" {% if settings.mail_mode == 'ews' %}checked{% endif %}>
|
||
<label class="form-check-label" for="mode_ews">EWS (Exchange)</label>
|
||
</div>
|
||
<div class="form-check form-check-inline">
|
||
<input class="form-check-input" type="radio" name="mail_mode" id="mode_outlook" value="outlook" {% if settings.mail_mode == 'outlook' %}checked{% endif %}>
|
||
<label class="form-check-label" for="mode_outlook">Локальный Outlook</label>
|
||
</div>
|
||
<div class="form-text text-muted">
|
||
SMTP/EWS — для серверной установки. Outlook — только если InviteMe запущен на ПК с Outlook.
|
||
</div>
|
||
</div>
|
||
|
||
<div id="common-fields">
|
||
<div class="mb-3">
|
||
<label for="mail_username" class="form-label">Логин / Email</label>
|
||
<input type="text" class="form-control" id="mail_username" name="mail_username" value="{{ settings.mail_username }}">
|
||
</div>
|
||
|
||
<div class="mb-3">
|
||
<label for="mail_password" class="form-label">Пароль</label>
|
||
<input type="password" class="form-control" id="mail_password" name="mail_password" placeholder="Оставьте пустым, чтобы не менять">
|
||
</div>
|
||
|
||
<div class="mb-4">
|
||
<label for="mail_default_sender" class="form-label">Имя отправителя (необязательно)</label>
|
||
<input type="text" class="form-control" id="mail_default_sender" name="mail_default_sender" value="{{ settings.mail_default_sender or '' }}">
|
||
</div>
|
||
</div>
|
||
|
||
<div id="smtp-fields" {% if settings.mail_mode != 'smtp' %}style="display:none;"{% endif %}>
|
||
<div class="row">
|
||
<div class="col-md-8 mb-3">
|
||
<label for="mail_server" class="form-label">SMTP-сервер</label>
|
||
<input type="text" class="form-control" id="mail_server" name="mail_server" value="{{ settings.mail_server }}">
|
||
</div>
|
||
<div class="col-md-4 mb-3">
|
||
<label for="mail_port" class="form-label">Порт</label>
|
||
<input type="number" class="form-control" id="mail_port" name="mail_port" value="{{ settings.mail_port }}">
|
||
</div>
|
||
</div>
|
||
<div class="mb-4 form-check">
|
||
<input type="checkbox" class="form-check-input" id="mail_use_ssl" name="mail_use_ssl" value="1" {% if settings.mail_use_ssl %}checked{% endif %}>
|
||
<label class="form-check-label" for="mail_use_ssl">Использовать SSL</label>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="ews-fields" {% if settings.mail_mode != 'ews' %}style="display:none;"{% endif %}>
|
||
<div class="mb-4">
|
||
<label for="ews_url" class="form-label">EWS URL</label>
|
||
<input type="text" class="form-control" id="ews_url" name="ews_url" value="{{ settings.ews_url or '' }}" placeholder="https://mail.company.com/EWS/Exchange.asmx">
|
||
<div class="form-text text-muted">URL вида <code>https://mail.integrita.ru/EWS/Exchange.asmx</code></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outlook-info" {% if settings.mail_mode != 'outlook' %}style="display:none;"{% endif %} class="alert alert-info">
|
||
Outlook должен быть установлен и запущен на сервере, где работает приложение. Браузер не может запустить Outlook на твоём компьютере.
|
||
</div>
|
||
|
||
<hr class="my-4">
|
||
<h5 class="mb-3">Копия отправленных писем в IMAP</h5>
|
||
<div class="mb-3 form-check">
|
||
<input type="checkbox" class="form-check-input" id="imap_save_copy" name="imap_save_copy" value="1" {% if settings.imap_save_copy %}checked{% endif %}>
|
||
<label class="form-check-label" for="imap_save_copy">Сохранять копию отправленного письма в папку IMAP</label>
|
||
<div class="form-text text-muted">Работает после успешной отправки через SMTP/EWS/Outlook. Для отправки писем по-прежнему используется выбранный выше способ.</div>
|
||
</div>
|
||
|
||
<div id="imap-fields">
|
||
<div class="row">
|
||
<div class="col-md-8 mb-3">
|
||
<label for="imap_server" class="form-label">IMAP-сервер</label>
|
||
<input type="text" class="form-control" id="imap_server" name="imap_server" value="{{ settings.imap_server or '' }}" placeholder="mail.integrita.ru">
|
||
</div>
|
||
<div class="col-md-4 mb-3">
|
||
<label for="imap_port" class="form-label">Порт</label>
|
||
<input type="number" class="form-control" id="imap_port" name="imap_port" value="{{ settings.imap_port or 993 }}">
|
||
</div>
|
||
</div>
|
||
<div class="mb-3 form-check">
|
||
<input type="checkbox" class="form-check-input" id="imap_use_ssl" name="imap_use_ssl" value="1" {% if settings.imap_use_ssl %}checked{% endif %}>
|
||
<label class="form-check-label" for="imap_use_ssl">Использовать SSL/TLS</label>
|
||
</div>
|
||
<div class="mb-3">
|
||
<label for="imap_username" class="form-label">IMAP логин (если пустой — используется логин отправки)</label>
|
||
<input type="text" class="form-control" id="imap_username" name="imap_username" value="{{ settings.imap_username or '' }}">
|
||
</div>
|
||
<div class="mb-3">
|
||
<label for="imap_password" class="form-label">IMAP пароль (если пустой — используется пароль отправки)</label>
|
||
<input type="password" class="form-control" id="imap_password" name="imap_password" placeholder="Оставьте пустым, чтобы не менять">
|
||
</div>
|
||
<div class="mb-4">
|
||
<label for="imap_folder" class="form-label">Папка для сохранения копий</label>
|
||
<input type="text" class="form-control" id="imap_folder" name="imap_folder" value="{{ settings.imap_folder or 'Sent' }}" placeholder="Sent">
|
||
<div class="form-text text-muted">Название папки на сервере: обычно <code>Sent</code>, <code>Sent Items</code> или <code>Отправленные</code>.</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="d-flex gap-2">
|
||
<button type="submit" class="btn btn-primary">Сохранить настройки</button>
|
||
<a href="{{ url_for('main.admin_email_send') }}" class="btn btn-outline-primary">Перейти к рассылке</a>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<div class="card-body">
|
||
<h5 class="card-title mb-3">Отправить тестовое письмо</h5>
|
||
<form method="POST" action="{{ url_for('main.admin_email_test') }}">
|
||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||
<div class="input-group">
|
||
<input type="email" class="form-control" name="test_address" placeholder="address@example.com" required>
|
||
<button class="btn btn-success" type="submit">Отправить тест</button>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
{% endblock %}
|
||
|
||
{% block scripts %}
|
||
<script>
|
||
const radios = document.querySelectorAll('input[name="mail_mode"]');
|
||
const smtpFields = document.getElementById('smtp-fields');
|
||
const ewsFields = document.getElementById('ews-fields');
|
||
const outlookInfo = document.getElementById('outlook-info');
|
||
const commonInputs = document.querySelectorAll('#common-fields input, #smtp-fields input, #ews-fields input');
|
||
|
||
function toggleFields() {
|
||
const mode = document.querySelector('input[name="mail_mode"]:checked').value;
|
||
smtpFields.style.display = mode === 'smtp' ? 'block' : 'none';
|
||
ewsFields.style.display = mode === 'ews' ? 'block' : 'none';
|
||
outlookInfo.style.display = mode === 'outlook' ? 'block' : 'none';
|
||
|
||
// disable hidden inputs to avoid sending stale data
|
||
document.querySelectorAll('#smtp-fields input, #ews-fields input').forEach(i => {
|
||
i.disabled = (mode === 'outlook') || (i.closest('#smtp-fields') && mode !== 'smtp') || (i.closest('#ews-fields') && mode !== 'ews');
|
||
});
|
||
document.querySelectorAll('#common-fields input').forEach(i => i.disabled = mode === 'outlook');
|
||
}
|
||
|
||
radios.forEach(r => r.addEventListener('change', toggleFields));
|
||
toggleFields();
|
||
</script>
|
||
{% endblock %}
|