diff --git a/plugins/base/handlers.go b/plugins/base/handlers.go index c96dabf..d0ba9ba 100644 --- a/plugins/base/handlers.go +++ b/plugins/base/handlers.go @@ -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") diff --git a/session.go b/session.go index d75be10..f89c785 100644 --- a/session.go +++ b/session.go @@ -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.