├── app ├── .DS_Store ├── test │ └── page.tsx ├── globals.css ├── providers.tsx ├── layout.tsx ├── api │ ├── sse │ │ └── route.ts │ └── mail │ │ └── route.ts └── privacy │ └── page.tsx ├── img ├── display1.png └── display2.png ├── postcss.config.mjs ├── lib └── utils.ts ├── components ├── ui │ ├── aspect-ratio.tsx │ ├── skeleton.tsx │ ├── collapsible.tsx │ ├── use-mobile.tsx │ ├── textarea.tsx │ ├── label.tsx │ ├── input.tsx │ ├── separator.tsx │ ├── progress.tsx │ ├── sonner.tsx │ ├── checkbox.tsx │ ├── slider.tsx │ ├── switch.tsx │ ├── badge.tsx │ ├── tooltip.tsx │ ├── hover-card.tsx │ ├── popover.tsx │ ├── avatar.tsx │ ├── radio-group.tsx │ ├── toggle.tsx │ ├── alert.tsx │ ├── scroll-area.tsx │ ├── resizable.tsx │ ├── toggle-group.tsx │ ├── tabs.tsx │ ├── button.tsx │ ├── card.tsx │ ├── accordion.tsx │ ├── input-otp.tsx │ ├── calendar.tsx │ ├── breadcrumb.tsx │ ├── pagination.tsx │ ├── table.tsx │ ├── drawer.tsx │ ├── dialog.tsx │ ├── sheet.tsx │ ├── form.tsx │ ├── alert-dialog.tsx │ ├── command.tsx │ ├── navigation-menu.tsx │ ├── select.tsx │ ├── carousel.tsx │ ├── context-menu.tsx │ ├── dropdown-menu.tsx │ └── menubar.tsx ├── theme-provider.tsx ├── empty-state.tsx ├── feature-cards.tsx ├── sidebar.tsx ├── provider-switch-warning.tsx └── mercure-test.tsx ├── netlify.toml ├── next.config.mjs ├── .gitignore ├── components.json ├── hooks ├── use-mobile.tsx ├── use-heroui-toast.ts ├── use-smart-mail-checker.ts ├── use-mail-checker.ts └── use-mercure-sse.ts ├── tsconfig.json ├── contexts ├── mail-status-context.tsx └── api-provider-context.tsx ├── tailwind.config.js ├── types └── index.ts ├── styles └── globals.css ├── package.json ├── README.md └── README.en.md /app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonWeSif/DuckMail/HEAD/app/.DS_Store -------------------------------------------------------------------------------- /img/display1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonWeSif/DuckMail/HEAD/img/display1.png -------------------------------------------------------------------------------- /img/display2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MoonWeSif/DuckMail/HEAD/img/display2.png -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { clsx, type ClassValue } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 4 | 5 | const AspectRatio = AspectRatioPrimitive.Root 6 | 7 | export { AspectRatio } 8 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = ".next" 3 | command = "pnpm run build" 4 | 5 | [build.environment] 6 | NODE_VERSION = "18" 7 | 8 | [[redirects]] 9 | from = "/*" 10 | to = "/index.html" 11 | status = 200 12 | -------------------------------------------------------------------------------- /app/test/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | export default function TestPage() { 4 | return ( 5 |
If you can see this, the basic Next.js setup is working.
8 |
21 | 29 | {currentLocale === "en" 30 | ? "Protect your personal email address from spam, bots, phishing, and other online abuse with our free temporary disposable anonymous email service." 31 | : "使用我们的免费临时一次性匿名邮件服务,保护您的个人邮箱地址免受垃圾邮件、机器人、钓鱼和其他在线滥用的侵害。" 32 | } 33 |
34 | 35 |36 | {currentLocale === "en" 37 | ? "No commitments, no risks—just secure, instant access to a temp email address." 38 | : "无需承诺,无风险——只需安全、即时地访问临时邮箱地址。" 39 | } 40 |
41 | 42 |43 | {currentLocale === "en" 44 | ? "Powered by Mail.tm's free API service. We thank Mail.tm for providing reliable temporary email infrastructure." 45 | : "由 Mail.tm 的免费 API 服务提供支持。我们感谢 Mail.tm 提供可靠的临时邮件基础设施。" 46 | } 47 |
48 | 49 | {!isAuthenticated && ( 50 | 53 | )} 54 |{feature.description}
66 |75 | {currentLocale === "en" 76 | ? "Powered by Mail.tm's free API service. Special thanks to Mail.tm for providing reliable temporary email infrastructure that makes this service possible." 77 | : "由 Mail.tm 的免费 API 服务提供支持。特别感谢 Mail.tm 提供可靠的临时邮件基础设施,使这项服务成为可能。" 78 | } 79 |
80 |
62 |
3 |
4 | # DuckMail - 临时邮件服务
5 |
6 | **安全、即时、快速的临时邮箱服务**
7 |
8 | [English](./README.en.md) | 中文
9 |
10 | 一个基于 Next.js 和 Mail.tm API 构建的现代化临时邮件服务,提供安全、快速、匿名的一次性邮箱功能。
11 |
12 | **🌐 [立即使用 duckmail.sbs](https://duckmail.sbs)**
13 |
32 | 主界面 - 简洁现代的设计
33 | 34 |
35 | 邮件管理 - 实时接收和管理临时邮件
36 |163 | {body} 164 |
165 | ) 166 | }) 167 | FormMessage.displayName = "FormMessage" 168 | 169 | export { 170 | useFormField, 171 | Form, 172 | FormItem, 173 | FormLabel, 174 | FormControl, 175 | FormDescription, 176 | FormMessage, 177 | FormField, 178 | } 179 | -------------------------------------------------------------------------------- /components/ui/alert-dialog.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog" 5 | 6 | import { cn } from "@/lib/utils" 7 | import { buttonVariants } from "@/components/ui/button" 8 | 9 | const AlertDialog = AlertDialogPrimitive.Root 10 | 11 | const AlertDialogTrigger = AlertDialogPrimitive.Trigger 12 | 13 | const AlertDialogPortal = AlertDialogPrimitive.Portal 14 | 15 | const AlertDialogOverlay = React.forwardRef< 16 | React.ElementRef62 | {isZh 63 | ? "切换到不同的 API 提供商将会影响您的账户访问。每个账户都绑定到特定的提供商。" 64 | : "Switching to a different API provider will affect your account access. Each account is bound to a specific provider." 65 | } 66 |
67 |77 | {isZh 78 | ? `您正在从当前提供商切换到 ${newProvider.name}` 79 | : `You are switching from current provider to ${newProvider.name}` 80 | } 81 |
82 |113 | {isZh 114 | ? "这些账户在新提供商中将不可用。您需要在新提供商中创建新账户。" 115 | : "These accounts will not be available in the new provider. You'll need to create new accounts in the new provider." 116 | } 117 |
118 |
3 |
4 | # DuckMail - Temporary Email Service
5 |
6 | **Secure, Instant, Fast Temporary Email Service**
7 |
8 | English | [中文](./README.md)
9 |
10 | A modern temporary email service built with Next.js and Mail.tm API, providing secure, fast, and anonymous disposable email functionality.
11 |
12 | **🌐 [Try it now at duckmail.sbs](https://duckmail.sbs)**
13 |
36 | Main Interface - Clean and Modern Design
37 | 38 |
39 | Email Management - Real-time Email Reception and Management
40 |请先登录账户以测试 Mercure 功能
118 |账户ID: {currentAccount.id}
162 |Mercure Topic: /accounts/{currentAccount.id}
163 |事件数量: {events.length}
164 |暂无事件
177 | ) : ( 178 | events.map((event, index) => ( 179 |
195 | {JSON.stringify(event.data, null, 2)}
196 |
197 | ) : (
198 | event.message
199 | )}
200 |