001 /**
002 * Copyright 2005-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.core.mail;
017
018 import org.kuali.rice.core.api.mail.EmailBcList;
019 import org.kuali.rice.core.api.mail.EmailBody;
020 import org.kuali.rice.core.api.mail.EmailCcList;
021 import org.kuali.rice.core.api.mail.EmailFrom;
022 import org.kuali.rice.core.api.mail.EmailSubject;
023 import org.kuali.rice.core.api.mail.EmailTo;
024 import org.kuali.rice.core.api.mail.EmailToList;
025 import org.kuali.rice.core.api.mail.MailMessage;
026 import org.kuali.rice.core.api.mail.Mailer;
027 import org.springframework.mail.MailException;
028 import org.springframework.mail.SimpleMailMessage;
029 import org.springframework.mail.javamail.JavaMailSenderImpl;
030
031 import javax.activation.DataHandler;
032 import javax.mail.Address;
033 import javax.mail.Message;
034 import javax.mail.MessagingException;
035 import javax.mail.internet.AddressException;
036 import javax.mail.internet.InternetAddress;
037 import javax.mail.internet.MimeMessage;
038 import javax.mail.util.ByteArrayDataSource;
039 import java.io.IOException;
040
041
042 /**
043 * Maintains a Java Mail session and is used for sending e-mails.
044 *
045 * @author Kuali Rice Team (rice.collab@kuali.org)
046 */
047 public class MailerImpl implements Mailer {
048
049 protected final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MailerImpl.class);
050
051 private JavaMailSenderImpl mailSender;
052
053 /**
054 * @param mailSender The injected Mail Sender.
055 */
056 public void setMailSender(JavaMailSenderImpl mailSender) {
057 this.mailSender = mailSender;
058 }
059
060 /**
061 * Construct and a send simple email message from a Mail Message.
062 *
063 * @param message
064 * the Mail Message
065 * @throws MessagingException
066 */
067 @Override
068 @SuppressWarnings("unchecked")
069 public void sendEmail(MailMessage message) throws MessagingException {
070
071 // Construct a simple mail message from the Mail Message
072 SimpleMailMessage smm = new SimpleMailMessage();
073 smm.setTo( (String[])message.getToAddresses().toArray(new String[message.getToAddresses().size()]) );
074 smm.setBcc( (String[])message.getBccAddresses().toArray(new String[message.getBccAddresses().size()]) );
075 smm.setCc( (String[])message.getCcAddresses().toArray(new String[message.getCcAddresses().size()]) );
076 smm.setSubject(message.getSubject());
077 smm.setText(message.getMessage());
078 smm.setFrom(message.getFromAddress());
079
080 try {
081 if ( LOG.isDebugEnabled() ) {
082 LOG.debug( "sendEmail() - Sending message: " + smm.toString() );
083 }
084 mailSender.send(smm);
085 }
086 catch (Exception e) {
087 LOG.error("sendEmail() - Error sending email.", e);
088 throw new RuntimeException(e);
089 }
090 }
091
092 /**
093 * Send an email to a single recipient with the specified subject and message. This is a convenience
094 * method for simple message addressing.
095 *
096 * @param from
097 * sender of the message
098 * @param to
099 * list of addresses to which the message is sent
100 * @param subject
101 * subject of the message
102 * @param body
103 * body of the message
104 */
105 @Override
106 public void sendEmail(EmailFrom from, EmailTo to, EmailSubject subject, EmailBody body, boolean htmlMessage) {
107 if (to.getToAddress() == null) {
108 LOG.warn("No To address specified. Refraining from sending mail.");
109 return;
110 }
111 try {
112 Address[] singleRecipient = {new InternetAddress(to.getToAddress())};
113 sendMessage(from.getFromAddress(),
114 singleRecipient,
115 subject.getSubject(),
116 body.getBody(),
117 null,
118 null,
119 htmlMessage);
120 } catch (Exception e) {
121 LOG.error("sendEmail(): ", e);
122 throw new RuntimeException(e);
123 }
124 }
125
126 /**
127 * Send an email to the given "to", "cc", and "bcc" recipients with the specified subject and message.
128 *
129 * @param from
130 * sender of the message
131 * @param to
132 * list of addresses to which the message is sent
133 * @param subject
134 * subject of the message
135 * @param body
136 * body of the message
137 * @param cc
138 * list of addresses which are to be cc'd on the message
139 * @param bc
140 * list of addresses which are to be bcc'd on the message
141 */
142 @Override
143 public void sendEmail(EmailFrom from, EmailToList to, EmailSubject subject, EmailBody body, EmailCcList cc,
144 EmailBcList bc, boolean htmlMessage) {
145 if (to.getToAddresses().isEmpty()) {
146 LOG.error("List of To addresses must contain at least one entry. Refraining from sending mail.");
147 return;
148 }
149 try {
150 sendMessage(from.getFromAddress(),
151 to.getToAddressesAsAddressArray(),
152 subject.getSubject(),
153 body.getBody(),
154 (cc == null ? null : cc.getToAddressesAsAddressArray()),
155 (bc == null ? null : bc.getToAddressesAsAddressArray()),
156 htmlMessage);
157 } catch (Exception e) {
158 LOG.error("sendEmail(): ", e);
159 throw new RuntimeException(e);
160 }
161 }
162
163 /**
164 * Send an email to the given recipients with the specified subject and message.
165 *
166 * @param from
167 * sender of the message
168 * @param to
169 * list of addresses to which the message is sent
170 * @param subject
171 * subject of the message
172 * @param messageBody
173 * body of the message
174 * @param cc
175 * list of addresses which are to be cc'd on the message
176 * @param bcc
177 * list of addresses which are to be bcc'd on the message
178 */
179 protected void sendMessage(String from, Address[] to, String subject, String messageBody, Address[] cc, Address[] bcc, boolean htmlMessage) throws AddressException, MessagingException, MailException {
180 MimeMessage message = mailSender.createMimeMessage();
181
182 // From Address
183 message.setFrom(new InternetAddress(from));
184
185 // To Address(es)
186 if (to != null && to.length > 0) {
187 message.addRecipients(Message.RecipientType.TO, to);
188 } else {
189 LOG.error("No recipients indicated.");
190 }
191
192 // CC Address(es)
193 if (cc != null && cc.length > 0) {
194 message.addRecipients(Message.RecipientType.CC, cc);
195 }
196
197 // BCC Address(es)
198 if (bcc != null && bcc.length > 0) {
199 message.addRecipients(Message.RecipientType.BCC, bcc);
200 }
201
202 // Subject
203 message.setSubject(subject);
204 if (subject == null || "".equals(subject)) {
205 LOG.warn("Empty subject being sent.");
206 }
207
208 // Message body.
209 if (htmlMessage) {
210 prepareHtmlMessage(messageBody, message);
211 } else {
212 message.setText(messageBody);
213 if (messageBody == null || "".equals(messageBody)) {
214 LOG.warn("Empty message body being sent.");
215 }
216 }
217
218 // Send the message
219 try {
220 mailSender.send(message);
221 }
222 catch (Exception e) {
223 LOG.error("sendMessage(): ", e);
224 throw new RuntimeException(e);
225 }
226 }
227
228 protected void prepareHtmlMessage(String messageText, Message message) throws MessagingException {
229 try {
230 message.setDataHandler(new DataHandler(new ByteArrayDataSource(messageText, "text/html")));
231 } catch (IOException e) {
232 LOG.warn(e.getMessage());
233 throw new RuntimeException(e);
234 }
235 }
236 }