python+vue实现一个自定义域名邮件服务器收发电子邮件代码
代码语言:python
所属分类:其他
代码描述:python+vue实现一个自定义域名邮件服务器收发电子邮件代码,采用一个python代码实现监听本地25端口接受邮件,如果要发送到其他的公网邮箱,需要通过中继服务器,毕竟你的ip没有信用度,会被当做垃圾邮件拒绝的,这个一个自己通过python一键搭建有web页面的自己域名的邮件服务器,前提是有自己的域名管理权限,先添加一个mail.yourdomin.com的二级域名a地址解析到你的邮件服务器,然后添加一个mx地址@解析到mail.yourdomin.com。
代码标签: python vue 自定义 域名 邮件 服务器 收 发 电子 邮件 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*
import asyncio
import logging
import uvicorn
import email
from email.message import EmailMessage
from collections import deque
from datetime import datetime, timedelta, timezone
from typing import List, Optional
# --- 框架和库导入 ---
from fastapi import FastAPI, Depends, HTTPException, status, Request
from fastapi.responses import HTMLResponse
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from pydantic import BaseModel
from jose import JWTError, jwt
from passlib.context import CryptContext
from aiosmtpd.controller import Controller
import aiosmtplib
# ==============================================================================
# --- 1. 配置区 (请在这里修改为你自己的信息) ---
# ==============================================================================
# --- 域名和服务器配置 ---
# 替换成你自己的域名
DOMAIN = "yourdomain.com"
# 你的邮件服务器地址,通常是 mail.yourdomain.com
SMTP_HOST = f"mail.{DOMAIN}"
# Web应用监听的IP地址,0.0.0.0 表示监听所有网络接口
WEB_HOST = "0.0.0.0"
# Web应用运行的端口
WEB_PORT = 8000
# SMTP服务器监听的端口
SMTP_PORT = 25
SMTP_RELAY_HOST = "smtp.sendgrid.net"#中继服务器,阿里云,腾讯云、cloudflare等都有提供
SMTP_RELAY_PORT = 587 # 或者 465
# 你的中继服务用户名和密码,通常是API密钥
SMTP_RELAY_USER = "apikey"
# !!! 极度重要: 在生产环境中,请务必使用环境变量等方式管理此密码 !!!
SMTP_RELAY_PASSWORD = "YOUR_SENDGRID_API_KEY"
# --- 安全和认证配置 ---
# !!! 极度重要: 在生产环境中,请务必使用环境变量等方式管理此密钥,不要硬编码在代码里 !!!
SECRET_KEY = "a-very-secret-key-for-jwt-that-should-be-in-env-vars"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 60
# --- 模拟用户数据库 ---
# 在这里定义你的用户。密码 'password' 会被自动加密。
# 你可以添加更多用户。
# 提示: 密码 'password' 加密后的哈希值是 '$2b$12$EixZaYVK1fsbw1Z2b2I.7u2F1i0a.1yg.0sFPfNqLqYq.N8.3k/h.'
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
fake_users_db = {
"admin": {
"username": "admin",
"email": f"admin@{DOMAIN}",
"hashed_password": pwd_context.hash("password"), # 初始密码是 'password'
"disabled": False,
},
"user1": {
"username": "user1",
"email": f"user1@{DOMAIN}",
"hashed_password": pwd_context.hash("strongpassword123"), # 初始密码是 'strongpassword123'
"disabled": False,
}
}
# ==============================================================================
# --- 配置区结束 ---
# ==============================================================================
# --- 日志和全局配置 ---
logging.basicConfig(level=logging.INFO)
log = logging.getLogger(__name__)
# 使用 deque 作为内存收件箱,它线程安全且可以设置最大长度
# 警告: 服务器重启后邮件会丢失!生产环境需要使用数据库或文件系统持久化。
inbox = deque(maxlen=200)
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# --- 内嵌的 Vue.js HTML 前端 (企业级UI优化) ---
HTML_TEMPLATE = """
<html lang="zh-CN"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>企业邮箱 - {DOMAIN}</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
<style>
:root {
--primary-color: #0052cc;
--primary-hover-color: #0041a3;
--primary-light-color: #eaf5ff;
--primary-lightest: #f0f7ff;
--secondary-color: #4c9aff;
--border-color: #e0e6ed;
--border-light-color: #f0f3f7;
--background-color: #f8fafc;
--background-alt-color: #ffffff;
--text-color: #1d2939;
--text-light-color: #667085;
--text-lighter-color: #94a3b8;
--white-color: #ffffff;
--danger-color: #d92d20;
--danger-hover-color: #b42318;
--danger-light-color: #fee4e2;
--success-color: #039855;
--success-light-color: #d1fadf;
--warning-color: #f79009;
--warning-light-color: #fff3cd;
--font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
--shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--transition: all 0.25s ease;
--radius-sm: 4px;
--radius: 6px;
--radius-lg: 8px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: var(--font-family);
margin: 0;
background-color: var(--background-color);
color: var(--text-color);
line-height: 1.5;
}
#app {
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
}
.login-wrapper {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
padding: 1rem;
background-color: #f0f2f5;
background-image:
radial-gradient(circle at 10% 20%, rgba(0, 82, 204, 0.03) 0%, transparent 20%),
radial-gradient(circle at 90% 80%, rgba(0, 82, 204, 0.03) 0%, transparent 20%);
}
.login-box {
background: var(--white-color);
padding: 2.5rem;
border-radius: var(--radius-lg);
box-shadow: var(--shadow-md);
width: 100%;
max-width: 420px;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.login-box:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.main-container {
display: flex;
flex-grow: 1;
overflow: hidden;
}
header {
background: var(--white-color);
padding: 0 1.5rem;
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
height: 60px;
flex-shrink: 0;
box-shadow: var(--shadow-sm);
z-index: .........完整代码请登录后点击上方下载按钮下载查看
网友评论0