FEATURE (email): Add "from" field

This commit is contained in:
Rostislav Dugin
2025-11-08 20:47:35 +03:00
parent 9ea795b48f
commit 9b066bcb8a
7 changed files with 55 additions and 3 deletions

View File

@@ -27,6 +27,7 @@ type EmailNotifier struct {
SMTPPort int `json:"smtpPort" gorm:"not null;column:smtp_port"`
SMTPUser string `json:"smtpUser" gorm:"type:varchar(255);column:smtp_user"`
SMTPPassword string `json:"smtpPassword" gorm:"type:varchar(255);column:smtp_password"`
From string `json:"from" gorm:"type:varchar(255);column:from_email"`
}
func (e *EmailNotifier) TableName() string {
@@ -56,9 +57,12 @@ func (e *EmailNotifier) Validate() error {
func (e *EmailNotifier) Send(logger *slog.Logger, heading string, message string) error {
// Compose email
from := e.SMTPUser
from := e.From
if from == "" {
from = "noreply@" + e.SMTPHost
from = e.SMTPUser
if from == "" {
from = "noreply@" + e.SMTPHost
}
}
to := []string{e.TargetEmail}
@@ -218,6 +222,7 @@ func (e *EmailNotifier) Update(incoming *EmailNotifier) {
e.SMTPHost = incoming.SMTPHost
e.SMTPPort = incoming.SMTPPort
e.SMTPUser = incoming.SMTPUser
e.From = incoming.From
if incoming.SMTPPassword != "" {
e.SMTPPassword = incoming.SMTPPassword

View File

@@ -0,0 +1,11 @@
-- +goose Up
-- +goose StatementBegin
ALTER TABLE email_notifiers
ADD COLUMN from_email VARCHAR(255);
-- +goose StatementEnd
-- +goose Down
-- +goose StatementBegin
ALTER TABLE email_notifiers
DROP COLUMN from_email;
-- +goose StatementEnd

View File

@@ -4,4 +4,5 @@ export interface EmailNotifier {
smtpPort: number;
smtpUser: string;
smtpPassword: string;
from: string;
}

View File

@@ -25,7 +25,7 @@ import { getUserTimeFormat } from '../../../shared/time';
import { ConfirmationComponent } from '../../../shared/ui';
import { RestoresComponent } from '../../restores';
const BACKUPS_PAGE_SIZE = 10;
const BACKUPS_PAGE_SIZE = 50;
interface Props {
database: Database;

View File

@@ -111,6 +111,7 @@ export function EditNotifierComponent({
smtpPort: 0,
smtpUser: '',
smtpPassword: '',
from: '',
};
}

View File

@@ -126,6 +126,35 @@ export function EditEmailNotifierComponent({ notifier, setNotifier, setIsUnsaved
placeholder="password"
/>
</div>
<div className="mb-1 flex items-center">
<div className="w-[130px] min-w-[130px]">From</div>
<Input
value={notifier?.emailNotifier?.from || ''}
onChange={(e) => {
if (!notifier?.emailNotifier) return;
setNotifier({
...notifier,
emailNotifier: {
...notifier.emailNotifier,
from: e.target.value.trim(),
},
});
setIsUnsaved(true);
}}
size="small"
className="w-full max-w-[250px]"
placeholder="example@example.com"
/>
<Tooltip
className="cursor-pointer"
title="Optional. Email address to use as sender. If empty, will use SMTP user or auto-generate from host"
>
<InfoCircleOutlined className="ml-2" style={{ color: 'gray' }} />
</Tooltip>
</div>
</>
);
}

View File

@@ -31,6 +31,11 @@ export function ShowEmailNotifierComponent({ notifier }: Props) {
<div className="min-w-[110px]">SMTP password</div>
{'*************'}
</div>
<div className="mb-1 flex items-center">
<div className="min-w-[110px]">From</div>
{notifier?.emailNotifier?.from || '(auto)'}
</div>
</>
);
}