Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 30 additions & 9 deletions src/postal/smtp.clj
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,36 @@
[postal.support :only [make-props]])
(:import [javax.mail Transport Session]))

(defn get-session [server]
(let [{:keys [sender debug]} server]
(doto (Session/getInstance (make-props sender server))
(.setDebug (if debug true false)))))

(defn get-protocol [server]
(if (:ssl server) "smtps" "smtp"))

(defn get-transport [^Session session ^String protocol]
(.getTransport session protocol))

(defn connect! [^Transport transport server]
(let [{:keys [host port user pass]} server]
(assert (or (and (nil? user) (nil? pass)) (and user pass)))
(.connect transport host port user pass)))

(defn transport-send
([^Transport transport ^Session session msg]
(transport-send transport (make-jmessage msg session)))
([^Transport transport ^javax.mail.Message jmsg]
(.sendMessage transport jmsg (.getAllRecipients jmsg))
{:code 0 :error :SUCCESS :message "messages sent"}))

(defn ^:dynamic smtp-send* [^Session session ^String proto
{:keys [host port user pass]} msgs]
(assert (or (and (nil? user) (nil? pass)) (and user pass)))
(with-open [transport (.getTransport session proto)]
(.connect transport host port user pass)
{:keys [user pass] :as args} msgs]
(with-open [^Transport transport (get-transport session proto)]
(connect! transport args)
(let [jmsgs (map #(make-jmessage % session) msgs)]
(doseq [^javax.mail.Message jmsg jmsgs]
(.sendMessage transport jmsg (.getAllRecipients jmsg)))
(transport-send transport jmsg))
{:code 0 :error :SUCCESS :message "messages sent"})))

(defn smtp-send
Expand All @@ -45,14 +67,13 @@
(catch Exception e
{:code 99 :error (class e) :message (.getMessage e)}))))
([args & msgs]
(let [{:keys [host port user pass sender ssl debug]
(let [{:keys [host port ssl]
:or {host "localhost"}} args
port (if (nil? port)
(if ssl 465 25)
port)
proto (if ssl "smtps" "smtp")
proto (get-protocol args)
args (merge args {:port port
:proto proto})
session (doto (Session/getInstance (make-props sender args))
(.setDebug (if debug true false)))]
session (get-session args)]
(smtp-send* session proto args msgs))))