Skip to content
Snippets Groups Projects
Select Git revision
  • 3071be563197835a2aed1f3f7b9655312676d6d4
  • master default protected
  • v1.23.2
  • v1.23.1
  • v1.23.0
  • v1.22.0
  • v1.21.1
  • v1.21.0
  • v1.20.3
  • v1.20.2
  • v1.20.1
  • v1.20.0
  • v1.19.4
  • v1.19.3
  • v1.19.2
  • v1.19.1
  • v1.19.0
  • v1.18.2
  • v1.18.1
  • v1.18.0
  • v1.17.0
  • v1.16.1
22 results

runnable-mail.go

Blame
  • Volker Schukai's avatar
    d14a74cc
    History
    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
    }