From 6800dfed3fc44d16029919db94dd36f5c845fcb7 Mon Sep 17 00:00:00 2001 From: dreamhunter2333 Date: Sun, 23 Aug 2026 21:20:29 +0800 Subject: [PATCH] fix: align user send mail behavior --- e2e/tests/api/user-send-mail.spec.ts | 44 +++++++++++++++++++++++ worker/src/user_api/user_send_mail_api.ts | 3 +- worker/src/worker.ts | 4 +++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/e2e/tests/api/user-send-mail.spec.ts b/e2e/tests/api/user-send-mail.spec.ts index 27cdd56..9b66858 100644 --- a/e2e/tests/api/user-send-mail.spec.ts +++ b/e2e/tests/api/user-send-mail.spec.ts @@ -5,8 +5,10 @@ import { createTestAddress, deleteAddress, deleteAllMailpitMessages, + getAddressSender, hashPassword, onMailpitMessage, + updateAddressSender, } from '../../fixtures/test-helpers'; async function createUser(request: APIRequestContext) { @@ -69,6 +71,12 @@ test.describe('User send mail API', () => { await bindAddress(request, user.jwt, bound.jwt); await bindAddress(request, user.jwt, accessRequest.jwt); + const invalidAddressSettingsRes = await request.get( + `${WORKER_URL}/user_api/address/0/settings`, + { headers: { 'x-user-token': user.jwt } }, + ); + expect(invalidAddressSettingsRes.status()).toBe(400); + const outsiderSettingsRes = await request.get( `${WORKER_URL}/user_api/address/${outsider.address_id}/settings`, { headers: { 'x-user-token': user.jwt } }, @@ -112,6 +120,20 @@ test.describe('User send mail API', () => { ); expect(requestAccessRes.ok()).toBe(true); + const accessSender = await getAddressSender(request, accessRequest.address); + await updateAddressSender(request, { + address: accessRequest.address, + address_id: accessSender.id, + balance: 0, + enabled: true, + }); + const duplicateAccessRes = await request.post( + `${WORKER_URL}/user_api/address/${accessRequest.address_id}/request_send_mail_access`, + { headers: { 'x-user-token': user.jwt } }, + ); + expect(duplicateAccessRes.status()).toBe(400); + expect(await duplicateAccessRes.text()).toContain('Already'); + const addressSettingsRes = await request.get( `${WORKER_URL}/user_api/address/${bound.address_id}/settings`, { headers: { 'x-user-token': user.jwt } }, @@ -183,6 +205,28 @@ test.describe('User send mail API', () => { ); expect((await updatedSettingsRes.json()).send_balance).toBe(9); + const sender = await getAddressSender(request, bound.address); + await updateAddressSender(request, { + address: bound.address, + address_id: sender.id, + balance: 0, + enabled: true, + }); + const noBalanceRes = await request.post( + `${WORKER_URL}/user_api/address/${bound.address_id}/send_mail`, + { + headers: { 'x-user-token': user.jwt }, + data: { + to_mail: 'recipient@test.example.com', + subject: 'No balance user send', + content: 'This message must not be sent', + is_html: false, + }, + }, + ); + expect(noBalanceRes.status()).toBe(400); + expect(await noBalanceRes.text()).toContain('No balance'); + const userSendboxRes = await request.get( `${WORKER_URL}/user_api/sendbox?limit=20&offset=0`, { headers: { 'x-user-token': user.jwt } }, diff --git a/worker/src/user_api/user_send_mail_api.ts b/worker/src/user_api/user_send_mail_api.ts index f43c803..b74904d 100644 --- a/worker/src/user_api/user_send_mail_api.ts +++ b/worker/src/user_api/user_send_mail_api.ts @@ -60,13 +60,12 @@ const send = async (c: Context): Promise => { if (address instanceof Response) { return address; } - const msgs = i18n.getMessagesbyContext(c); try { const reqJson = await c.req.json(); await sendMail(c, address, reqJson); } catch (error) { console.error("Failed to send user mail", error); - return c.text(msgs.OperationFailedMsg, 500); + return c.text(`Failed to send mail ${(error as Error).message}`, 400); } return c.json({ status: "ok" }); } diff --git a/worker/src/worker.ts b/worker/src/worker.ts index 2ee188f..8d0068b 100644 --- a/worker/src/worker.ts +++ b/worker/src/worker.ts @@ -65,6 +65,10 @@ app.use('/*', async (c, next) => { c.req.path.startsWith("/api/new_address") || c.req.path.startsWith("/api/send_mail") || c.req.path.startsWith("/external/api/send_mail") + || ( + c.req.path.startsWith("/user_api/address/") + && c.req.path.endsWith("/send_mail") + ) || c.req.path.startsWith("/user_api/register") || c.req.path.startsWith("/user_api/verify_code") ) {