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(`
`, content)
}