11package service
22
33import (
4+ "crypto/tls"
5+ "net"
46 "bytes"
57 "fmt"
68 "github.com/leanote/leanote/app/db"
@@ -29,12 +31,74 @@ var host = ""
2931var emailPort = ""
3032var username = ""
3133var password = ""
34+ var ssl = false
3235
3336func InitEmailFromDb () {
3437 host = configService .GetGlobalStringConfig ("emailHost" )
3538 emailPort = configService .GetGlobalStringConfig ("emailPort" )
3639 username = configService .GetGlobalStringConfig ("emailUsername" )
3740 password = configService .GetGlobalStringConfig ("emailPassword" )
41+ if configService .GetGlobalStringConfig ("emailSSL" ) == "1" {
42+ ssl = true
43+ }
44+ }
45+
46+ //return a smtp client
47+ func dial (addr string ) (* smtp.Client , error ) {
48+ conn , err := tls .Dial ("tcp" , addr , nil )
49+ if err != nil {
50+ LogW ("Dialing Error:" , err )
51+ return nil , err
52+ }
53+ //分解主机端口字符串
54+ host , _ , _ := net .SplitHostPort (addr )
55+ return smtp .NewClient (conn , host )
56+ }
57+
58+ func SendEmailWithSSL (auth smtp.Auth , to []string , msg []byte ) (err error ) {
59+ //create smtp client
60+ c , err := dial (host + ":" + emailPort )
61+ if err != nil {
62+ LogW ("Create smpt client error:" , err )
63+ return err
64+ }
65+ defer c .Close ()
66+
67+ if auth != nil {
68+ if ok , _ := c .Extension ("AUTH" ); ok {
69+ if err = c .Auth (auth ); err != nil {
70+ LogW ("Error during AUTH" , err )
71+ return err
72+ }
73+ }
74+ }
75+
76+ if err = c .Mail (username ); err != nil {
77+ return err
78+ }
79+
80+ for _ , addr := range to {
81+ if err = c .Rcpt (addr ); err != nil {
82+ return err
83+ }
84+ }
85+
86+ w , err := c .Data ()
87+ if err != nil {
88+ return err
89+ }
90+
91+ _ , err = w .Write (msg )
92+ if err != nil {
93+ return err
94+ }
95+
96+ err = w .Close ()
97+ if err != nil {
98+ return err
99+ }
100+
101+ return c .Quit ()
38102}
39103
40104func (this * EmailService ) SendEmail (to , subject , body string ) (ok bool , e string ) {
@@ -57,7 +121,14 @@ func (this *EmailService) SendEmail(to, subject, body string) (ok bool, e string
57121
58122 msg := []byte ("To: " + to + "\r \n From: " + username + "<" + username + ">\r \n Subject: " + subject + "\r \n " + content_type + "\r \n \r \n " + body )
59123 send_to := strings .Split (to , ";" )
60- err := smtp .SendMail (host + ":" + emailPort , auth , username , send_to , msg )
124+
125+ var err error
126+ if ssl {
127+ err = SendEmailWithSSL (auth , send_to , msg )
128+ } else {
129+ Log ("no ssl" )
130+ err = smtp .SendMail (host + ":" + emailPort , auth , username , send_to , msg )
131+ }
61132
62133 if err != nil {
63134 e = fmt .Sprint (err )
0 commit comments