Cosmos-Server/src/utils/emails.go
2023-05-01 11:00:45 +01:00

151 lines
2.6 KiB
Go

package utils
import (
"crypto/tls"
"fmt"
"net/smtp"
"strings"
)
var Template = `From: %s
To: %s
Subject: %s
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
}
.container {
max-width: 500px;
margin: auto;
margin-top: 30px;
padding: 20px;
}
.header {
text-align: center;
padding-bottom: 10px;
}
.logo {
width: 130px;
}
.content {
background-color: #f4f4f4;
padding: 20px;
border-radius: 5px;
border-top: 2px solid rgb(171, 71, 188);
}
.footer {
padding-top: 20px;
color: #999;
}
h1 {
color: rgb(171, 71, 188);
}
.button {
background: rgb(171, 71, 188);
color: white !important;
padding: 10px 20px;
border-radius: 5px;
display: inline-block;
margin-top: 15px;
text-decoration: none;
}
.button:hover {
background: rgb(141, 41, 168);
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<img src="%s" alt="Logo" class="logo">
</div>
<div class="content">
%s
</div>
<div class="footer">
Sent from: %s
</div>
</div>
</body>
</html>`
func IsEmailEnabled() bool {
config := GetMainConfig()
return config.EmailConfig.Enabled
}
func SendEmail(recipients []string, subject string, body string) error {
config := GetMainConfig()
hostPort := config.EmailConfig.Host + ":" + config.EmailConfig.Port
auth := smtp.PlainAuth("", config.EmailConfig.Username, config.EmailConfig.Password, config.EmailConfig.Host)
tlsConfig := &tls.Config{
InsecureSkipVerify: false,
ServerName: config.EmailConfig.Host,
}
ServerURL := GetServerURL()
LogoURL := ServerURL + "logo"
send := func(addr string, a smtp.Auth, from string, to []string, msg []byte) error {
c, err := smtp.Dial(addr)
if err != nil {
return err
}
defer c.Close()
if config.EmailConfig.UseTLS {
if err = c.StartTLS(tlsConfig); err != nil {
return err
}
}
if err = c.Auth(a); err != nil {
return err
}
if err = c.Mail(from); err != nil {
return err
}
for _, addr := range to {
if err = c.Rcpt(addr); err != nil {
return err
}
}
w, err := c.Data()
if err != nil {
return err
}
_, err = w.Write(msg)
if err != nil {
return err
}
err = w.Close()
if err != nil {
return err
}
return c.Quit()
}
msg := []byte(fmt.Sprintf(
Template,
config.EmailConfig.From,
strings.Join(recipients, ","),
subject,
LogoURL,
body,
ServerURL,
))
return send(hostPort, auth, config.EmailConfig.From, recipients, msg)
}