Select Git revision
runnable-mail.go

Volker Schukai authored
runnable-mail.go 1.80 KiB
package jobqueue
import (
"net/smtp"
)
// MailResult is a result of a email
type MailResult struct {
Sent bool
ServerReply string
SmtpStatusCode uint
}
type MailRunnable struct {
To string
From string
Subject string
Body string
Server string
Port string
Username string
Password string
Headers map[string]string
}
func (m *MailRunnable) Run() (RunResult[MailResult], error) {
smtpServer := m.Server + ":" + m.Port
// Connect to the remote SMTP server.
client, err := smtp.Dial(smtpServer)
if err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
if client != nil {
defer client.Close()
}
if m.Username != "" && m.Password != "" {
if err := client.Auth(smtp.PlainAuth("", m.Username, m.Password, m.Server)); err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
}
// To && From.
if err := client.Mail(m.From); err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
if err := client.Rcpt(m.To); err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
// Headers and Data.
writer, err := client.Data()
if err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
headers := "From: " + m.From + "\r\n"
headers += "To: " + m.To + "\r\n"
headers += "Subject: " + m.Subject + "\r\n"
for key, value := range m.Headers {
headers += key + ": " + value + "\r\n"
}
_, err = writer.Write([]byte(headers + "\r\n" + m.Body))
if err != nil {
return RunResult[MailResult]{Status: ResultStatusFailed}, err
}
_ = writer.Close()
// Quit and get the SMTP status code.
smtpStatusCode, _ := client.Text.Cmd("QUIT")
return RunResult[MailResult]{Status: ResultStatusSuccess, Data: MailResult{Sent: true, SmtpStatusCode: smtpStatusCode}}, nil
}