From 3d961a8a5de0130e0e24956520eb738b6e145500 Mon Sep 17 00:00:00 2001 From: liquidz Date: Thu, 7 Jun 2018 09:59:02 +0900 Subject: [PATCH] Add low-level APIs to allow handing SMTP connection manually --- src/postal/smtp.clj | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/src/postal/smtp.clj b/src/postal/smtp.clj index b40cf8d..69adb39 100644 --- a/src/postal/smtp.clj +++ b/src/postal/smtp.clj @@ -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 @@ -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))))