feat: add configurable sender name and allow users to choose between system and personal SMTP accounts when sending emails
Build and Push Multi-Platform Images / build-and-push (push) Successful in 34s

This commit is contained in:
2026-05-06 20:49:09 +02:00
parent 8212f733ab
commit d19fd266c7
10 changed files with 72 additions and 5 deletions
+1
View File
@@ -120,6 +120,7 @@ export const inboxApi = {
body: string;
html?: string;
segments: { pages: number[]; filename: string }[];
sender?: string;
},
) =>
api.post(`/api/inbox/${encodeURIComponent(id)}/send-email`, body).then(() => {}),
@@ -7,9 +7,15 @@ export interface UserSettingsData {
smtpUser: string | null;
smtpPassSet: boolean;
smtpFrom: string | null;
smtpFromName: string | null;
mailSignatureHtml: string | null;
}
export interface SenderOption {
id: string;
label: string;
}
export const userSettingsApi = {
get: () => api.get<UserSettingsData>('/api/user-settings').then((r) => r.data),
@@ -20,4 +26,7 @@ export const userSettingsApi = {
api
.post<{ ok: boolean; error?: string }>('/api/user-settings/test-smtp', cfg)
.then((r) => r.data),
getSenders: () =>
api.get<SenderOption[]>('/api/user-settings/senders').then((r) => r.data),
};
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import { Button, Dropdown, Empty, Form, Input, Modal, Popconfirm, Space, Spin, Steps, Tag, Tooltip, Typography, message } from 'antd';
import { Button, Dropdown, Empty, Form, Input, Modal, Popconfirm, Select, Space, Spin, Steps, Tag, Tooltip, Typography, message } from 'antd';
import type { MenuProps } from 'antd';
import {
ArrowLeftOutlined,
@@ -26,7 +26,7 @@ import StarterKit from '@tiptap/starter-kit';
import Underline from '@tiptap/extension-underline';
import { inboxApi, type InboxBarcode, type InboxFile, type PostprocessActionResult } from '../api/inbox';
import { paperlessApi } from '../api/paperless';
import { userSettingsApi } from '../api/userSettings';
import { userSettingsApi, type SenderOption } from '../api/userSettings';
const ZOOM_MIN = 0.5;
const ZOOM_MAX = 3;
@@ -670,6 +670,8 @@ function SendEmailDialog({ open, fileId, fileName, documents, onClose }: SendEma
const [form] = Form.useForm();
const [submitting, setSubmitting] = useState(false);
const [filenames, setFilenames] = useState<string[]>([]);
const [senders, setSenders] = useState<SenderOption[]>([]);
const [selectedSender, setSelectedSender] = useState<string>('default');
const editor = useEditor({
extensions: [StarterKit, Underline],
@@ -690,6 +692,10 @@ function SendEmailDialog({ open, fileId, fileName, documents, onClose }: SendEma
}).catch(() => {
editor?.commands.clearContent();
});
userSettingsApi.getSenders().then((s) => {
setSenders(s);
setSelectedSender(s.length > 1 ? 'user' : 'default');
}).catch(() => setSenders([]));
}, [open, documents, fileName, form, editor]);
const handleOk = async () => {
@@ -705,6 +711,7 @@ function SendEmailDialog({ open, fileId, fileName, documents, onClose }: SendEma
pages: doc.pages,
filename: filenames[i] || fileName,
})),
sender: senders.length > 1 ? selectedSender : undefined,
});
message.success('E-Mail wurde gesendet');
onClose();
@@ -729,6 +736,15 @@ function SendEmailDialog({ open, fileId, fileName, documents, onClose }: SendEma
width={580}
>
<Form form={form} layout="vertical" style={{ marginTop: 16 }}>
{senders.length > 1 && (
<Form.Item label="Absender">
<Select
value={selectedSender}
onChange={setSelectedSender}
options={senders.map((s) => ({ value: s.id, label: s.label }))}
/>
</Form.Item>
)}
<Form.Item name="to" label="Empfänger" rules={[{ required: true, message: 'Bitte Empfänger angeben' }, { type: 'email', message: 'Ungültige E-Mail-Adresse' }]}>
<Input placeholder="empfaenger@beispiel.de" />
</Form.Item>
@@ -50,6 +50,7 @@ function MailSettingsTab() {
smtpSecure: data.smtpSecure,
smtpUser: data.smtpUser ?? '',
smtpFrom: data.smtpFrom ?? '',
smtpFromName: data.smtpFromName ?? '',
});
setPassSet(data.smtpPassSet);
if (data.mailSignatureHtml) {
@@ -72,6 +73,7 @@ function MailSettingsTab() {
smtpUser: values.smtpUser || null,
smtpPass: values.smtpPass || undefined,
smtpFrom: values.smtpFrom || null,
smtpFromName: values.smtpFromName || null,
mailSignatureHtml: editor?.getHTML() ?? null,
});
setPassSet(updated.smtpPassSet);
@@ -129,6 +131,9 @@ function MailSettingsTab() {
<Form.Item name="smtpFrom" label="Absender-Adresse (From)">
<Input placeholder="mein.name@beispiel.de" />
</Form.Item>
<Form.Item name="smtpFromName" label="Absendername (Anzeigename)">
<Input placeholder="Max Mustermann" />
</Form.Item>
<Form.Item label="Signatur">
<div style={{ border: '1px solid #d9d9d9', borderRadius: 6, padding: '6px 10px', minHeight: 160 }}>