diff --git a/.github/workflows/unitTest.yml b/.github/workflows/unitTest.yml index 376204f..2c5491d 100644 --- a/.github/workflows/unitTest.yml +++ b/.github/workflows/unitTest.yml @@ -26,7 +26,10 @@ jobs: MYSQL_DATABASE: pmail MYSQL_ROOT_PASSWORD: githubTest options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - + postgres: + image: postgres + env: + POSTGRESQL_PASSWORD: githubTest container: image: golang env: diff --git a/Makefile b/Makefile index f5acc3a..8411efa 100644 --- a/Makefile +++ b/Makefile @@ -53,4 +53,7 @@ test: export setup_port=17888 && cd server && go test -v ./... test_mysql: - export setup_port=17888 && cd server && go test -args "mysql" -v ./... \ No newline at end of file + export setup_port=17888 && cd server && go test -args "mysql" -v ./... + +test_postgres: + export setup_port=17888 && cd server && go test -args "postgres" -v ./... \ No newline at end of file diff --git a/README.md b/README.md index 0f9dee1..cb7b7b7 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ beautiful and cute Logo for this project! > service doesn't use the certificate anymore, the smtp protocol still needs the certificate) * Support pop3, smtp protocol, you can use any mail client you like. - +* Support multi-domain, multi-user and complete support for sending and receiving e-mail. # How to run diff --git a/README_CN.md b/README_CN.md index b593870..017f1c9 100644 --- a/README_CN.md +++ b/README_CN.md @@ -39,6 +39,9 @@ PMail是一个追求极简部署流程、极致资源占用的个人域名邮箱 只要支持pop3、smtp协议的邮件客户端均可使用 +### 6、多域名、多用户支持 + +支持多域名、多用户且完整支持收发邮件 # 如何部署 diff --git a/docs/cn.gif b/docs/cn.gif index 05e8f7d..ad9f93a 100644 Binary files a/docs/cn.gif and b/docs/cn.gif differ diff --git a/docs/en.gif b/docs/en.gif index 3f9e45c..051e228 100644 Binary files a/docs/en.gif and b/docs/en.gif differ diff --git a/fe/src/i18n/i18n.js b/fe/src/i18n/i18n.js index acdc58a..1a28bc8 100644 --- a/fe/src/i18n/i18n.js +++ b/fe/src/i18n/i18n.js @@ -19,9 +19,9 @@ var lang = { "sender": "Sender", "title": "Title", "date": "Date", - "to": "To:", - "cc": "Cc:", - "sender_desc": "Only the email prefix is required", + "to": "To", + "cc": "Cc", + "sender_desc": "Sender", "to_desc": "Recipient's e-mail address", "cc_desc": "Cc's e-mail address", "send": "send", @@ -44,6 +44,7 @@ var lang = { "SetDomail": "Set Domain", "setDNS": "Set DNS", "setSSL": "Set SSL", + "dns_root_desc": "Fill in the \"@\" or empty, as determined by your domain name service provider.", "setDatabase": "Set Database", "setAdminPassword": "Set Password", "admin_account": "Administrator Account", @@ -57,10 +58,13 @@ var lang = { "type": "Type", "db_select_ph": "please select your database", "mysql_dsn": "MySQL DSN", + "pg_dsn": "PostgreSQL DSN", "sqlite_db_path": "Data File Path", "domain_desc": "Set your domain infomation.", "smtp_domain": "SMTP Domain", "web_domain": "Web Domain", + "multi_domain_setting": "Multi-Domain Setting", + "multi_domain_setting_desc": "Bind this mailbox to multiple domains.", "dns_desc": "Please add the following information to your DNS records", "ssl_auto": "Automatically configure SSL certificates (recommended)", "wait_desc": "Please Wait.", @@ -89,8 +93,6 @@ var lang = { "rule_do":"Do the following:", "from":"From Email Address", "subject":"Email Subject", - "to":"Recipient's address", - "cc":"Cc's address", "content":"Email Content", "equal":"Equal", "regex":"Regex Match", @@ -127,9 +129,9 @@ var zhCN = { "sender": "发件人", "title": "主题", "date": "时间", - "to": "收件人:", - "cc": "抄送:", - "sender_desc": "只需要邮箱前缀", + "to": "收件人", + "cc": "抄送", + "sender_desc": "发件人", "to_desc": "接收人邮件地址", "cc_desc": "抄送人邮箱地址", "send": "发送", @@ -150,6 +152,9 @@ var zhCN = { "settings": "设置", "security": "安全", "SetDomail": "域名设置", + "dns_root_desc": "填入@或者空,不同域名服务商写法不同", + "multi_domain_setting": "多域名设置", + "multi_domain_setting_desc": "将此邮箱绑定到多个域名上", "setDNS": "DNS设置", "setSSL": "SSL设置", "setDatabase": "数据库设置", @@ -165,6 +170,7 @@ var zhCN = { "type": "类型", "db_select_ph": "请选择你的数据库", "mysql_dsn": "MySQL DSN", + "pg_dsn": "PostgreSQL DSN", "sqlite_db_path": "存储位置", "domain_desc": "设置你的域名信息。", "smtp_domain": "SMTP域名地址", @@ -197,8 +203,6 @@ var zhCN = { "rule_do":"执行操作:", "from":"发件人地址", "subject":"邮件主题", - "to":"收件人地址", - "cc":"抄送地址", "content":"邮件内容", "equal":"等于", "regex":"正则匹配", diff --git a/fe/src/views/EditerView.vue b/fe/src/views/EditerView.vue index b523e8d..a1c9ae8 100644 --- a/fe/src/views/EditerView.vue +++ b/fe/src/views/EditerView.vue @@ -2,7 +2,15 @@
- + +
+ +
@
+ + {{ item }} + +
+
@@ -84,7 +92,7 @@ import lang from '../i18n/i18n'; import { Editor, Toolbar } from '@wangeditor/editor-for-vue' import { i18nChangeLanguage } from '@wangeditor/editor' import { useRouter } from 'vue-router'; -const router = useRouter(); +const router = useRouter(); import useGroupStore from '../stores/group' const groupStore = useGroupStore() import { getCurrentInstance } from 'vue' @@ -93,9 +101,9 @@ const $http = app.appContext.config.globalProperties.$http const $isLogin = app.appContext.config.globalProperties.$isLogin const $userInfos = app.appContext.config.globalProperties.$userInfos -if (lang.lang == "zhCn"){ +if (lang.lang == "zhCn") { i18nChangeLanguage('zh-CN') -}else{ +} else { i18nChangeLanguage('en') } @@ -123,15 +131,20 @@ const ruleForm = reactive({ receivers: '', cc: '', subject: '', + domains:[], + pickDomain:"" }) const fileList = reactive([]); -const init =function(){ +const init = function () { if (Object.keys($userInfos.value).length == 0) { $http.post("/api/user/info", {}).then(res => { if (res.errorNo == 0) { $userInfos.value = res.data + ruleForm.sender = res.data.account + ruleForm.domains = res.data.domains + ruleForm.pickDomain = res.data.domains[0] } else { ElMessage({ type: 'error', @@ -139,10 +152,14 @@ const init =function(){ }) } }) + }else{ + ruleForm.sender = $userInfos.value.account + ruleForm.domains = $userInfos.value.domains + ruleForm.pickDomain = $userInfos.value.domains[0] } + } init() -ruleForm.sender = $userInfos.value.account const validateSender = function (rule, value, callback) { @@ -240,7 +257,7 @@ const send = function (formEl) { let text = editorRef.value.getText() $http.post("/api/email/send", { - from: { name: ruleForm.sender, email: "" }, + from: { name: ruleForm.sender, email: ruleForm.sender + "@" +ruleForm.pickDomain }, to: objectTos, cc: objectCcs, subject: ruleForm.subject, diff --git a/fe/src/views/EmailDetailView.vue b/fe/src/views/EmailDetailView.vue index e5c43df..a928588 100644 --- a/fe/src/views/EmailDetailView.vue +++ b/fe/src/views/EmailDetailView.vue @@ -4,13 +4,27 @@
- {{ lang.to }}: - {{ to.Name }} {{ to.EmailAddress }} ; - - - {{ lang.cc }}: - {{ cc.Name }} {{ cc.EmailAddress }} ; - +
{{ lang.to }}: + + {{to.Name != '' ? to.Name : to.EmailAddress }} + +
+ +
{{ lang.cc }}: + + {{item.Name != '' ? item.Name : item.EmailAddress }} + +
+ +
{{ lang.sender }}: + + {{detailData.from_name != '' ? detailData.from_name : detailData.from_address }} + +
+ +
{{ lang.date }}: + {{ detailData.send_date }} +
diff --git a/fe/src/views/ListView.vue b/fe/src/views/ListView.vue index d314635..747f310 100644 --- a/fe/src/views/ListView.vue +++ b/fe/src/views/ListView.vue @@ -17,7 +17,7 @@ @@ -26,43 +26,43 @@ - + + + + + +