diff --git a/config.go b/config.go index 44ac06f..bc98e20 100644 --- a/config.go +++ b/config.go @@ -25,6 +25,7 @@ var ( remoteHost = flag.String("remote_host", "smtp.gmail.com:587", "Outgoing SMTP server") remoteUser = flag.String("remote_user", "", "Username for authentication on outgoing SMTP server") remotePass = flag.String("remote_pass", "", "Password for authentication on outgoing SMTP server") + remoteAuth = flag.String("remote_auth", "plain", "Auth method on outgoing SMTP server (plain, login)") remoteSender = flag.String("remote_sender", "", "Sender e-mail address on outgoing SMTP server") versionInfo = flag.Bool("version", false, "Show version information") ) diff --git a/main.go b/main.go index db4719c..9b03aad 100644 --- a/main.go +++ b/main.go @@ -110,7 +110,14 @@ func mailHandler(peer smtpd.Peer, env smtpd.Envelope) error { host, _, _ := net.SplitHostPort(*remoteHost) if *remoteUser != "" && *remotePass != "" { - auth = smtp.PlainAuth("", *remoteUser, *remotePass, host) + switch *remoteAuth { + case "plain": + auth = smtp.PlainAuth("", *remoteUser, *remotePass, host) + case "login": + auth = LoginAuth(*remoteUser, *remotePass) + default: + return smtpd.Error{Code: 530, Message: "Authentication method not supported"} + } } env.AddReceivedLine(peer) diff --git a/smtp.go b/smtp.go index c928f5d..bce7144 100644 --- a/smtp.go +++ b/smtp.go @@ -451,3 +451,30 @@ func validateLine(line string) error { } return nil } + +// LOGIN authentication +type loginAuth struct { + username, password string +} + +func LoginAuth(username, password string) smtp.Auth { + return &loginAuth{username, password} +} + +func (a *loginAuth) Start(server *smtp.ServerInfo) (string, []byte, error) { + return "LOGIN", []byte{}, nil +} + +func (a *loginAuth) Next(fromServer []byte, more bool) ([]byte, error) { + if more { + switch string(fromServer) { + case "Username:": + return []byte(a.username), nil + case "Password:": + return []byte(a.password), nil + default: + return nil, errors.New("Unkown fromServer") + } + } + return nil, nil +} diff --git a/smtprelay.ini b/smtprelay.ini index c4c2add..38bdd5a 100644 --- a/smtprelay.ini +++ b/smtprelay.ini @@ -55,5 +55,9 @@ ;remote_user = ;remote_pass = +; Authentication method on outgoing SMTP server +; (plain, login) +;remote_auth = plain + ; Sender e-mail address on outgoing SMTP server ;remote_sender =