fix: align user send mail behavior

This commit is contained in:
dreamhunter2333
2026-08-23 21:20:29 +08:00
parent 9109612322
commit 6800dfed3f
3 changed files with 49 additions and 2 deletions
+44
View File
@@ -5,8 +5,10 @@ import {
createTestAddress, createTestAddress,
deleteAddress, deleteAddress,
deleteAllMailpitMessages, deleteAllMailpitMessages,
getAddressSender,
hashPassword, hashPassword,
onMailpitMessage, onMailpitMessage,
updateAddressSender,
} from '../../fixtures/test-helpers'; } from '../../fixtures/test-helpers';
async function createUser(request: APIRequestContext) { 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, bound.jwt);
await bindAddress(request, user.jwt, accessRequest.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( const outsiderSettingsRes = await request.get(
`${WORKER_URL}/user_api/address/${outsider.address_id}/settings`, `${WORKER_URL}/user_api/address/${outsider.address_id}/settings`,
{ headers: { 'x-user-token': user.jwt } }, { headers: { 'x-user-token': user.jwt } },
@@ -112,6 +120,20 @@ test.describe('User send mail API', () => {
); );
expect(requestAccessRes.ok()).toBe(true); 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( const addressSettingsRes = await request.get(
`${WORKER_URL}/user_api/address/${bound.address_id}/settings`, `${WORKER_URL}/user_api/address/${bound.address_id}/settings`,
{ headers: { 'x-user-token': user.jwt } }, { headers: { 'x-user-token': user.jwt } },
@@ -183,6 +205,28 @@ test.describe('User send mail API', () => {
); );
expect((await updatedSettingsRes.json()).send_balance).toBe(9); 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( const userSendboxRes = await request.get(
`${WORKER_URL}/user_api/sendbox?limit=20&offset=0`, `${WORKER_URL}/user_api/sendbox?limit=20&offset=0`,
{ headers: { 'x-user-token': user.jwt } }, { headers: { 'x-user-token': user.jwt } },
+1 -2
View File
@@ -60,13 +60,12 @@ const send = async (c: Context<HonoCustomType>): Promise<Response> => {
if (address instanceof Response) { if (address instanceof Response) {
return address; return address;
} }
const msgs = i18n.getMessagesbyContext(c);
try { try {
const reqJson = await c.req.json(); const reqJson = await c.req.json();
await sendMail(c, address, reqJson); await sendMail(c, address, reqJson);
} catch (error) { } catch (error) {
console.error("Failed to send user mail", 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" }); return c.json({ status: "ok" });
} }
+4
View File
@@ -65,6 +65,10 @@ app.use('/*', async (c, next) => {
c.req.path.startsWith("/api/new_address") c.req.path.startsWith("/api/new_address")
|| c.req.path.startsWith("/api/send_mail") || c.req.path.startsWith("/api/send_mail")
|| c.req.path.startsWith("/external/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/register")
|| c.req.path.startsWith("/user_api/verify_code") || c.req.path.startsWith("/user_api/verify_code")
) { ) {