Basti's Scratchpad on the Internet

Using Java Mail API from Clojure

Java API does not provide a way to send mail or interface with POP/IMAP servers, but Sun does provide a framework to build mail and messaging applications.

You can get the JavaMail jars from Clojars,

[javax.mail/mail "1.4.3"]

Following is a simple function that allows you to send mail from Clojure. I use this snippet to send email through GMail, I have not tested it anywhere else, but it should work.

(defn 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))))
	  recipients (reduce #(str % "," %2) (:to mail))
	  session (javax.mail.Session/getInstance props authenticator)
	  msg     (javax.mail.internet.MimeMessage. session)]

      (.setFrom msg (javax.mail.internet.InternetAddress. (:user mail)))

      (.setRecipients msg 
		      (javax.mail.Message$RecipientType/TO)
		      (javax.mail.internet.InternetAddress/parse recipients))

      (.setSubject msg (:subject mail))
      (.setText msg (:text mail))
      (javax.mail.Transport/send msg))))
(mail :user "user@gmail.com"
      :password "pass"
      :host "smtp.gmail.com"
      :port 465
      :ssl true
      :to ["nurullah@nakkaya.com" ]
      :subject "I Have Rebooted." 
      :text "I Have Rebooted.")
Other posts
comments powered by Disqus