diff --git a/utils/mail.go b/utils/mail.go index 0d4645c..371c294 100644 --- a/utils/mail.go +++ b/utils/mail.go @@ -35,8 +35,6 @@ import ( "bytes" "io" "net/mail" - "os" - "os/exec" "text/template" gomail "github.com/go-mail/mail" @@ -46,13 +44,20 @@ import ( "github.com/yuin/goldmark/renderer/html" ) -const sendmail = "/usr/sbin/sendmail" - var ( - MailFrom = mail.Address{Name: "Fred From happyDNS", Address: "contact@happyDNS.org"} + // MailFrom holds the content of the From field for all e-mails that + // will be send. + MailFrom = mail.Address{Name: "Fred From happyDNS", Address: "contact@happyDNS.org"} + + // SendMethod is a pointer to the current global method used to send + // e-mails. SendMethod gomail.Sender = &SystemSendmail{} ) +// SendMail takes a content writen in Markdown to send it to the given user. It +// uses Markdown to create a HTML version of the message and leave the Markdown +// format in the text version. To perform sending, it relies on the SendMethod +// global variable. func SendMail(to *mail.Address, subject, content string) (err error) { m := gomail.NewMessage() m.SetHeader("From", MailFrom.String()) @@ -118,36 +123,3 @@ func SendMail(to *mail.Address, subject, content string) (err error) { return } - -type SystemSendmail struct{} - -// system_sendmail uses the sendmail command to submit the given message -func (t *SystemSendmail) Send(from string, to []string, msg io.WriterTo) error { - cmd := exec.Command(sendmail, "-t") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - - pw, err := cmd.StdinPipe() - if err != nil { - return err - } - - err = cmd.Start() - if err != nil { - return err - } - - if _, err = msg.WriteTo(pw); err != nil { - return err - } - - if err = pw.Close(); err != nil { - return err - } - - if err = cmd.Wait(); err != nil { - return err - } - - return nil -} diff --git a/utils/mail_systemsendmail.go b/utils/mail_systemsendmail.go new file mode 100644 index 0000000..3aced8b --- /dev/null +++ b/utils/mail_systemsendmail.go @@ -0,0 +1,75 @@ +// Copyright or © or Copr. happyDNS (2020) +// +// contact@happydns.org +// +// This software is a computer program whose purpose is to provide a modern +// interface to interact with DNS systems. +// +// This software is governed by the CeCILL license under French law and abiding +// by the rules of distribution of free software. You can use, modify and/or +// redistribute the software under the terms of the CeCILL license as +// circulated by CEA, CNRS and INRIA at the following URL +// "http://www.cecill.info". +// +// As a counterpart to the access to the source code and rights to copy, modify +// and redistribute granted by the license, users are provided only with a +// limited warranty and the software's author, the holder of the economic +// rights, and the successive licensors have only limited liability. +// +// In this respect, the user's attention is drawn to the risks associated with +// loading, using, modifying and/or developing or reproducing the software by +// the user in light of its specific status of free software, that may mean +// that it is complicated to manipulate, and that also therefore means that it +// is reserved for developers and experienced professionals having in-depth +// computer knowledge. Users are therefore encouraged to load and test the +// software's suitability as regards their requirements in conditions enabling +// the security of their systems and/or data to be ensured and, more generally, +// to use and operate it in the same conditions as regards security. +// +// The fact that you are presently reading this means that you have had +// knowledge of the CeCILL license and that you accept its terms. + +package utils + +import ( + "io" + "os" + "os/exec" +) + +// sendmail contains the path to the sendmail command +const sendmail = "/usr/sbin/sendmail" + +// SystemSendmail uses the sendmail command to send message +type SystemSendmail struct{} + +// Send sends an e-mail to the given recipients using the sendmail command. +func (t *SystemSendmail) Send(from string, to []string, msg io.WriterTo) error { + cmd := exec.Command(sendmail, "-t") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + pw, err := cmd.StdinPipe() + if err != nil { + return err + } + + err = cmd.Start() + if err != nil { + return err + } + + if _, err = msg.WriteTo(pw); err != nil { + return err + } + + if err = pw.Close(); err != nil { + return err + } + + if err = cmd.Wait(); err != nil { + return err + } + + return nil +} diff --git a/utils/mail_templates.go b/utils/mail_templates.go index 568a1d5..8122997 100644 --- a/utils/mail_templates.go +++ b/utils/mail_templates.go @@ -31,6 +31,7 @@ package utils +// mailHTMLTpl is the HTML template used for email. const mailHTMLTpl = ` @@ -163,8 +164,9 @@ const mailHTMLTpl = ` ` +// mailHTMLTpl is the template used for text emails. const mailTXTTpl = `{{ .Content }} --- +-- Fred - customer support @ happyDNS Legal notice: https://www.happydns.org/en/legal-notice/` diff --git a/utils/password.go b/utils/password.go index f11e473..8ed4852 100644 --- a/utils/password.go +++ b/utils/password.go @@ -37,6 +37,7 @@ import ( "strings" ) +// GeneratePassword randomly generates a secure 12 chars long password. func GeneratePassword() (password string, err error) { // This will make a 12 chars long password b := make([]byte, 9)