@@ -18,6 +18,8 @@ module Network.Mail.SMTP
1818 , sendMailSTARTTLS'
1919 , sendMailWithLoginSTARTTLS
2020 , sendMailWithLoginSTARTTLS'
21+ , sendMailWithLoginOAuthSTARTTLS
22+ , sendMailWithLoginOAuthSTARTTLS'
2123 , sendMailWithSenderSTARTTLS
2224 , sendMailWithSenderSTARTTLS'
2325 , simpleMail
@@ -260,6 +262,17 @@ sendCommand (SMTPC conn _) (AUTH LOGIN username password) = do
260262 command = " AUTH LOGIN"
261263 (userB64, passB64) = encodeLogin username password
262264
265+ sendCommand (SMTPC conn _) (AUTH LOGIN_OAUTH username token) = do
266+ bsPutCrLf conn command
267+ _ <- parseResponse conn
268+ bsPutCrLf conn tokenB64
269+ (code, msg) <- parseResponse conn
270+ unless (code == 235 ) $ fail " authentication failed."
271+ return (code, msg)
272+ where
273+ command = " AUTH XOAUTH2"
274+ tokenB64 = encodeLoginOAuth username token
275+
263276sendCommand (SMTPC conn _) (AUTH at username password) = do
264277 bsPutCrLf conn command
265278 (code, msg) <- parseResponse conn
@@ -364,6 +377,14 @@ sendMailWithLoginTLS host user pass mail = connectSMTPS host >>= sendMailWithLog
364377sendMailWithLoginTLS' :: HostName -> PortNumber -> UserName -> Password -> Mail -> IO ()
365378sendMailWithLoginTLS' host port user pass mail = connectSMTPS' host port >>= sendMailWithLoginIntern user pass mail
366379
380+ -- | Connect to an SMTP server, login with OAuth, send a 'Mail', disconnect. Uses STARTTLS with the default port (587).
381+ sendMailWithLoginOAuthSTARTTLS :: HostName -> UserName -> Token -> Mail -> IO ()
382+ sendMailWithLoginOAuthSTARTTLS host user token mail = connectSMTPSTARTTLS host >>= sendMailWithLoginOAuthIntern user token mail
383+
384+ -- | Connect to an SMTP server, login with OAuth, send a 'Mail', disconnect. Uses STARTTLS.
385+ sendMailWithLoginOAuthSTARTTLS' :: HostName -> PortNumber -> UserName -> Token -> Mail -> IO ()
386+ sendMailWithLoginOAuthSTARTTLS' host port user token mail = connectSMTPSTARTTLS' host port >>= sendMailWithLoginOAuthIntern user token mail
387+
367388-- | Send a 'Mail' with a given sender. Uses SMTPS with its default port (465).
368389sendMailWithSenderTLS :: ByteString -> HostName -> Mail -> IO ()
369390sendMailWithSenderTLS sender host mail = connectSMTPS host >>= sendMailWithSenderIntern sender mail
@@ -402,6 +423,12 @@ sendMailWithLoginIntern user pass mail con = do
402423 renderAndSend con mail
403424 closeSMTP con
404425
426+ sendMailWithLoginOAuthIntern :: UserName -> Password -> Mail -> SMTPConnection -> IO ()
427+ sendMailWithLoginOAuthIntern user token mail con = do
428+ _ <- sendCommand con (AUTH LOGIN_OAUTH user token)
429+ renderAndSend con mail
430+ closeSMTP con
431+
405432sendMailWithSenderIntern :: ByteString -> Mail -> SMTPConnection -> IO ()
406433sendMailWithSenderIntern sender mail con = do
407434 renderAndSendFrom sender con mail
0 commit comments