From 0ef04823abbc917812f7ebd6d571524fe7f2042a Mon Sep 17 00:00:00 2001 From: smail Date: Sun, 27 Sep 2026 20:51:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E6=94=B6=E4=BB=B6=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=85=A5=E5=8F=A3=E5=B9=B6=E9=99=90=E5=88=B6=E5=8E=9F?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=BD=92=E5=B1=9E=E4=B8=8E=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/controllers/email/reply.go | 3 ++- backend/listen/imap_server/session_fetch.go | 1 - frontend/src/i18n/i18n.js | 1 + frontend/src/views/Editer/Reply.js | 1 + frontend/src/views/EmailDetail/EmailDetail.js | 2 +- frontend/src/views/EmailDetail/EmailDetail.vue | 8 ++++++++ 6 files changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/controllers/email/reply.go b/backend/controllers/email/reply.go index c22c262e..77b05b69 100644 --- a/backend/controllers/email/reply.go +++ b/backend/controllers/email/reply.go @@ -18,7 +18,7 @@ func applyReplyThread(ctx *context.Context, input sendRequest, message *parsemai if id == 0 { return nil } - if id < 0 || ctx == nil || ctx.UserID <= 0 || db.Instance == nil || message == nil { + if id < 0 || ctx == nil || ctx.UserID <= 0 || db.Instance == nil { return validation.ErrInvalidEmail } if input.DraftID > 0 { @@ -37,6 +37,7 @@ func applyReplyThread(ctx *context.Context, input sendRequest, message *parsemai var original models.Email found, err := db.Instance.ID(id). Where("status <> ?", consts.EmailStatusDrafts). + And("type = ?", consts.EmailTypeReceive). And("EXISTS (SELECT 1 FROM user_email WHERE email_id = ? AND user_id = ? AND is_deleted = 0)", id, ctx.UserID). Get(&original) if err != nil { diff --git a/backend/listen/imap_server/session_fetch.go b/backend/listen/imap_server/session_fetch.go index 1d1befc9..c6e878d4 100644 --- a/backend/listen/imap_server/session_fetch.go +++ b/backend/listen/imap_server/session_fetch.go @@ -103,7 +103,6 @@ func buildEnvelope(email *response.EmailResponseData, traEmail *parsemail.Email) Bcc: usersToAddresses(traEmail.Bcc), MessageID: messageID, InReplyTo: parsemail.ThreadMessageIDs(email.InReplyTo), - // InReplyTo 和 References 暂不支持 } } diff --git a/frontend/src/i18n/i18n.js b/frontend/src/i18n/i18n.js index 1ee814e6..711998cf 100644 --- a/frontend/src/i18n/i18n.js +++ b/frontend/src/i18n/i18n.js @@ -1,5 +1,6 @@ // 管理后台统一使用中文。 const lang = { + "mail_reply": "回复", "mail_no_subject": "(无主题)", "draft_save": "保存草稿", "draft_saved": "草稿已保存", diff --git a/frontend/src/views/Editer/Reply.js b/frontend/src/views/Editer/Reply.js index 6bc963ac..4618fc9c 100644 --- a/frontend/src/views/Editer/Reply.js +++ b/frontend/src/views/Editer/Reply.js @@ -23,6 +23,7 @@ const plainBody = message => { } export function prepareReply(message, identity) { + if (message.type !== 0) throw new Error(lang.fail) const replyTo = readAddresses(message.reply_to) const recipients = replyTo.length ? replyTo : [{EmailAddress: message.from_address, Name: message.from_name}] if (!recipients.length || recipients.some(item => !item.EmailAddress || /[\r\n]/.test(item.EmailAddress))) { diff --git a/frontend/src/views/EmailDetail/EmailDetail.js b/frontend/src/views/EmailDetail/EmailDetail.js index 29794f86..d4c066ad 100644 --- a/frontend/src/views/EmailDetail/EmailDetail.js +++ b/frontend/src/views/EmailDetail/EmailDetail.js @@ -93,7 +93,7 @@ export function usePage() { const backToList = () => router.push({name: 'list'}) const handleReply = () => { const id = Number(detailData.value.id) - if (loading.value || loadError.value || !Number.isSafeInteger(id) || id <= 0) return + if (loading.value || loadError.value || detailData.value.type !== 0 || !Number.isSafeInteger(id) || id <= 0) return return router.push({name: 'editer', query: {reply: String(id)}}) } diff --git a/frontend/src/views/EmailDetail/EmailDetail.vue b/frontend/src/views/EmailDetail/EmailDetail.vue index b0bdd1e4..72bb8b79 100644 --- a/frontend/src/views/EmailDetail/EmailDetail.vue +++ b/frontend/src/views/EmailDetail/EmailDetail.vue @@ -5,6 +5,13 @@
+ + {{ lang.mail_reply }} + @@ -90,6 +97,7 @@ import { usePage, Back, Delete, Document, Download } from './EmailDetail.js' const { + handleReply, handleDelete, loading, loadError,