github.com/ngocphuongnb/tetua@v0.0.7-alpha/app/mail/mail.go (about)

     1  package mail
     2  
     3  import (
     4  	"crypto/tls"
     5  	"fmt"
     6  	"mime"
     7  	"net/mail"
     8  	"net/smtp"
     9  
    10  	"github.com/ngocphuongnb/tetua/app/config"
    11  )
    12  
    13  func Send(receiverName, receiverAddress, subject, body string) error {
    14  	if config.Mail == nil ||
    15  		config.Mail.Sender == "" ||
    16  		config.Mail.Smtp == nil ||
    17  		config.Mail.Smtp.Host == "" ||
    18  		config.Mail.Smtp.Port == 0 ||
    19  		config.Mail.Smtp.User == "" ||
    20  		config.Mail.Smtp.Pass == "" {
    21  		return fmt.Errorf("Mail config is not set")
    22  	}
    23  
    24  	from := mail.Address{
    25  		Name:    config.Setting("app_name"),
    26  		Address: config.Mail.Sender,
    27  	}
    28  	to := mail.Address{
    29  		Name:    receiverName,
    30  		Address: receiverAddress,
    31  	}
    32  	tlsconfig := &tls.Config{
    33  		InsecureSkipVerify: config.DEVELOPMENT,
    34  		ServerName:         config.Mail.Smtp.Host,
    35  	}
    36  
    37  	message := fmt.Sprintf("%s: %s\r\n", "From", from.String())
    38  	message += fmt.Sprintf("%s: %s\r\n", "To", to.String())
    39  	message += fmt.Sprintf("%s: %s\r\n", "Subject", mime.QEncoding.Encode("UTF-8", subject))
    40  	message += "MIME-version: 1.0;\nContent-Type: text/html; charset=\"UTF-8\";\r\n"
    41  	message += "\r\n" + body
    42  	auth := smtp.PlainAuth("", config.Mail.Smtp.User, config.Mail.Smtp.Pass, config.Mail.Smtp.Host)
    43  	address := fmt.Sprintf("%s:%d", config.Mail.Smtp.Host, config.Mail.Smtp.Port)
    44  
    45  	tlsConn, err := tls.Dial("tcp", address, tlsconfig)
    46  	if err != nil {
    47  		return err
    48  	}
    49  
    50  	client, err := smtp.NewClient(tlsConn, config.Mail.Smtp.Host)
    51  	if err != nil {
    52  		return err
    53  	}
    54  
    55  	if err = client.Auth(auth); err != nil {
    56  		return err
    57  	}
    58  
    59  	if err = client.Mail(from.Address); err != nil {
    60  		return err
    61  	}
    62  
    63  	if err = client.Rcpt(to.Address); err != nil {
    64  		return err
    65  	}
    66  
    67  	w, err := client.Data()
    68  	if err != nil {
    69  		return err
    70  	}
    71  
    72  	if _, err = w.Write([]byte(message)); err != nil {
    73  		return err
    74  	}
    75  
    76  	if err = w.Close(); err != nil {
    77  		return err
    78  	}
    79  
    80  	client.Quit()
    81  
    82  	return nil
    83  }