Skip to content

Commit

Permalink
feature/2.7.4 (#215)
Browse files Browse the repository at this point in the history
1、SSL renew过程添加挑战适配器
2、转发邮件保留原始收件人地址
3、支持密送功能
4、升级所有依赖包
  • Loading branch information
Jinnrry authored Oct 5, 2024
1 parent 9e1a14f commit 2231172
Show file tree
Hide file tree
Showing 12 changed files with 231 additions and 146 deletions.
6 changes: 5 additions & 1 deletion fe/src/i18n/i18n.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,11 @@ let lang = {
"date": "Date",
"to": "To",
"cc": "Cc",
"bcc": "Bcc",
"sender_desc": "Sender",
"to_desc": "Recipient's e-mail address",
"cc_desc": "Cc's e-mail address",
"cc_desc": "CC's e-mail address",
"bcc_desc": "BCC's e-mail address",
"send": "send",
"add_att": "Add Attachment",
"attachment": "Attachment",
Expand Down Expand Up @@ -135,9 +137,11 @@ const zhCN = {
"date": "时间",
"to": "收件人地址",
"cc": "抄送人地址",
"bcc": "密送人地址",
"sender_desc": "发件人",
"to_desc": "接收人邮件地址",
"cc_desc": "抄送人邮箱地址",
"bcc_desc": "密送人邮箱地址",
"send": "发送",
"add_att": "添加附件",
"attachment": "附件",
Expand Down
31 changes: 31 additions & 0 deletions fe/src/views/EditerView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@
:reserve-keyword="false" :placeholder="lang.cc_desc"></el-select>
</el-form-item>

<el-form-item :label="lang.bcc" prop="bcc">
<el-select v-model="ruleForm.bcc" style="width: 100%;" multiple filterable allow-create
:reserve-keyword="false" :placeholder="lang.bcc_desc"></el-select>
</el-form-item>

<el-form-item :label="lang.title" prop="subject">
<el-input v-model="ruleForm.subject" :placeholder="lang.title"></el-input>
Expand Down Expand Up @@ -153,6 +157,7 @@ const ruleForm = reactive({
sender: '',
receivers: '',
cc: '',
bcc: '',
subject: '',
domains: [],
pickDomain: ""
Expand Down Expand Up @@ -216,6 +221,19 @@ const validateCc = function (rule, value, callback) {
callback()
}
const validateBcc = function (rule, value, callback) {
for (let index = 0; index < ruleForm.bcc.length; index++) {
let element = ruleForm.bcc[index];
console.log(element)
if (!checkEmail(element)) {
callback(new Error(lang.err_email_format))
return
}
}
callback()
}
const rules = reactive({
sender: [
{validator: validateSender, trigger: 'change'}
Expand All @@ -226,6 +244,9 @@ const rules = reactive({
cc: [
{validator: validateCc, trigger: 'change'}
],
bcc: [
{validator: validateBcc, trigger: 'change'}
],
subject: [
{required: true, message: lang.err_title_must, trigger: 'change'},
],
Expand Down Expand Up @@ -267,12 +288,22 @@ const send = function (formEl) {
})
}
let objectBccs = []
for (let index = 0; index < ruleForm.bcc.length; index++) {
let element = ruleForm.bcc[index];
objectBccs.push({
name: "",
email: element
})
}
let text = editorRef.value.getText()
http.post("/api/email/send", {
from: {name: ruleForm.nickName, email: ruleForm.sender + "@" + ruleForm.pickDomain},
to: objectTos,
cc: objectCcs,
bcc: objectBccs,
subject: ruleForm.subject,
text: text,
html: valueHtml.value,
Expand Down
79 changes: 70 additions & 9 deletions server/dto/parsemail/email.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ package parsemail

import (
"bytes"
"encoding/json"
"fmt"
"github.com/Jinnrry/pmail/config"
"github.com/Jinnrry/pmail/models"
"github.com/Jinnrry/pmail/utils/context"
"github.com/emersion/go-message"
_ "github.com/emersion/go-message/charset"
"github.com/emersion/go-message/mail"
log "github.com/sirupsen/logrus"
"github.com/spf13/cast"
"io"
"net/textproto"
"regexp"
Expand Down Expand Up @@ -57,6 +60,45 @@ type Email struct {
Size int
}

func NewEmailFromModel(d models.Email) *Email {

var To []*User
json.Unmarshal([]byte(d.To), &To)

var ReplyTo []*User
json.Unmarshal([]byte(d.ReplyTo), &ReplyTo)

var Sender *User
json.Unmarshal([]byte(d.Sender), &Sender)

var Bcc []*User
json.Unmarshal([]byte(d.Bcc), &Bcc)

var Cc []*User
json.Unmarshal([]byte(d.Cc), &Cc)

var Attachments []*Attachment
json.Unmarshal([]byte(d.Attachments), &Attachments)

return &Email{
MessageId: cast.ToInt64(d.Id),
From: &User{
Name: d.FromName,
EmailAddress: d.FromAddress,
},
To: To,
Subject: d.Subject,
Text: []byte(d.Text.String),
HTML: []byte(d.Html.String),
Sender: Sender,
ReplyTo: ReplyTo,
Bcc: Bcc,
Cc: Cc,
Attachments: Attachments,
Date: d.SendDate.Format("2006-01-02 15:04:05"),
}
}

func NewEmailFromReader(to []string, r io.Reader, size int) *Email {
ret := &Email{}
m, err := message.Read(r)
Expand All @@ -67,10 +109,24 @@ func NewEmailFromReader(to []string, r io.Reader, size int) *Email {
ret.Size = size
ret.From = buildUser(m.Header.Get("From"))

if len(to) > 0 {
ret.To = buildUsers(to)
} else {
ret.To = buildUsers(m.Header.Values("To"))
smtpTo := buildUsers(to)

ret.To = buildUsers(m.Header.Values("To"))

ret.Bcc = []*User{}

for _, user := range smtpTo {
in := false
for _, u := range ret.To {
if u.EmailAddress == user.EmailAddress {
in = true
break
}
}
if !in {
ret.Bcc = append(ret.Bcc, user)
}

}

ret.Cc = buildUsers(m.Header.Values("Cc"))
Expand Down Expand Up @@ -191,20 +247,24 @@ func buildUsers(str []string) []*User {
return ret
}

func (e *Email) ForwardBuildBytes(ctx *context.Context, forwardAddress string) []byte {
func (e *Email) ForwardBuildBytes(ctx *context.Context, sender *models.User) []byte {
var b bytes.Buffer

from := []*mail.Address{{e.From.Name, e.From.EmailAddress}}
to := []*mail.Address{
{
Address: forwardAddress,
},
to := []*mail.Address{}
for _, user := range e.To {
to = append(to, &mail.Address{
Name: user.Name,
Address: user.EmailAddress,
})
}

senderAddress := []*mail.Address{{sender.Name, fmt.Sprintf("%s@%s", sender.Account, config.Instance.Domains[0])}}
// Create our mail header
var h mail.Header
h.SetDate(time.Now())
h.SetAddressList("From", from)
h.SetAddressList("Sender", senderAddress)
h.SetAddressList("To", to)
h.SetText("Subject", e.Subject)
h.SetMessageID(fmt.Sprintf("%d@%s", e.MessageId, config.Instance.Domain))
Expand Down Expand Up @@ -297,6 +357,7 @@ func (e *Email) BuildBytes(ctx *context.Context, dkim bool) []byte {
}
h.SetMessageID(fmt.Sprintf("%d@%s", e.MessageId, config.Instance.Domain))
h.SetAddressList("From", from)
h.SetAddressList("Sender", from)
h.SetAddressList("To", to)
h.SetText("Subject", e.Subject)
if len(e.Cc) != 0 {
Expand Down
31 changes: 16 additions & 15 deletions server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@ require (
github.com/alexedwards/scs/postgresstore v0.0.0-20240316134038-7e11d57e8885
github.com/alexedwards/scs/sqlite3store v0.0.0-20240316134038-7e11d57e8885
github.com/alexedwards/scs/v2 v2.8.0
github.com/dlclark/regexp2 v1.11.2
github.com/dlclark/regexp2 v1.11.4
github.com/emersion/go-message v0.18.1
github.com/emersion/go-msgauth v0.6.8
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43
github.com/emersion/go-smtp v0.21.3
github.com/go-acme/lego/v4 v4.17.4
github.com/go-acme/lego/v4 v4.18.0
github.com/go-sql-driver/mysql v1.8.1
github.com/lib/pq v1.10.9
github.com/mileusna/spf v0.9.5
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cast v1.6.0
golang.org/x/crypto v0.25.0
golang.org/x/text v0.16.0
modernc.org/sqlite v1.30.1
github.com/spf13/cast v1.7.0
golang.org/x/crypto v0.27.0
golang.org/x/text v0.18.0
modernc.org/sqlite v1.33.1
xorm.io/builder v0.3.13
xorm.io/xorm v1.3.9
)
Expand All @@ -30,14 +30,14 @@ require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/go-jose/go-jose/v4 v4.0.3 // indirect
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/miekg/dns v1.1.61 // indirect
github.com/miekg/dns v1.1.62 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
Expand All @@ -47,13 +47,14 @@ require (
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
golang.org/x/mod v0.19.0 // indirect
golang.org/x/net v0.27.0 // indirect
golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.22.0 // indirect
golang.org/x/tools v0.23.0 // indirect
modernc.org/gc/v3 v3.0.0-20240304020402-f0dba7c97c2b // indirect
modernc.org/libc v1.54.4 // indirect
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect
golang.org/x/mod v0.21.0 // indirect
golang.org/x/net v0.29.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.25.0 // indirect
golang.org/x/tools v0.25.0 // indirect
modernc.org/gc/v3 v3.0.0-20240801135723-a856999a2e4a // indirect
modernc.org/libc v1.61.0 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
modernc.org/strutil v1.2.0 // indirect
Expand Down
Loading

0 comments on commit 2231172

Please sign in to comment.