+
33
-

python如何开发一个自定义域名后缀的邮箱系统及登录发送邮件管理web页面?

python如何开发一个自定义域名后缀的邮箱系统及登录发送邮件管理web页面?


网友回复

+
28
-

需要使用linux+Postfix/Dovecot+mysql+python实现:

项目蓝图 (Architecture)

操作系统: Ubuntu 22.04 LTS

MTA: Postfix

IMAP/Auth: Dovecot

数据库: MariaDB (MySQL 的一个流行分支)

管理后台: Python 3 + Django

Web 服务器: Nginx + Gunicorn

数据流:用户通过浏览器访问 Django 管理后台 -> Django 将域名/用户信息写入 MariaDB 数据库 -> Postfix 和 Dovecot 读取 MariaDB 中的信息来收发邮件和验证用户。

第一阶段:服务器基础和数据库设置

在你的服务器上,以 root 或 sudo 权限执行以下命令。

1. 安装软件包
sudo apt update
sudo apt install -y postfix postfix-mysql mariadb-server python3-pip python3-dev libmysqlclient-dev nginx curl
# 在安装 Postfix 的过程中,会有一个图形化配置界面:
# 1. 选择 'Internet Site'.
# 2. 'System mail name' 处填写你的主域名,例如 'mydomain.com'.
2. 配置 MariaDB (MySQL) 数据库
sudo mysql_secure_installation # 运行安全脚本,设置 root 密码等

# 登录数据库
sudo mysql -u root -p

# 创建数据库和用户 (在 MySQL shell 中执行)
CREATE DATABASE mailserver CHARACTER SET 'utf8mb4';
CREATE USER 'mail_admin'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD_HERE';
GRANT SELECT ON mailserver.* TO 'mail_admin'@'localhost';
FLUSH PRIVILEGES;
3. 在数据库中创建邮件系统所需的表

继续在 MySQL shell 中执行。这是我们邮件系统的核心数据结构。

USE mailserver;

-- 存放所有可用的虚拟域名
CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 存放所有虚拟邮箱账户
CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `email` varchar(120) NOT NULL,
  `password` varchar(150) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 存放邮件别名,例如 postmaster@... -> admin@...
CREATE TABLE `virtual_aliases` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `source` varchar(100) NOT NULL,
  `destination` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 退出数据库
EXIT;

第二阶段:Python Django 管理后台开发

这是你要求的核心代码部分。我们将创建一个 Django 项目来管理上述数据库表。

1. 创建 Python 环境和 Django 项目
# 创建项目目录
mkdir /opt/mailadmin
cd /opt/mailadmin

# 创建并激活 Python 虚拟环境
python3 -m venv venv
source venv/bin/activate

# 安装必要的库
pip install django gunicorn pymysql crypt # crypt 用于生成 dovecot 密码

# 创建 Django 项目和 App
django-admin startproject mailadmin .
python manage.py startapp core
2. 配置 Django (mailadmin/settings.py)

打开 mailadmin/settings.py 文件,进行如下修改:

# mailadmin/settings.py

# ... (保留原有内容)

# 在 INSTALLED_APPS 列表中加入我们的 app
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'core', # 添加我们的 app
]

# ...

# 配置数据库连接
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mailserver',
        'USER': 'mail_admin',
        'PASSWORD': 'STRONG_PASSWORD_HERE', # 填写你设置的密码
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

# ...

注意: Django 默认使用 mysqlclient,但 PyMySQL 更容易安装。在 mailadmin/__init__.py 文件中加入以下代码,让 Django 使用 PyMySQL:

# mailadmin/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
3. 创建数据模型 (core/models.py)

打开 core/models.py,写入以下代码。这些模型将与我们之前创建的数据库表一一对应。

# core/models.py
from django.db import models
from django.core.exceptions import ValidationError
import crypt

# Dovecot/Postfix 需要特定的密码格式, 例如 SHA512-CRYPT
def create_dovecot_password(plain_password):
    """Generates a password hash compatible with Dovecot's SHA512-CRYPT."""
    if not plain_password:
        return ""
    # 使用 SHA512-CRYPT...

点击查看剩余70%

我知道答案,我要回答