github.com/keysonzzz/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgEmail/SmtpSendEmail.go (about)

     1  package kmgEmail
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/tls"
     6  	"net"
     7  	"net/smtp"
     8  	"strings"
     9  	"text/template"
    10  
    11  	"github.com/bronze1man/kmg/kmgLog"
    12  	"github.com/bronze1man/kmg/kmgNet"
    13  	"github.com/bronze1man/kmg/kmgNet/kmgProxy"
    14  )
    15  
    16  func SmtpSendEmail(req *SmtpRequest) (err error) {
    17  	parameters := &struct {
    18  		From    string
    19  		To      string
    20  		Subject string
    21  		Message string
    22  	}{
    23  		req.From,
    24  		strings.Join([]string(req.To), ","),
    25  		req.Subject,
    26  		req.Message,
    27  	}
    28  	buffer := new(bytes.Buffer)
    29  	t := template.Must(template.New("emailTemplate").Parse(_EmailScript()))
    30  	t.Execute(buffer, parameters)
    31  	auth := smtp.PlainAuth("", req.From, req.SmtpPassword, req.SmtpHost)
    32  	var conn net.Conn
    33  	if req.Socks4aProxyAddr != "" {
    34  		conn, err = kmgProxy.Socks4aDial(req.Socks4aProxyAddr, kmgNet.JoinHostPortInt(req.SmtpHost, req.SmtpPort))
    35  	} else {
    36  		conn, err = net.Dial("tcp", kmgNet.JoinHostPortInt(req.SmtpHost, req.SmtpPort))
    37  	}
    38  	if err != nil {
    39  		kmgLog.Log("Email", "1", err.Error())
    40  		return
    41  	}
    42  	c, err := smtp.NewClient(conn, req.SmtpHost)
    43  	if err != nil {
    44  		kmgLog.Log("Email", err.Error())
    45  		return
    46  	}
    47  	err = smtpSendMailPart2(c,
    48  		req.SmtpHost,
    49  		auth,
    50  		req.From,
    51  		req.To,
    52  		buffer.Bytes())
    53  	return err
    54  }
    55  
    56  func smtpSendMailPart2(c *smtp.Client, smtpHost string, a smtp.Auth, from string, to []string, msg []byte) (err error) {
    57  	defer c.Close()
    58  	if err = c.Hello("localhost"); err != nil {
    59  		return err
    60  	}
    61  	if ok, _ := c.Extension("STARTTLS"); ok {
    62  		config := &tls.Config{ServerName: smtpHost}
    63  		if err = c.StartTLS(config); err != nil {
    64  			return err
    65  		}
    66  	}
    67  	if a != nil {
    68  		if ok, _ := c.Extension("AUTH"); ok {
    69  			if err = c.Auth(a); err != nil {
    70  				return err
    71  			}
    72  		}
    73  	}
    74  	if err = c.Mail(from); err != nil {
    75  		return err
    76  	}
    77  	for _, addr := range to {
    78  		if err = c.Rcpt(addr); err != nil {
    79  			return err
    80  		}
    81  	}
    82  	w, err := c.Data()
    83  	if err != nil {
    84  		return err
    85  	}
    86  	_, err = w.Write(msg)
    87  	if err != nil {
    88  		return err
    89  	}
    90  	err = w.Close()
    91  	if err != nil {
    92  		return err
    93  	}
    94  	return c.Quit()
    95  }
    96  
    97  // _EmailScript returns a template for the email message to be sent
    98  func _EmailScript() (script string) {
    99  	return `From: {{.From}}
   100  To: {{.To}}
   101  Subject: {{.Subject}}
   102  MIME-version: 1.0
   103  Content-Type: text/html; charset="UTF-8"
   104  
   105  {{.Message}}`
   106  }