Browse Source

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.
master
Simon Ser 4 years ago
parent
commit
622f00fe06
No known key found for this signature in database GPG Key ID: FDE7BE0E88F5E48
2 changed files with 19 additions and 16 deletions
  1. +4
    -9
      plugins/base/handlers.go
  2. +15
    -7
      session.go

+ 4
- 9
plugins/base/handlers.go 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")


+ 15
- 7
session.go 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.


Loading…
Cancel
Save