(ns email (:import org.antlr.stringtemplate.StringTemplateGroup) (:require [clojure.contrib.str-utils2 :as s])) (defn base-mail [& m] (let [mail (apply hash-map m) props (java.util.Properties.)] (doto props (.put "mail.smtp.host" (:host mail)) (.put "mail.smtp.port" (:port mail)) (.put "mail.smtp.user" (:user mail)) (.put "mail.smtp.socketFactory.port" (:port mail)) (.put "mail.smtp.auth" "true")) (if (= (:ssl mail) true) (doto props (.put "mail.smtp.starttls.enable" "true") (.put "mail.smtp.socketFactory.class" "javax.net.ssl.SSLSocketFactory") (.put "mail.smtp.socketFactory.fallback" "false"))) (let [authenticator (proxy [javax.mail.Authenticator] [] (getPasswordAuthentication [] (javax.mail.PasswordAuthentication. (:user mail) (:password mail)))) session (javax.mail.Session/getDefaultInstance props authenticator) msg (javax.mail.internet.MimeMessage. session)] (.setFrom msg (javax.mail.internet.InternetAddress. (:user mail))) (doseq [to (:to mail)] (.setRecipients msg (javax.mail.Message$RecipientType/TO) (javax.mail.internet.InternetAddress/parse to))) (.setSubject msg (:subject mail)) (.setContent msg (:text mail) (:mime mail)) (javax.mail.Transport/send msg)))) (def mail-templates (StringTemplateGroup. "dumpfm-mail" "template/mail" )) (.setRefreshInterval mail-templates 3) (defn parse-mail-template [temp props] (let [st (.getInstanceOf mail-templates temp)] (doseq [[k v] props] (.setAttribute st k v)) (let [[s b] (.split (.toString st) "\\n" 2)] [(.trim (.replaceFirst s "SUBJECT: " "")) (.trim b)]))) (defn classify-mimetype [text] (if (and (re-find #"(?i)" text) (re-find #"(?i)" text)) "text/html" "text/plain")) (defn dump-mail [to subject text] (base-mail :user "info@dump.fm" :password "dumprulez7" :host "smtpout.secureserver.net" :port 25 :ssl false :to to :subject subject :text text :mime (classify-mimetype text))) (defn send-registration-email ([nick email] (send-registration-email nick email "welcome")) ([nick email temp] (let [[s b] (parse-mail-template temp {"nick" nick})] (dump-mail [email] s b)))) (defn send-reset-email [nick email key] (let [[s b] (parse-mail-template "reset" {"nick" nick "key" key})] (dump-mail [email] s b)))