Skip to content

Commit

Permalink
Add store implementation that supports XOauth2
Browse files Browse the repository at this point in the history
  • Loading branch information
danieltreacy committed Dec 8, 2015
1 parent 0d97434 commit d7dd0cc
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 15 deletions.
44 changes: 30 additions & 14 deletions src/clojure_mail/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
[java.io FileInputStream File]
[javax.mail.internet MimeMessage]
[javax.mail Session
Folder
Flags
Flags$Flag AuthenticationFailedException]
Folder
Flags
Flags$Flag AuthenticationFailedException]
(com.sun.mail.imap IMAPStore)))

(defonce ^:dynamic *store* nil)
Expand Down Expand Up @@ -53,8 +53,8 @@
(defn get-session
[protocol]
(let [p (as-properties
{"mail.store.protocol" protocol
(format "mail.%s.usesocketchannels" protocol) true})]
{"mail.store.protocol" protocol
(format "mail.%s.usesocketchannels" protocol) true})]
(Session/getInstance p)))

(defn server->host-port
Expand Down Expand Up @@ -87,15 +87,31 @@
(store "imaps" server email pass))
([protocol server email pass]
(let [p (as-properties
{"mail.store.protocol" protocol
(format "mail.%s.usesocketchannels" protocol) true})
{"mail.store.protocol" protocol
(format "mail.%s.usesocketchannels" protocol) true})
session (Session/getInstance p)]
(store protocol session server email pass)))
([protocol session server email pass]
(let [[target-host target-port] (server->host-port protocol server)]
(doto (.getStore session protocol)
(.connect ^String target-host ^int target-port ^String email ^String pass)))))

(defn xoauth2-store
([server email oauth-token]
(xoauth2-store "imaps" server email oauth-token)
)
([protocol server email oauth-token]
(let [p (as-properties
{(format "mail.%s.ssl.enable" protocol) true
(format "mail.%s.sasl.enable" protocol) true
(format "mail.%s.auth.login.disable" protocol) true
(format "mail.%s.auth.plain.disable" protocol) true
(format "mail.%s.auth.mechanisms" protocol) "XOAUTH2"
(format "mail.%s.usesocketchannels" protocol) true})
session (Session/getInstance p)]
(store protocol session server email oauth-token)
)))

(defn connected?
"Returns true if a connection is established"
[^IMAPStore s]
Expand Down Expand Up @@ -123,7 +139,7 @@
"Check if a folder is a sub folder"
(fn [folder]
(if (= 0 (bit-and
(.getType folder) Folder/HOLDS_FOLDERS))
(.getType folder) Folder/HOLDS_FOLDERS))
false
true)))

Expand All @@ -132,10 +148,10 @@
([store] (folders store (.getDefaultFolder store)))
([store f]
(map
#(cons (.getName %)
(if (sub-folder? %)
(folders store %)))
(.list f))))
#(cons (.getName %)
(if (sub-folder? %)
(folders store %)))
(.list f))))

(def folder-permissions
{:readonly Folder/READ_ONLY
Expand Down Expand Up @@ -184,14 +200,14 @@
(drop 1 (message/id message)))]
(.writeTo message
(java.io.FileOutputStream.
filename))))
filename))))

(defn dump
"Handy function that dumps out a batch of emails to disk"
[msgs]
(let [message-futures
(doall
(map #(future (save-message-to-file %)) msgs))]
(map #(future (save-message-to-file %)) msgs))]
(map deref message-futures)))

;; Public API
Expand Down
6 changes: 5 additions & 1 deletion src/clojure_mail/gmail.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@
([session email password]
(mail/store "imaps" session "imap.gmail.com" email password)))

(defn xoauth-store
([email oauth-access-token]
(mail/store "imaps" "imap.gmail.com"

(def gmail-folders
{:inbox "INBOX"
:all "[Gmail]/All Mail"
Expand All @@ -25,4 +29,4 @@
([folder-name perm-level]
(mail/open-folder (folder->folder-name folder-name) perm-level))
([store folder-name perm-level]
(mail/open-folder store (folder->folder-name folder-name) perm-level)))
(mail/open-folder store (folder->folder-name folder-name) perm-level)))

0 comments on commit d7dd0cc

Please sign in to comment.