inou/lib/email.go

63 lines
1.7 KiB
Go

package lib
import (
"crypto/tls"
"fmt"
"net"
"net/smtp"
)
var (
smtpHost, smtpPort, smtpUser, smtpPass, smtpFrom, smtpFromName string
)
func SendEmail(to, fromName, subject, content string) error {
if smtpHost == "" { return nil }
displayName := smtpFromName
if fromName != "" {
displayName = fromName + " via inou"
}
html := wrapEmail(content)
msg := "From: " + displayName + " <" + smtpFrom + ">\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, smtpPass, smtpHost)); err != nil { return err }
if err = client.Mail(smtpFrom); 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)
}