forked from marcw/ezmail
-
Notifications
You must be signed in to change notification settings - Fork 1
/
mail.go
116 lines (93 loc) · 2.68 KB
/
mail.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// Copyright 2013 Marc Weistroff. All rights reserved.
// Use of this source code is governed by a MIT
// license that can be found in the LICENSE file.
// package ezmail implements basic mail creation to ease the net/smtp package use
package ezmail
import (
"bytes"
"fmt"
"net/mail"
"strings"
)
// A Message represents an electronic message
// Usage:
// msg := ezmail.Message{}
// msg.SetFrom("Marc Weistroff", "marc@example.org")
// msg.AddTo("Recipient 1", "recipient1@example.org")
// msg.AddTo("", "foobar@example.org")
// msg.AddCC("", "cc@example.org")
// msg.Subject = "Hey, message subject"
// msg.Body = "plain text body"
// msg.Headers["Content-Type"] = "text/plain"
// smtp.SendMail(addr, auth, msg.From.String(), msg.Recipients(), msg.Bytes())
//
type Message struct {
From mail.Address
To, Cc, Bcc []mail.Address
Subject string
Body string
Headers map[string]string
}
func NewMessage() *Message {
return &Message{Headers:map[string]string{}}
}
// Bytes returns the []byte representation of the message
func (msg *Message) Bytes() []byte {
var b bytes.Buffer
b.WriteString(fmt.Sprintln("From:", msg.From.String()))
if len(msg.To) > 0 {
b.WriteString(fmt.Sprintln("To:", listToString(msg.To)))
}
if len(msg.Cc) > 0 {
b.WriteString(fmt.Sprintln("Cc:", listToString(msg.Cc)))
}
if len(msg.Bcc) > 0 {
b.WriteString(fmt.Sprintln("Bcc:", listToString(msg.Bcc)))
}
for k, v := range msg.Headers {
b.WriteString(fmt.Sprintf("%s:%s\n", k, v))
}
b.WriteString(fmt.Sprintln("Subject:", msg.Subject))
b.WriteString(fmt.Sprintln())
b.WriteString(msg.Body)
return b.Bytes()
}
func (msg *Message) SetFrom(name, email string) {
msg.From = mail.Address{name, email}
}
func (msg *Message) AddTo(name, email string) {
msg.To = append(msg.To, mail.Address{name, email})
}
func (msg *Message) AddCc(name, email string) {
msg.Cc = append(msg.Cc, mail.Address{name, email})
}
func (msg *Message) AddBcc(name, email string) {
msg.Bcc = append(msg.Bcc, mail.Address{name, email})
}
// String returns the string representation of the message
func (msg *Message) String() string {
return string(msg.Bytes())
}
// Returns list of recipients (Format: "Recipient Name <recipientemail@example.com>")
func (msg *Message) Recipients() []string {
var r []string
for _, v := range msg.To {
r = append(r, v.String())
}
return r
}
// Returns list of recipient email addresses
func (msg *Message) RecipientsEmails() []string {
var r []string
for _, v := range msg.To {
r = append(r, v.Address)
}
return r
}
func listToString(addresses []mail.Address) string {
var list []string
for _, a := range addresses {
list = append(list, a.String())
}
return strings.Join(list, ",")
}