The m CLI isn't available in Docker containers. Replace exec.Command("m", "mail", "send")
with direct SMTP using crypto/tls + net/smtp (implicit TLS on port 465).
Env vars: SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, MAIL_FROM
Gracefully skips sending if SMTP is not configured.
Note: mgmt@msbls.de rejected by Hostinger as not owned by mail@msbls.de.
Default from address set to mail@msbls.de until alias is created.
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
type Config struct {
|
|
Port string
|
|
DatabaseURL string
|
|
SupabaseURL string
|
|
SupabaseAnonKey string
|
|
SupabaseServiceKey string
|
|
SupabaseJWTSecret string
|
|
AnthropicAPIKey string
|
|
FrontendOrigin string
|
|
|
|
// SMTP settings (optional — email sending disabled if SMTPHost is empty)
|
|
SMTPHost string
|
|
SMTPPort string
|
|
SMTPUser string
|
|
SMTPPass string
|
|
MailFrom string
|
|
}
|
|
|
|
func Load() (*Config, error) {
|
|
cfg := &Config{
|
|
Port: getEnv("PORT", "8080"),
|
|
DatabaseURL: os.Getenv("DATABASE_URL"),
|
|
SupabaseURL: os.Getenv("SUPABASE_URL"),
|
|
SupabaseAnonKey: os.Getenv("SUPABASE_ANON_KEY"),
|
|
SupabaseServiceKey: os.Getenv("SUPABASE_SERVICE_KEY"),
|
|
SupabaseJWTSecret: os.Getenv("SUPABASE_JWT_SECRET"),
|
|
AnthropicAPIKey: os.Getenv("ANTHROPIC_API_KEY"),
|
|
FrontendOrigin: getEnv("FRONTEND_ORIGIN", "https://kanzlai.msbls.de"),
|
|
|
|
SMTPHost: os.Getenv("SMTP_HOST"),
|
|
SMTPPort: getEnv("SMTP_PORT", "465"),
|
|
SMTPUser: os.Getenv("SMTP_USER"),
|
|
SMTPPass: os.Getenv("SMTP_PASS"),
|
|
MailFrom: getEnv("MAIL_FROM", "mail@msbls.de"),
|
|
}
|
|
|
|
if cfg.DatabaseURL == "" {
|
|
return nil, fmt.Errorf("DATABASE_URL is required")
|
|
}
|
|
if cfg.SupabaseJWTSecret == "" {
|
|
return nil, fmt.Errorf("SUPABASE_JWT_SECRET is required")
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|
|
|
|
func getEnv(key, fallback string) string {
|
|
if v := os.Getenv(key); v != "" {
|
|
return v
|
|
}
|
|
return fallback
|
|
}
|