forked from drewr/postal
-
Notifications
You must be signed in to change notification settings - Fork 0
/
smtp.clj
58 lines (55 loc) · 2.5 KB
/
smtp.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
;; Copyright (c) Andrew A. Raines
;;
;; Permission is hereby granted, free of charge, to any person
;; obtaining a copy of this software and associated documentation
;; files (the "Software"), to deal in the Software without
;; restriction, including without limitation the rights to use,
;; copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the
;; Software is furnished to do so, subject to the following
;; conditions:
;;
;; The above copyright notice and this permission notice shall be
;; included in all copies or substantial portions of the Software.
;;
;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
;; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
;; OTHER DEALINGS IN THE SOFTWARE.
(ns postal.smtp
(:use [postal.message :only [make-jmessage]]
[postal.support :only [make-props]])
(:import [javax.mail Transport Session]))
(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)
(let [jmsgs (map #(make-jmessage % session) msgs)]
(doseq [^javax.mail.Message jmsg jmsgs]
(.sendMessage transport jmsg (.getAllRecipients jmsg)))
{:code 0 :error :SUCCESS :message "messages sent"})))
(defn smtp-send
([msg]
(let [jmsg (make-jmessage msg)]
(try
(Transport/send jmsg)
{:code 0 :error :SUCCESS :message "message sent"}
(catch Exception e
{:code 99 :error (class e) :message (.getMessage e)}))))
([args & msgs]
(let [{:keys [host port user pass sender ssl debug]
:or {host "localhost"}} args
port (if (nil? port)
(if ssl 465 25)
port)
proto (if ssl "smtps" "smtp")
args (merge args {:port port
:proto proto})
session (doto (Session/getInstance (make-props sender args))
(.setDebug (if debug true false)))]
(smtp-send* session proto args msgs))))