Replace Session.ConnectSMTP with Session.DoSMTP

This gives more flexibility in Session for optimizations, e.g. keep the
SMTP connection around for some time if possible.
This commit is contained in:
Simon Ser 2019-12-16 13:07:35 +01:00
parent d01c85616a
commit 622f00fe06
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48
2 changed files with 19 additions and 16 deletions

View file

@ -13,6 +13,7 @@ import (
"github.com/emersion/go-imap"
imapclient "github.com/emersion/go-imap/client"
"github.com/emersion/go-message"
"github.com/emersion/go-smtp"
"github.com/labstack/echo/v4"
)
@ -257,7 +258,9 @@ func handleCompose(ectx echo.Context) error {
msg.Text = ctx.FormValue("text")
msg.InReplyTo = ctx.FormValue("in_reply_to")
c, err := ctx.Session.ConnectSMTP()
err := ctx.Session.DoSMTP(func(c *smtp.Client) error {
return sendMessage(c, &msg)
})
if err != nil {
if _, ok := err.(koushin.AuthError); ok {
return echo.NewHTTPError(http.StatusForbidden, err)
@ -265,14 +268,6 @@ func handleCompose(ectx echo.Context) error {
return err
}
if err := sendMessage(c, &msg); err != nil {
return err
}
if err := c.Quit(); err != nil {
return fmt.Errorf("QUIT failed: %v", err)
}
// TODO: append to IMAP Sent mailbox
return ctx.Redirect(http.StatusFound, "/mailbox/INBOX")

View file

@ -76,21 +76,29 @@ func (s *Session) DoIMAP(f func(*imapclient.Client) error) error {
return f(s.imapConn)
}
// ConnectSMTP connects to the upstream SMTP server and authenticates this
// session.
func (s *Session) ConnectSMTP() (*smtp.Client, error) {
// DoSMTP executes an SMTP operation on this session. The SMTP client can only
// be used from inside f.
func (s *Session) DoSMTP(f func(*smtp.Client) error) error {
c, err := s.manager.dialSMTP()
if err != nil {
return nil, err
return err
}
defer c.Close()
auth := sasl.NewPlainClient("", s.username, s.password)
if err := c.Auth(auth); err != nil {
c.Close()
return nil, AuthError{err}
return AuthError{err}
}
return c, nil
if err := f(c); err != nil {
return err
}
if err := c.Quit(); err != nil {
return fmt.Errorf("QUIT failed: %v", err)
}
return nil
}
// Close destroys the session. This can be used to log the user out.