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
|
package smtpclient
import (
"bufio"
"context"
"net"
"strings"
"testing"
"time"
)
func TestSendUsesConfiguredEnvelopeFrom(t *testing.T) {
server, client := net.Pipe()
defer client.Close()
commands := make(chan string, 32)
done := make(chan struct{})
go func() {
defer close(done)
defer close(commands)
defer server.Close()
r := bufio.NewReader(server)
w := bufio.NewWriter(server)
_, _ = w.WriteString("220 test\r\n")
_ = w.Flush()
inData := false
for {
line, err := r.ReadString('\n')
if err != nil {
return
}
commands <- line
switch {
case inData && line != ".\r\n":
continue
case strings.HasPrefix(line, "EHLO "):
_, _ = w.WriteString("250 test\r\n")
case strings.HasPrefix(line, "MAIL FROM:"):
_, _ = w.WriteString("250 ok\r\n")
case strings.HasPrefix(line, "RCPT TO:"):
_, _ = w.WriteString("250 ok\r\n")
case strings.HasPrefix(line, "DATA"):
inData = true
_, _ = w.WriteString("354 go ahead\r\n")
case line == ".\r\n":
inData = false
_, _ = w.WriteString("250 queued\r\n")
case strings.HasPrefix(line, "QUIT"):
_, _ = w.WriteString("221 bye\r\n")
_ = w.Flush()
return
default:
continue
}
_ = w.Flush()
}
}()
mailer := New(Config{
Host: "mail2news.tcpreset.net",
Port: 25,
Recipient: "mail2news@mail2news.tcpreset.net",
EnvelopeFrom: "n2usenet@virebent.art",
HELO: "n2usenet.virebent.art",
RequireTLS: false,
Timeout: 5 * time.Second,
}, func(ctx context.Context, network, address string) (net.Conn, error) {
return client, nil
})
if err := mailer.Send(context.Background(), Message{
EnvelopeFrom: "user@example.invalid",
Raw: "From: User <user@example.invalid>\r\nTo: mail2news@mail2news.tcpreset.net\r\nSubject: Test\r\n\r\nhello",
}); err != nil {
t.Fatalf("Send returned error: %v", err)
}
var sawConfiguredFrom bool
for line := range commands {
if line == "MAIL FROM:<n2usenet@virebent.art>\r\n" {
sawConfiguredFrom = true
break
}
}
<-done
if !sawConfiguredFrom {
t.Fatal("configured envelope sender was not used")
}
}
|