fix: env
This commit is contained in:
1 parent
249f49e5fb
commit
aec9baa160
5 files changed
+91
-12
No files matched your search
@@ -1,10 +1,10 @@
|
||||
import React from 'react';
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import LanguageSwitcher from './LanguageSwitcher';
|
||||
import HeaderMailbox from './HeaderMailbox';
|
||||
import Container from './Container';
|
||||
import { EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config';
|
||||
import { getEmailDomains, getDefaultEmailDomain, EMAIL_DOMAINS, DEFAULT_EMAIL_DOMAIN } from '../config';
|
||||
|
||||
interface HeaderProps {
|
||||
mailbox: Mailbox | null;
|
||||
@@ -18,6 +18,25 @@ const Header: React.FC<HeaderProps> = ({
|
||||
isLoading = false
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const [emailDomains, setEmailDomains] = useState<string[]>(EMAIL_DOMAINS);
|
||||
const [defaultDomain, setDefaultDomain] = useState<string>(DEFAULT_EMAIL_DOMAIN);
|
||||
|
||||
// 异步获取邮箱域名配置
|
||||
useEffect(() => {
|
||||
const loadConfig = async () => {
|
||||
try {
|
||||
const domains = await getEmailDomains();
|
||||
const defaultDom = await getDefaultEmailDomain();
|
||||
setEmailDomains(domains);
|
||||
setDefaultDomain(defaultDom);
|
||||
} catch (error) {
|
||||
console.error('加载邮箱域名配置失败:', error);
|
||||
// 保持使用默认值
|
||||
}
|
||||
};
|
||||
|
||||
loadConfig();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<header className="border-b">
|
||||
@@ -32,8 +51,8 @@ const Header: React.FC<HeaderProps> = ({
|
||||
<HeaderMailbox
|
||||
mailbox={mailbox}
|
||||
onMailboxChange={onMailboxChange}
|
||||
domain={DEFAULT_EMAIL_DOMAIN}
|
||||
domains={EMAIL_DOMAINS}
|
||||
domain={defaultDomain}
|
||||
domains={emailDomains}
|
||||
isLoading={isLoading}
|
||||
/>
|
||||
<div className="ml-3 pl-3 border-l border-muted-foreground/20 flex items-center">
|
||||
@@ -57,4 +76,4 @@ const Header: React.FC<HeaderProps> = ({
|
||||
);
|
||||
};
|
||||
|
||||
export default Header;
|
||||
export default Header;
|
||||
+41
-4
@@ -1,12 +1,49 @@
|
||||
// 配置文件,用于管理域名和API地址设置
|
||||
|
||||
// 邮箱域名配置
|
||||
export const EMAIL_DOMAINS = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim());
|
||||
export const DEFAULT_EMAIL_DOMAIN = EMAIL_DOMAINS[0] || '';
|
||||
// 邮箱域名配置 - 从 API 动态获取
|
||||
let cachedEmailDomains: string[] | null = null;
|
||||
let configLoaded = false;
|
||||
|
||||
// 从 API 获取邮箱域名配置
|
||||
export async function getEmailDomains(): Promise<string[]> {
|
||||
if (cachedEmailDomains && configLoaded) {
|
||||
return cachedEmailDomains;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/config');
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
if (data.success && data.config.emailDomains) {
|
||||
cachedEmailDomains = data.config.emailDomains;
|
||||
configLoaded = true;
|
||||
return cachedEmailDomains!;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取邮箱域名配置失败:', error);
|
||||
}
|
||||
|
||||
// 如果 API 获取失败,使用环境变量作为后备
|
||||
const fallbackDomains = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim()).filter(domain => domain);
|
||||
cachedEmailDomains = fallbackDomains.length > 0 ? fallbackDomains : ['example.com'];
|
||||
configLoaded = true;
|
||||
return cachedEmailDomains!;
|
||||
}
|
||||
|
||||
// 获取默认邮箱域名
|
||||
export async function getDefaultEmailDomain(): Promise<string> {
|
||||
const domains = await getEmailDomains();
|
||||
return domains[0] || 'example.com';
|
||||
}
|
||||
|
||||
// 同步版本的邮箱域名配置(用于向后兼容)
|
||||
export const EMAIL_DOMAINS = (import.meta.env.VITE_EMAIL_DOMAIN || '').split(',').map(domain => domain.trim()).filter(domain => domain) || ['example.com'];
|
||||
export const DEFAULT_EMAIL_DOMAIN = EMAIL_DOMAINS[0] || 'example.com';
|
||||
|
||||
// API地址配置
|
||||
export const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || '';
|
||||
|
||||
// 其他配置
|
||||
export const DEFAULT_AUTO_REFRESH = false;
|
||||
export const AUTO_REFRESH_INTERVAL = 10000; // 10秒
|
||||
export const AUTO_REFRESH_INTERVAL = 10000; // 10秒
|
||||
+2
-2
@@ -41,7 +41,7 @@ export default {
|
||||
},
|
||||
|
||||
// 处理邮件
|
||||
async email(message: any, env: Env, ctx: ExecutionContext): Promise<void> {
|
||||
async email(message: any, env: Env, _ctx: ExecutionContext): Promise<void> {
|
||||
try {
|
||||
await handleEmail(message, env);
|
||||
} catch (error) {
|
||||
@@ -51,7 +51,7 @@ export default {
|
||||
},
|
||||
|
||||
// 定时任务 - 每小时清理过期邮箱以及过期邮件和已被阅读的邮件
|
||||
async scheduled(event: ScheduledEvent, env: Env, ctx: ExecutionContext): Promise<void> {
|
||||
async scheduled(_event: ScheduledEvent, env: Env, _ctx: ExecutionContext): Promise<void> {
|
||||
try {
|
||||
const deleted = await cleanupExpiredMailboxes(env.DB);
|
||||
console.log(`已清理 ${deleted} 个过期邮箱`);
|
||||
|
||||
@@ -29,6 +29,28 @@ app.get('/', (c) => {
|
||||
return c.json({ status: 'ok', message: '临时邮箱系统API正常运行' });
|
||||
});
|
||||
|
||||
// 获取系统配置
|
||||
app.get('/api/config', (c) => {
|
||||
try {
|
||||
const emailDomains = c.env.VITE_EMAIL_DOMAIN || '';
|
||||
const domains = emailDomains.split(',').map((domain: string) => domain.trim()).filter((domain: string) => domain);
|
||||
|
||||
return c.json({
|
||||
success: true,
|
||||
config: {
|
||||
emailDomains: domains
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('获取配置失败:', error);
|
||||
return c.json({
|
||||
success: false,
|
||||
error: '获取配置失败',
|
||||
message: error instanceof Error ? error.message : String(error)
|
||||
}, 500);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// 创建邮箱
|
||||
app.post('/api/mailboxes', async (c) => {
|
||||
|
||||
+2
-1
@@ -3,6 +3,7 @@ import { D1Database } from '@cloudflare/workers-types';
|
||||
// 环境变量类型
|
||||
export interface Env {
|
||||
DB: D1Database;
|
||||
VITE_EMAIL_DOMAIN?: string;
|
||||
}
|
||||
|
||||
// 邮箱类型
|
||||
@@ -105,7 +106,7 @@ export interface SaveAttachmentParams {
|
||||
}
|
||||
|
||||
// API 响应类型
|
||||
export interface ApiResponse<T> {
|
||||
export interface ApiResponse {
|
||||
success: boolean;
|
||||
error?: string;
|
||||
message?: string;
|
||||
|
||||
Reference in new issue
Block a user