From a8c6c22e7f5b629db3e6f275028a23ee9a9a50f3 Mon Sep 17 00:00:00 2001 From: Biswa Kalyan Bhuyan Date: Sat, 24 May 2025 11:03:37 +0530 Subject: Add custom SMTP authentication support - Add SMTPUsername and SMTPPassword fields to Settings struct - Update DoSMTP method to use custom credentials when available - Add SMTP credential fields to all theme templates - Support independent username/password configuration Fixes authentication issues when using different SMTP credentials than login credentials, useful for app-specific passwords. --- plugins/base/public/settings.html | 37 +++++++++++++++++++++ plugins/base/routes.go | 10 ++++++ session.go | 46 +++++++++++++++++++++++++- themes/alps/settings.html | 24 ++++++++++++++ themes/sourcehut/settings.html | 68 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 183 insertions(+), 2 deletions(-) diff --git a/plugins/base/public/settings.html b/plugins/base/public/settings.html index 7acacb5..da950e4 100644 --- a/plugins/base/public/settings.html +++ b/plugins/base/public/settings.html @@ -9,9 +9,46 @@

Settings

+ + +

+ + + +

+ + + +
+ Use this if your SMTP server requires different credentials than your email login +

+ + + +
+ Use this if your SMTP server requires different credentials than your email login +

+ + + +

+

+
diff --git a/plugins/base/routes.go b/plugins/base/routes.go index 623a5cc..4640c93 100644 --- a/plugins/base/routes.go +++ b/plugins/base/routes.go @@ -1243,6 +1243,8 @@ type Settings struct { Signature string From string Subscriptions []string + SMTPUsername string + SMTPPassword string } func loadSettings(s alps.Store) (*Settings, error) { @@ -1268,6 +1270,12 @@ func (s *Settings) check() error { if len(s.From) > 512 { return fmt.Errorf("Full name must be 512 characters or fewer") } + if len(s.SMTPUsername) > 255 { + return fmt.Errorf("SMTP username must be 255 characters or fewer") + } + if len(s.SMTPPassword) > 255 { + return fmt.Errorf("SMTP password must be 255 characters or fewer") + } return nil } @@ -1311,6 +1319,8 @@ func handleSettings(ctx *alps.Context) error { } settings.Signature = ctx.FormValue("signature") settings.From = ctx.FormValue("from") + settings.SMTPUsername = ctx.FormValue("smtp_username") + settings.SMTPPassword = ctx.FormValue("smtp_password") params, err := ctx.FormParams() if err != nil { diff --git a/session.go b/session.go index a85bff6..f241b6a 100644 --- a/session.go +++ b/session.go @@ -112,7 +112,23 @@ func (s *Session) DoSMTP(f func(*smtp.Client) error) error { } defer c.Close() - auth := sasl.NewPlainClient("", s.username, s.password) + // Try to get custom SMTP credentials from user settings + smtpUsername := s.username + smtpPassword := s.password + + // Load settings to check for custom SMTP credentials + if settings, err := s.loadSMTPSettings(); err == nil { + // Use custom username if provided, otherwise keep login username + if settings.SMTPUsername != "" { + smtpUsername = settings.SMTPUsername + } + // Use custom password if provided, otherwise keep login password + if settings.SMTPPassword != "" { + smtpPassword = settings.SMTPPassword + } + } + + auth := sasl.NewPlainClient("", smtpUsername, smtpPassword) if err := c.Auth(auth); err != nil { return AuthError{err} } @@ -128,6 +144,34 @@ func (s *Session) DoSMTP(f func(*smtp.Client) error) error { return nil } +// SMTPSettings represents custom SMTP authentication settings +type SMTPSettings struct { + SMTPUsername string + SMTPPassword string +} + +// loadSMTPSettings is a helper method to load SMTP settings for this session +func (s *Session) loadSMTPSettings() (*SMTPSettings, error) { + const settingsKey = "base.settings" + var fullSettings struct { + MessagesPerPage int + Signature string + From string + Subscriptions []string + SMTPUsername string + SMTPPassword string + } + + if err := s.Store().Get(settingsKey, &fullSettings); err != nil { + return nil, err + } + + return &SMTPSettings{ + SMTPUsername: fullSettings.SMTPUsername, + SMTPPassword: fullSettings.SMTPPassword, + }, nil +} + // SetHTTPBasicAuth adds an Authorization header field to the request with // this session's credentials. func (s *Session) SetHTTPBasicAuth(req *http.Request) { diff --git a/themes/alps/settings.html b/themes/alps/settings.html index 61e76e6..c845055 100644 --- a/themes/alps/settings.html +++ b/themes/alps/settings.html @@ -32,6 +32,30 @@ >{{.Settings.Signature}} +
+ + + Use this if your SMTP server requires different credentials than your email login +
+ +
+ + + Use this if your SMTP server requires different credentials than your email login +
+
+
+ +
+ + +
+ +
+ + + Use this if your SMTP server requires different credentials than your email login +
+ +
+ + + Use this if your SMTP server requires different credentials than your email login +
+ +
+ + +
+
+
- {{template "foot.html"}} -- cgit v1.2.3-59-g8ed1b