Skip to content

Commit

Permalink
added support for sending attachments along with emails in the Emaile…
Browse files Browse the repository at this point in the history
…r class
  • Loading branch information
albogdano committed Feb 20, 2024
1 parent e5c647d commit 34a0e5e
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 0 deletions.
13 changes: 13 additions & 0 deletions para-core/src/main/java/com/erudika/para/core/email/Emailer.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package com.erudika.para.core.email;

import java.io.InputStream;
import java.util.List;

/**
Expand All @@ -34,4 +35,16 @@ public interface Emailer {
*/
boolean sendEmail(List<String> emails, String subject, String body);

/**
* Sends an email.
* @param emails a list of email addresses (recipients)
* @param subject the subject of the message
* @param body the body of the message
* @param attachment attachment
* @param mimeType attachment MIME type
* @param fileName attachment file name
* @return true if the message was sent
*/
boolean sendEmail(List<String> emails, String subject, String body, InputStream attachment, String mimeType, String fileName);

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,33 @@

import com.erudika.para.core.email.Emailer;
import com.erudika.para.core.utils.Para;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.inject.Singleton;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.InternetHeaders;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.core.SdkBytes;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.ses.SesClient;
import software.amazon.awssdk.services.ses.model.Body;
import software.amazon.awssdk.services.ses.model.Content;
import software.amazon.awssdk.services.ses.model.Destination;
import software.amazon.awssdk.services.ses.model.Message;
import software.amazon.awssdk.services.ses.model.SendEmailRequest;
import software.amazon.awssdk.services.ses.model.SendRawEmailRequest;

/**
* An emailer that uses AWS Simple Email Service (SES).
Expand Down Expand Up @@ -80,4 +96,61 @@ public void run() {
}
return false;
}

@Override
public boolean sendEmail(List<String> emails, String subject, String body, InputStream attachment, String mimeType, String fileName) {
if (emails == null || emails.isEmpty() || StringUtils.isBlank(body)) {
return false;
}
if (attachment == null || StringUtils.isBlank(mimeType)) {
return sendEmail(emails, subject, body);
}

try {
Session session = Session.getDefaultInstance(new Properties());
MimeMessage message = new MimeMessage(session);
message.setSubject(subject, "UTF-8");
message.setFrom(new InternetAddress(Para.getConfig().supportEmail()));
Iterator<String> emailz = emails.iterator();
message.setRecipients(RecipientType.TO, InternetAddress.parse(emailz.next()));
StringBuilder sb = new StringBuilder();
while (emailz.hasNext()) {
sb.append(emailz.next()).append(emailz.hasNext() ? "," : "");
}
message.setRecipients(RecipientType.BCC, InternetAddress.parse(sb.toString()));

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(body, "text/html; charset=UTF-8");

byte[] fileByteArray = IOUtils.toByteArray(attachment);
InternetHeaders fileHeaders = new InternetHeaders();
fileHeaders.setHeader("Content-Type", mimeType + "; name=\"" + fileName + "\"");
fileHeaders.setHeader("Content-Transfer-Encoding", "base64");
fileHeaders.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

MimeBodyPart attach = new MimeBodyPart(fileHeaders, fileByteArray);
ByteArrayDataSource ds = new ByteArrayDataSource(fileByteArray, mimeType);
attach.setDataHandler(new DataHandler(ds));
attach.setFileName(fileName);

MimeMultipart msg = new MimeMultipart("mixed");
msg.addBodyPart(htmlPart);
msg.addBodyPart(attach);

try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
message.setContent(msg);
message.writeTo(outputStream);
SendRawEmailRequest rawEmailRequest = SendRawEmailRequest.builder().
rawMessage(r -> r.data(SdkBytes.fromByteArray(outputStream.toByteArray()))).build();
sesclient.sendRawEmail(rawEmailRequest);
}
return true;
// Display an error if something goes wrong.
} catch (Exception ex) {
LoggerFactory.getLogger(AWSEmailer.class).error(null, ex);
}
return false;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@

import com.erudika.para.core.email.Emailer;
import com.erudika.para.core.utils.Para;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
import javax.mail.internet.MimeMessage;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -66,6 +68,11 @@ public JavaMailEmailer() {

@Override
public boolean sendEmail(final List<String> emails, final String subject, final String body) {
return sendEmail(emails, subject, body, null, null, null);
}

@Override
public boolean sendEmail(List<String> emails, String subject, String body, InputStream attachment, String mimeType, String fileName) {
if (emails == null || emails.isEmpty()) {
return false;
}
Expand All @@ -82,6 +89,9 @@ public void prepare(MimeMessage mimeMessage) throws Exception {
msg.setSubject(subject);
msg.setFrom(Para.getConfig().supportEmail());
msg.setText(body, true); // body is assumed to be HTML
if (attachment != null) {
msg.addAttachment(fileName, new ByteArrayDataSource(attachment, mimeType));
}
}
};
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.erudika.para.server.email;

import com.erudika.para.core.email.Emailer;
import java.io.InputStream;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -36,4 +37,10 @@ public boolean sendEmail(List<String> emails, String subject, String body) {
return true;
}

@Override
public boolean sendEmail(List<String> emails, String subject, String body, InputStream attachment, String mimeType, String fileName) {
logger.info("EMAIL SENT: {}, {}, {}", emails, subject, body);
return true;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package com.erudika.para.email;

import com.erudika.para.core.email.Emailer;
import java.io.InputStream;
import java.util.List;
import org.apache.commons.lang3.StringUtils;

Expand All @@ -32,4 +33,10 @@ public boolean sendEmail(List<String> emails, String subject, String body) {
}
return false;
}

@Override
public boolean sendEmail(List<String> emails, String subject, String body, InputStream attachment, String mimeType, String fileName) {
return true;
}

}

0 comments on commit 34a0e5e

Please sign in to comment.