-
Notifications
You must be signed in to change notification settings - Fork 3
/
email_bridge_in.clj
105 lines (95 loc) · 4.45 KB
/
email_bridge_in.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
(ns
#^{:author "Eric Harris-Braun"
:doc "Email Bridge receptor"}
anansi.streamscapes.channels.email-bridge-in
(:use [anansi.ceptr]
[anansi.receptor.scape]
[anansi.streamscapes.streamscapes]
[anansi.streamscapes.channel]
[anansi.util :only [date-time-from-java-date standard-date-string]])
(:use [clj-time.core :only [date-time]]))
(def email-bridge-in-def (receptor-def "email-bridge-in"
(attributes :host :account :password :protocol :port)))
(defn convertMultiPartMessage [msg]
(cond
(string? msg) msg
(= (class msg) javax.mail.internet.MimeMultipart)
(let [c (.getCount msg)]
(map (fn [i] (let [part (.getBodyPart msg i)
type (.getContentType part)
content (.getContent part)]
{:content-type type :content (if (string? content) content (str "Placeholder for content of type: " (class content)))})) (range c)))
true (str "Placeholder for content of type: " (class msg))
))
(defn parseInternetAddress [ia]
(if (nil? ia)
["_nil1_@unknown.nil","Nil in parse 1"]
(try (let [f (.getAddress ia)]
(if (nil? f)
["_nil2_@unknown.nil" "Nil in parse 2"]
[f,(.getPersonal ia)]
)
)
(catch Exception e
["_err@unknown.err",(str "Parse err:" e)]))))
(defn handle-message [_r message]
"process an e-mail: do look-up to see if we've already created a droplet for this id, and also map the email to/from addresses into identities."
(let [id (first (.getHeader message "Message-Id"))
ss (parent-of (parent-of _r))
ids (get-scape ss :id)
da (s-> address->resolve ids id)]
(if (empty? da)
(let [recipients (try (.getRecipients message javax.mail.Message$RecipientType/TO)
(catch Exception e [(javax.mail.internet.InternetAddress. (str "\"" e "\" <_err_@unknown.err>"))])
)
[to to-name] (parseInternetAddress (first recipients))
[from from-name] (parseInternetAddress
(first (try (.getFrom message)
(catch Exception e [(javax.mail.internet.InternetAddress. (str "\"" e "\" <_err_@unknown.err>"))]))))
to-id (do-identify ss {:identifiers {:email to} :attributes {:name to-name}} false)
from-id (do-identify ss {:identifiers {:email from} :attributes {:name from-name}} false)
jd (.getSentDate message)
sent (if (nil? jd) nil (date-time-from-java-date jd))
subject (.getSubject message)
]
(prn "Handling message with subject: " subject)
(if (not (nil? subject))
(--> stream->receive _r (parent-of _r)
{:id id
:to to-id
:from from-id
:sent (standard-date-string sent)
:envelope {:from "rfc-822-email" :subject "text/plain" :body (.getContentType message)}
:content {:from from
:subject subject
:body (convertMultiPartMessage (.getContent message))}})))
(first da)
)))
(defn mail-properties [_r]
(let [props (java.util.Properties.)]
(if (= "pop3" (contents _r :protocol ))
(do
(.setProperty props "mail.pop3.host" (contents _r :host ))
(.setProperty props "mail.pop3.port" (contents _r :port ))
(.setProperty props "mail.pop3.user" (contents _r :account ))
(if (= (contents _r :port ) 995)
(.setProperty props "javax.mail.pop3.socketFactory.class"
"javax.net.ssl.SSLSocketFactory")))
(.setProperty props "mail.store.protocol", "imaps"))
props))
(defn pull-messages [_r]
(let [ props (mail-properties _r)
session (doto (javax.mail.Session/getInstance props) ;(.setDebug true)
)
store (.getStore session (contents _r :protocol))]
(prn "HOST ----------> " (contents _r :host))
(.connect store (contents _r :host ) (contents _r :account) (contents _r :password))
(let [folder (. store getFolder "Inbox")]
(println "opening folder")
(.open folder (javax.mail.Folder/READ_ONLY ))
(let [message-count (.getMessageCount folder)
messages (.getMessages folder (- message-count 20) message-count)]
(println (str "retrieved" (count messages) " messages"))
(doseq [m messages] (handle-message _r m))
(.close store)
))))