feat(email): add configurable resend limits for non-OpenAI sender emails

This commit is contained in:
cnlimiter
2026-03-28 02:51:12 +08:00
parent b751d656ea
commit 51922ef2a6
30 changed files with 815 additions and 1263 deletions

View File

@@ -33,8 +33,10 @@ const elements = {
exportBtn: document.getElementById('export-btn'),
exportMenu: document.getElementById('export-menu'),
selectAll: document.getElementById('select-all'),
firstPage: document.getElementById('first-page'),
prevPage: document.getElementById('prev-page'),
nextPage: document.getElementById('next-page'),
lastPage: document.getElementById('last-page'),
pageInfo: document.getElementById('page-info'),
detailModal: document.getElementById('detail-modal'),
modalBody: document.getElementById('modal-body'),
@@ -150,6 +152,13 @@ function initEventListeners() {
});
// 分页
elements.firstPage.addEventListener('click', () => {
if (currentPage > 1 && !isLoading) {
currentPage = 1;
loadAccounts();
}
});
elements.prevPage.addEventListener('click', () => {
if (currentPage > 1 && !isLoading) {
currentPage--;
@@ -165,6 +174,14 @@ function initEventListeners() {
}
});
elements.lastPage.addEventListener('click', () => {
const totalPages = Math.ceil(totalAccounts / pageSize);
if (currentPage < totalPages && !isLoading) {
currentPage = totalPages;
loadAccounts();
}
});
// 导出
elements.exportBtn.addEventListener('click', (e) => {
e.stopPropagation();
@@ -427,8 +444,10 @@ function togglePassword(element, password) {
function updatePagination() {
const totalPages = Math.max(1, Math.ceil(totalAccounts / pageSize));
elements.firstPage.disabled = currentPage <= 1;
elements.prevPage.disabled = currentPage <= 1;
elements.nextPage.disabled = currentPage >= totalPages;
elements.lastPage.disabled = currentPage >= totalPages;
elements.pageInfo.textContent = `${currentPage} 页 / 共 ${totalPages}`;
}

View File

@@ -16,9 +16,11 @@ const elements = {
tempmailStatus: document.getElementById('tempmail-status'),
totalEnabled: document.getElementById('total-enabled'),
// Outlook 导入
toggleOutlookImport: document.getElementById('toggle-outlook-import'),
outlookImportBody: document.getElementById('outlook-import-body'),
// Outlook 导入模态框
addOutlookBtn: document.getElementById('add-outlook-btn'),
outlookImportModal: document.getElementById('outlook-import-modal'),
closeOutlookImportModal: document.getElementById('close-outlook-import-modal'),
cancelOutlookImportBtn: document.getElementById('cancel-outlook-import-btn'),
outlookImportData: document.getElementById('outlook-import-data'),
outlookImportEnabled: document.getElementById('outlook-import-enabled'),
outlookImportPriority: document.getElementById('outlook-import-priority'),
@@ -96,11 +98,19 @@ document.addEventListener('DOMContentLoaded', () => {
// 事件监听
function initEventListeners() {
// Outlook 导入展开/收起
elements.toggleOutlookImport.addEventListener('click', () => {
const isHidden = elements.outlookImportBody.style.display === 'none';
elements.outlookImportBody.style.display = isHidden ? 'block' : 'none';
elements.toggleOutlookImport.textContent = isHidden ? '收起' : '展开';
// Outlook 添加邮箱按钮 → 打开模态框
elements.addOutlookBtn.addEventListener('click', () => {
elements.outlookImportData.value = '';
elements.importResult.style.display = 'none';
elements.outlookImportModal.classList.add('active');
});
// 关闭 Outlook 导入模态框
const closeOutlookModal = () => elements.outlookImportModal.classList.remove('active');
elements.closeOutlookImportModal.addEventListener('click', closeOutlookModal);
elements.cancelOutlookImportBtn.addEventListener('click', closeOutlookModal);
elements.outlookImportModal.addEventListener('click', (e) => {
if (e.target === elements.outlookImportModal) closeOutlookModal();
});
// Outlook 导入

View File

@@ -400,6 +400,7 @@ async function loadSettings() {
document.getElementById('email-code-timeout').value = data.email_code.timeout || 120;
document.getElementById('email-code-poll-interval').value = data.email_code.poll_interval || 3;
document.getElementById('email-code-resend-max-retries').value = data.email_code.resend_max_retries ?? 2;
document.getElementById('email-code-non-openai-sender-resend-max-retries').value = data.email_code.non_openai_sender_resend_max_retries ?? 1;
}
// 加载 Outlook 设置
@@ -565,16 +566,22 @@ async function handleSaveEmailCode(e) {
}
const resendMaxRetries = parseInt(document.getElementById('email-code-resend-max-retries').value);
const nonOpenaiSenderResendMaxRetries = parseInt(document.getElementById('email-code-non-openai-sender-resend-max-retries').value);
if (resendMaxRetries < 0 || resendMaxRetries > 10) {
toast.error('重发次数必须在 0-10 之间');
return;
}
if (nonOpenaiSenderResendMaxRetries < 0 || nonOpenaiSenderResendMaxRetries > 10) {
toast.error('非 OpenAI 发件人重发次数必须在 0-10 之间');
return;
}
const data = {
timeout: timeout,
poll_interval: pollInterval,
resend_max_retries: resendMaxRetries
resend_max_retries: resendMaxRetries,
non_openai_sender_resend_max_retries: nonOpenaiSenderResendMaxRetries
};
try {