github.com/marinho/drone@v0.2.1-0.20140504195434-d3ba962e89a7/pkg/mail/mail.go (about) 1 package mail 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "net/smtp" 8 9 "github.com/drone/drone/pkg/database" 10 "github.com/drone/drone/pkg/template" 11 ) 12 13 // A Message represents an email message. Addresses may be of any 14 // form permitted by RFC 822. 15 type Message struct { 16 Sender string 17 ReplyTo string // may be empty 18 19 To string 20 Subject string 21 Body string 22 } 23 24 // Sends a activation email to the User. 25 func SendActivation(to string, data interface{}) error { 26 msg := Message{} 27 msg.Subject = "[drone.io] Account Activation" 28 msg.To = to 29 30 var buf bytes.Buffer 31 err := template.ExecuteTemplate(&buf, "activation.html", &data) 32 if err != nil { 33 log.Print(err) 34 return err 35 } 36 msg.Body = buf.String() 37 38 return Send(&msg) 39 } 40 41 // Sends an invitation to join a Team 42 func SendInvitation(team, to string, data interface{}) error { 43 msg := Message{} 44 msg.Subject = "Invited to join " + team 45 msg.To = to 46 47 var buf bytes.Buffer 48 err := template.ExecuteTemplate(&buf, "invitation.html", &data) 49 if err != nil { 50 log.Print(err) 51 return err 52 } 53 msg.Body = buf.String() 54 55 return Send(&msg) 56 } 57 58 // Sends an email to the User's email address 59 // with Password reset information. 60 func SendPassword(to string, data interface{}) error { 61 msg := Message{} 62 msg.Subject = "[drone.io] Password Reset" 63 msg.To = to 64 65 var buf bytes.Buffer 66 err := template.ExecuteTemplate(&buf, "reset_password.html", &data) 67 if err != nil { 68 log.Print(err) 69 return err 70 } 71 msg.Body = buf.String() 72 73 return Send(&msg) 74 } 75 76 // Sends a build success email to the user. 77 func SendSuccess(repo, sha, to string, data interface{}) error { 78 msg := Message{} 79 msg.Subject = fmt.Sprintf("[%s] SUCCESS building %s", repo, sha) 80 msg.To = to 81 82 var buf bytes.Buffer 83 err := template.ExecuteTemplate(&buf, "success.html", &data) 84 if err != nil { 85 log.Print(err) 86 return err 87 } 88 msg.Body = buf.String() 89 90 return Send(&msg) 91 } 92 93 // Sends a build failure email to the user. 94 func SendFailure(repo, sha, to string, data interface{}) error { 95 msg := Message{} 96 msg.Subject = fmt.Sprintf("[%s] FAILURE building %s", repo, sha) 97 msg.To = to 98 99 var buf bytes.Buffer 100 err := template.ExecuteTemplate(&buf, "failure.html", &data) 101 if err != nil { 102 log.Print(err) 103 return err 104 } 105 msg.Body = buf.String() 106 107 return Send(&msg) 108 } 109 110 // Send sends an email message. 111 func Send(msg *Message) error { 112 // retieve the system settings from the database 113 // so that we can get the SMTP details. 114 s, err := database.GetSettings() 115 if err != nil { 116 log.Print(err) 117 return err 118 } 119 120 // set the FROM address 121 msg.Sender = s.SmtpAddress 122 123 // format the raw email message body 124 body := fmt.Sprintf(emailTemplate, msg.Sender, msg.To, msg.Subject, msg.Body) 125 126 var auth smtp.Auth 127 if len(s.SmtpUsername) > 0 { 128 auth = smtp.PlainAuth("", s.SmtpUsername, s.SmtpPassword, s.SmtpServer) 129 } 130 addr := fmt.Sprintf("%s:%s", s.SmtpServer, s.SmtpPort) 131 132 err = smtp.SendMail(addr, auth, msg.Sender, []string{msg.To}, []byte(body)) 133 if err != nil { 134 log.Print(err) 135 return err 136 } 137 138 return nil 139 } 140 141 // Text-template used to generate a raw Email message 142 var emailTemplate = `From: %s 143 To: %s 144 Subject: %s 145 MIME-version: 1.0 146 Content-Type: text/html; charset="UTF-8" 147 148 %s`