github.com/robryk/drone@v0.2.1-0.20140602202253-40fe4305815d/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`