1package mail_test 2 3import ( 4 "fmt" 5 "html/template" 6 "io" 7 "log" 8 "time" 9 10 "gopkg.in/mail.v2" 11) 12 13func Example() { 14 m := mail.NewMessage() 15 m.SetHeader("From", "alex@example.com") 16 m.SetHeader("To", "bob@example.com", "cora@example.com") 17 m.SetAddressHeader("Cc", "dan@example.com", "Dan") 18 m.SetHeader("Subject", "Hello!") 19 m.SetBody("text/html", "Hello <b>Bob</b> and <i>Cora</i>!") 20 m.Attach("/home/Alex/lolcat.jpg") 21 22 d := mail.NewDialer("smtp.example.com", 587, "user", "123456") 23 d.StartTLSPolicy = mail.MandatoryStartTLS 24 25 // Send the email to Bob, Cora and Dan. 26 if err := d.DialAndSend(m); err != nil { 27 panic(err) 28 } 29} 30 31// A daemon that listens to a channel and sends all incoming messages. 32func Example_daemon() { 33 ch := make(chan *mail.Message) 34 35 go func() { 36 d := mail.NewDialer("smtp.example.com", 587, "user", "123456") 37 d.StartTLSPolicy = mail.MandatoryStartTLS 38 39 var s mail.SendCloser 40 var err error 41 open := false 42 for { 43 select { 44 case m, ok := <-ch: 45 if !ok { 46 return 47 } 48 if !open { 49 if s, err = d.Dial(); err != nil { 50 panic(err) 51 } 52 open = true 53 } 54 if err := mail.Send(s, m); err != nil { 55 log.Print(err) 56 } 57 // Close the connection to the SMTP server if no email was sent in 58 // the last 30 seconds. 59 case <-time.After(30 * time.Second): 60 if open { 61 if err := s.Close(); err != nil { 62 panic(err) 63 } 64 open = false 65 } 66 } 67 } 68 }() 69 70 // Use the channel in your program to send emails. 71 72 // Close the channel to stop the mail daemon. 73 close(ch) 74} 75 76// Efficiently send a customized newsletter to a list of recipients. 77func Example_newsletter() { 78 // The list of recipients. 79 var list []struct { 80 Name string 81 Address string 82 } 83 84 d := mail.NewDialer("smtp.example.com", 587, "user", "123456") 85 d.StartTLSPolicy = mail.MandatoryStartTLS 86 s, err := d.Dial() 87 if err != nil { 88 panic(err) 89 } 90 91 m := mail.NewMessage() 92 for _, r := range list { 93 m.SetHeader("From", "no-reply@example.com") 94 m.SetAddressHeader("To", r.Address, r.Name) 95 m.SetHeader("Subject", "Newsletter #1") 96 m.SetBody("text/html", fmt.Sprintf("Hello %s!", r.Name)) 97 98 if err := mail.Send(s, m); err != nil { 99 log.Printf("Could not send email to %q: %v", r.Address, err) 100 } 101 m.Reset() 102 } 103} 104 105// Send an email using a local SMTP server. 106func Example_noAuth() { 107 m := mail.NewMessage() 108 m.SetHeader("From", "from@example.com") 109 m.SetHeader("To", "to@example.com") 110 m.SetHeader("Subject", "Hello!") 111 m.SetBody("text/plain", "Hello!") 112 113 d := mail.Dialer{Host: "localhost", Port: 587} 114 if err := d.DialAndSend(m); err != nil { 115 panic(err) 116 } 117} 118 119// Send an email using an API or postfix. 120func Example_noSMTP() { 121 m := mail.NewMessage() 122 m.SetHeader("From", "from@example.com") 123 m.SetHeader("To", "to@example.com") 124 m.SetHeader("Subject", "Hello!") 125 m.SetBody("text/plain", "Hello!") 126 127 s := mail.SendFunc(func(from string, to []string, msg io.WriterTo) error { 128 // Implements you email-sending function, for example by calling 129 // an API, or running postfix, etc. 130 fmt.Println("From:", from) 131 fmt.Println("To:", to) 132 return nil 133 }) 134 135 if err := mail.Send(s, m); err != nil { 136 panic(err) 137 } 138 // Output: 139 // From: from@example.com 140 // To: [to@example.com] 141} 142 143var m *mail.Message 144 145func ExampleSetCopyFunc() { 146 m.Attach("foo.txt", mail.SetCopyFunc(func(w io.Writer) error { 147 _, err := w.Write([]byte("Content of foo.txt")) 148 return err 149 })) 150} 151 152func ExampleSetHeader() { 153 h := map[string][]string{"Content-ID": {"<foo@bar.mail>"}} 154 m.Attach("foo.jpg", mail.SetHeader(h)) 155} 156 157func ExampleRename() { 158 m.Attach("/tmp/0000146.jpg", mail.Rename("picture.jpg")) 159} 160 161func ExampleMessage_AddAlternative() { 162 m.SetBody("text/plain", "Hello!") 163 m.AddAlternative("text/html", "<p>Hello!</p>") 164} 165 166func ExampleMessage_AddAlternativeWriter() { 167 t := template.Must(template.New("example").Parse("Hello {{.}}!")) 168 m.AddAlternativeWriter("text/plain", func(w io.Writer) error { 169 return t.Execute(w, "Bob") 170 }) 171} 172 173func ExampleMessage_Attach() { 174 m.Attach("/tmp/image.jpg") 175} 176 177func ExampleMessage_Embed() { 178 m.Embed("/tmp/image.jpg") 179 m.SetBody("text/html", `<img src="cid:image.jpg" alt="My image" />`) 180} 181 182func ExampleMessage_FormatAddress() { 183 m.SetHeader("To", m.FormatAddress("bob@example.com", "Bob"), m.FormatAddress("cora@example.com", "Cora")) 184} 185 186func ExampleMessage_FormatDate() { 187 m.SetHeaders(map[string][]string{ 188 "X-Date": {m.FormatDate(time.Now())}, 189 }) 190} 191 192func ExampleMessage_SetAddressHeader() { 193 m.SetAddressHeader("To", "bob@example.com", "Bob") 194} 195 196func ExampleMessage_SetBody() { 197 m.SetBody("text/plain", "Hello!") 198} 199 200func ExampleMessage_SetBodyWriter() { 201 t := template.Must(template.New("example").Parse("Hello {{.}}!")) 202 m.SetBodyWriter("text/plain", func(w io.Writer) error { 203 return t.Execute(w, "Bob") 204 }) 205} 206 207func ExampleMessage_SetDateHeader() { 208 m.SetDateHeader("X-Date", time.Now()) 209} 210 211func ExampleMessage_SetHeader() { 212 m.SetHeader("Subject", "Hello!") 213} 214 215func ExampleMessage_SetHeaders() { 216 m.SetHeaders(map[string][]string{ 217 "From": {m.FormatAddress("alex@example.com", "Alex")}, 218 "To": {"bob@example.com", "cora@example.com"}, 219 "Subject": {"Hello"}, 220 }) 221} 222 223func ExampleSetCharset() { 224 m = mail.NewMessage(mail.SetCharset("ISO-8859-1")) 225} 226 227func ExampleSetEncoding() { 228 m = mail.NewMessage(mail.SetEncoding(mail.Base64)) 229} 230 231func ExampleSetPartEncoding() { 232 m.SetBody("text/plain", "Hello!", mail.SetPartEncoding(mail.Unencoded)) 233} 234