]>
src.bluestatic.org Git - mailpopbox.git/blob - smtp/server.go
2 // Copyright 2020 Blue Static <https://www.bluestatic.org>
3 // This program is free software licensed under the GNU General Public License,
4 // version 3.0. The full text of the license can be found in LICENSE.txt.
5 // SPDX-License-Identifier: GPL-3.0-only
21 type ReplyLine
struct {
26 func (l ReplyLine
) String() string {
27 return fmt
.Sprintf("%d %s", l
.Code
, l
.Message
)
30 var SendAsSubject
= regexp
.MustCompile(`(?i)\[sendas:\s*([a-zA-Z0-9\.\-_]+)\]`)
33 ReplyOK
= ReplyLine
{250, "OK"}
34 ReplyBadSyntax
= ReplyLine
{501, "syntax error"}
35 ReplyBadSequence
= ReplyLine
{503, "bad sequence of commands"}
36 ReplyBadMailbox
= ReplyLine
{550, "mailbox unavailable"}
37 ReplyMailboxUnallowed
= ReplyLine
{553, "mailbox name not allowed"}
40 func DomainForAddress(addr mail
.Address
) string {
41 return DomainForAddressString(addr
.Address
)
44 func DomainForAddressString(address
string) string {
45 domainIdx
:= strings
.LastIndex(address
, "@")
49 return address
[domainIdx
+1:]
52 type Envelope
struct {
62 func WriteEnvelopeForDelivery(w io
.Writer
, e Envelope
) {
63 fmt
.Fprintf(w
, "Delivered-To: <%s>\r\n", e
.RcptTo
[0].Address
)
64 fmt
.Fprintf(w
, "Return-Path: <%s>\r\n", e
.MailFrom
.Address
)
68 func generateEnvelopeId(prefix
string, t time
.Time
) string {
71 return fmt
.Sprintf("%s.%d.%x", prefix
, t
.UnixNano(), idBytes
)
74 type Server
interface {
76 TLSConfig() *tls
.Config
77 VerifyAddress(mail
.Address
) ReplyLine
78 // Verify that the authc+passwd identity can send mail as authz.
79 Authenticate(authz
, authc
, passwd
string) bool
80 OnMessageDelivered(Envelope
) *ReplyLine
82 // RelayMessage instructs the server to send the Envelope to another
83 // MTA for outbound delivery.
84 RelayMessage(Envelope
)
87 type EmptyServerCallbacks
struct{}
89 func (*EmptyServerCallbacks
) TLSConfig() *tls
.Config
{
93 func (*EmptyServerCallbacks
) VerifyAddress(mail
.Address
) ReplyLine
{
97 func (*EmptyServerCallbacks
) Authenticate(authz
, authc
, passwd
string) bool {
101 func (*EmptyServerCallbacks
) OnMessageDelivered(Envelope
) *ReplyLine
{
105 func (*EmptyServerCallbacks
) RelayMessage(Envelope
) {