/
emailbee.go
100 lines (85 loc) 路 2.55 KB
/
emailbee.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
/*
* Copyright (C) 2014-2017 Christian Muehlhaeuser
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Authors:
* Christian Muehlhaeuser <muesli@gmail.com>
*/
// Package emailbee is a Bee that is able to send emails.
package emailbee
import (
"net"
"strconv"
"github.com/go-mail/mail"
"github.com/muesli/beehive/bees"
)
// EmailBee is a Bee that is able to send emails.
type EmailBee struct {
bees.Bee
username string
password string
server string
}
// Action triggers the action passed to it.
func (mod *EmailBee) Action(action bees.Action) []bees.Placeholder {
outs := []bees.Placeholder{}
switch action.Name {
case "send":
var from, to, plainText, htmlText, subject string
action.Options.Bind("sender", &from)
action.Options.Bind("recipient", &to)
action.Options.Bind("subject", &subject)
action.Options.Bind("text", &plainText)
action.Options.Bind("html", &htmlText)
m := mail.NewMessage()
if len(from) > 0 {
m.SetHeader("From", from)
} else {
m.SetHeader("From", mod.username)
}
m.SetHeader("To", to)
m.SetHeader("Subject", subject)
if plainText != "" {
m.SetBody("text/plain", plainText)
}
if htmlText != "" {
m.SetBody("text/html", htmlText)
}
host, portstr, err := net.SplitHostPort(mod.server)
if err != nil {
host = mod.server
portstr = "587"
}
port, _ := strconv.Atoi(portstr)
s, err := mail.NewDialer(host, port, mod.username, mod.password).Dial()
if err != nil {
panic(err)
}
// Send the email.
if err := mail.Send(s, m); err != nil {
panic(err)
}
default:
panic("Unknown action triggered in " + mod.Name() + ": " + action.Name)
}
return outs
}
// ReloadOptions parses the config options and initializes the Bee.
func (mod *EmailBee) ReloadOptions(options bees.BeeOptions) {
mod.SetOptions(options)
options.Bind("username", &mod.username)
options.Bind("password", &mod.password)
options.Bind("address", &mod.server)
}