/
smtp.go
133 lines (117 loc) · 2.47 KB
/
smtp.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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package checks
import (
"context"
"crypto/tls"
"fmt"
"net"
"net/smtp"
)
type Smtp struct {
checkBase
Sender string
Receiver string
Body string
Encrypted bool
}
type unencryptedAuth struct {
smtp.Auth
}
func (a unencryptedAuth) Start(server *smtp.ServerInfo) (string, []byte, error) {
s := *server
s.TLS = true
return a.Auth.Start(&s)
}
func (c Smtp) Run(teamID uint, boxIp string, res chan Result) {
// Create a dialer
dialer := net.Dialer{
Timeout: GlobalTimeout,
}
// ***********************************************
// Set up custom auth for bypassing net/smtp protections
username, password := getCreds(teamID, c.CredLists, c.Name)
auth := unencryptedAuth{smtp.PlainAuth("", username, password, boxIp)}
// ***********************************************
// The good way to do auth
// auth := smtp.PlainAuth("", d.Username, d.Password, d.Host)
// Create TLS config
tlsConfig := tls.Config{
InsecureSkipVerify: true,
}
// Declare these for the below if block
var conn net.Conn
var err error
if c.Encrypted {
conn, err = tls.DialWithDialer(&dialer, "tcp", fmt.Sprintf("%s:%d", boxIp, c.Port), &tlsConfig)
} else {
conn, err = dialer.DialContext(context.TODO(), "tcp", fmt.Sprintf("%s:%d", boxIp, c.Port))
}
if err != nil {
res <- Result{
Error: "connection to server failed",
Debug: err.Error(),
}
return
}
defer conn.Close()
// Create smtp client
sconn, err := smtp.NewClient(conn, boxIp)
if err != nil {
res <- Result{
Error: "smtp client creation failed",
Debug: err.Error(),
}
return
}
defer sconn.Quit()
// Login
err = sconn.Auth(auth)
if err != nil {
res <- Result{
Error: "login failed",
Debug: err.Error(),
}
return
}
// Set the sender
err = sconn.Mail(c.Sender)
if err != nil {
res <- Result{
Error: "setting sender failed",
Debug: err.Error(),
}
return
}
// Set the receiver
err = sconn.Rcpt(c.Receiver)
if err != nil {
res <- Result{
Error: "setting receiver failed",
Debug: err.Error(),
}
return
}
// Create email writer
wc, err := sconn.Data()
if err != nil {
res <- Result{
Error: "creating email writer failed",
Debug: err.Error(),
}
return
}
defer wc.Close()
// Write the body
_, err = fmt.Fprintf(wc, c.Body)
if err != nil {
res <- Result{
Error: "writing body failed",
Debug: err.Error(),
}
return
}
res <- Result{
Status: true,
Debug: "successfully wrote '" + c.Body + "' to " + c.Receiver + " from " + c.Sender,
}
return
}