82 lines
2.2 KiB
Go
82 lines
2.2 KiB
Go
package lib
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"fmt"
|
|
"net"
|
|
"net/smtp"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
var (
|
|
smtpHost, smtpPort, smtpUser, smtpToken, smtpFrom string
|
|
)
|
|
|
|
func EmailInit(envPath string) error {
|
|
data, err := os.ReadFile(envPath)
|
|
if err != nil { return err }
|
|
for _, line := range strings.Split(string(data), "\n") {
|
|
parts := strings.SplitN(line, "=", 2)
|
|
if len(parts) != 2 { continue }
|
|
switch parts[0] {
|
|
case "SMTP_HOST": smtpHost = parts[1]
|
|
case "SMTP_PORT": smtpPort = parts[1]
|
|
case "SMTP_USER": smtpUser = parts[1]
|
|
case "SMTP_TOKEN": smtpToken = parts[1]
|
|
case "SMTP_FROM_NAME": smtpFrom = parts[1]
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func SendEmail(to, fromName, subject, content string) error {
|
|
if smtpHost == "" { return nil }
|
|
|
|
displayFrom := smtpFrom
|
|
if fromName != "" {
|
|
displayFrom = fromName + " via inou"
|
|
}
|
|
|
|
html := wrapEmail(content)
|
|
|
|
msg := "From: " + displayFrom + " <" + smtpUser + ">\r\n" +
|
|
"To: " + to + "\r\n" +
|
|
"Subject: " + subject + "\r\n" +
|
|
"MIME-Version: 1.0\r\n" +
|
|
"Content-Type: text/html; charset=utf-8\r\n\r\n" + html
|
|
|
|
conn, err := net.Dial("tcp", smtpHost+":"+smtpPort)
|
|
if err != nil { return err }
|
|
defer conn.Close()
|
|
|
|
client, err := smtp.NewClient(conn, smtpHost)
|
|
if err != nil { return err }
|
|
defer client.Close()
|
|
|
|
if err = client.StartTLS(&tls.Config{ServerName: smtpHost}); err != nil { return err }
|
|
if err = client.Auth(smtp.PlainAuth("", smtpUser, smtpToken, smtpHost)); err != nil { return err }
|
|
if err = client.Mail(smtpUser); err != nil { return err }
|
|
if err = client.Rcpt(to); err != nil { return err }
|
|
|
|
w, err := client.Data()
|
|
if err != nil { return err }
|
|
_, err = w.Write([]byte(msg))
|
|
if err != nil { return err }
|
|
return w.Close()
|
|
}
|
|
|
|
func wrapEmail(content string) string {
|
|
return fmt.Sprintf(`<!DOCTYPE html>
|
|
<html>
|
|
<head><meta charset="UTF-8"></head>
|
|
<body style="margin:0;padding:0;background:#FAF8F5;font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;">
|
|
<table width="100%%" style="background:#FAF8F5;padding:40px 20px;"><tr><td align="center">
|
|
<table style="max-width:540px;background:#fff;border-radius:12px;padding:48px;text-align:left;"><tr><td style="color:#2D2A26;font-size:16px;line-height:1.6;">
|
|
%s
|
|
</td></tr></table>
|
|
</td></tr></table>
|
|
</body>
|
|
</html>`, content)
|
|
}
|