aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/base/handlers.go13
-rw-r--r--session.go22
2 files changed, 19 insertions, 16 deletions
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.