aboutsummaryrefslogtreecommitdiff
path: root/session.go
diff options
context:
space:
mode:
Diffstat (limited to 'session.go')
-rw-r--r--session.go22
1 files changed, 15 insertions, 7 deletions
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.