/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package project.latex.balloon.writer.camera;
import java.io.File;
import java.util.List;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import project.latex.balloon.writer.DataWriteFailedException;
/**
*
* @author dgorst
*/
public class EmailCameraDataWriter implements CameraDataWriter {
private static final Logger logger = Logger.getLogger(EmailCameraDataWriter.class);
static final String EMAIL_BODY_TEXT = "Image attached below";
private JavaMailSender mailSender;
private String fromAddress;
private String toAddress;
private int maxNumberOfEmailAttempts;
private int delayBetweenEmailAttemptsMs;
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void setFromAddress(String fromAddress) {
this.fromAddress = fromAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public void setMaxNumberOfEmailAttempts(int maxNumberOfEmailAttempts) {
this.maxNumberOfEmailAttempts = maxNumberOfEmailAttempts;
}
public void setDelayBetweenEmailAttemptsMs(int delayBetweenEmailAttemptsMs) {
this.delayBetweenEmailAttemptsMs = delayBetweenEmailAttemptsMs;
}
void sendMail(File imageFile) {
int attemptCount = 0;
boolean success = false;
while (!success && attemptCount < maxNumberOfEmailAttempts) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
messageHelper.setTo(toAddress);
messageHelper.setFrom(fromAddress);
messageHelper.setSubject(imageFile.getName());
messageHelper.setText(EMAIL_BODY_TEXT);
FileSystemResource fileResource = new FileSystemResource(imageFile);
messageHelper.addAttachment(imageFile.getName(), fileResource);
mailSender.send(message);
success = true;
} catch (MailException | MessagingException e) {
logger.error("Email attempt " + attemptCount + " failed: " + e.getMessage());
try {
Thread.sleep(delayBetweenEmailAttemptsMs);
} catch (InterruptedException ex) {
logger.error(ex.getMessage());
}
} finally {
++attemptCount;
}
}
if (!success) {
logger.error("Failed to send email containing " + imageFile.getName());
}
}
@Override
public void writeImageFiles(List<File> imageFiles) throws DataWriteFailedException {
for (final File file : imageFiles) {
// Sending the email with a large image attachment could take a long time,
// so we put it on a background thread
Runnable sendMailRunnable = new Runnable() {
@Override
public void run() {
sendMail(file);
}
};
Thread mailThread = new Thread(sendMailRunnable);
mailThread.start();
}
}
public static void main(String... args) {
ApplicationContext context
= new FileSystemXmlApplicationContext("email.xml");
EmailCameraDataWriter emailWriter = (EmailCameraDataWriter) context.getBean("emailCameraDataWriter");
emailWriter.sendMail(new File("testImage.png"));
}
}