| D:\DEV\PROJECTS\Harbor_Mailer_Lib\src\kewlstuff\harbor\mailer\MailEngine.java |
package kewlstuff.harbor.mailer;
import kewlstuff.harbor.mailer.interfaces.*;
import java.io.*;
import java.lang.*;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import java.util.LinkedList;
public class MailEngine implements Runnable,I_MailEngine {
private final int maxFailedMails = 500;
private final int maxNoOfConcurrentMails = 3;
private Thread runner = null;
private Session session = null;
private LinkedList mailToGo = new LinkedList();
private LinkedList mailThatFailed = new LinkedList();
private int simMails = 0;
private boolean fSessionInited = false;
private String smtpHost = null;
private boolean fRunning = false;
private boolean fDebug = false;
public MailEngine() {
reset();
}
private void reset(){
simMails = 0;
fRunning = false;
fSessionInited = false;
String smtpHost = null;
mailToGo.clear();
clearFailedMail();
}
public int getMailQueueSize(){
synchronized(this){
return mailToGo.size();
}
}
public void clearFailedMail(){
synchronized(this){
mailThatFailed.clear();
}
}
public I_MailPackage getFirstFailedMail(){
I_MailPackage mp = null;
try{
synchronized(this){
if(mailThatFailed.size() > 0)
mp = (I_MailPackage)mailThatFailed.removeFirst();
}
}catch(Exception e){mp = null;}
return mp;
}
public I_MailPackage[] getAllMailThatFailed(){
I_MailPackage[] mps = null;
synchronized(this){
if(mailThatFailed.size() > 0)
mps = (I_MailPackage[])mailThatFailed.toArray();
}
return mps;
}
public boolean prepareSession(String smtpHost){
smtpHost = smtpHost.trim();
this.smtpHost = smtpHost;
fSessionInited = true;
try{
java.util.Properties properties = System.getProperties();
properties.put("mail.smtp.host", smtpHost);
session = Session.getInstance(properties,null);
} catch(Exception e) {
fSessionInited = false;
}
return fSessionInited;
}
public boolean queueMail(String to, String from, String subject, String sMessage, String sAttachment, String sFilename) {
MailPackage mp = new MailPackage();
if(from == null) return false;
if(to == null) return false;
if(subject == null) return false;
if(sMessage == null) return false;
if(from.length() == 0) return false;
if(to.length() == 0) return false;
if(subject.length() == 0) return false;
if(sMessage.length() == 0) return false;
mp.from = from.trim();
mp.to = to.trim();
mp.subject = subject.trim();
mp.sMessage = sMessage;
if(sAttachment != null) mp.sAttachment = sAttachment.trim();
if(sFilename != null) mp.sFilename = sFilename.trim();
synchronized(this){mailToGo.add(mp);}
return true;
}
public boolean isRunning(){
synchronized(this){return fRunning;}
}
public void startMailer(boolean fDebug){
if(isRunning()) return;
this.fDebug = fDebug;
runner = new Thread(this);
fRunning = true;
runner.setPriority(Thread.MIN_PRIORITY);
runner.start();
}
public void stopMailer(){
fRunning = false;
}
public boolean mailTo() {
MailPackage mp = null;
synchronized(this){
mp = (MailPackage)mailToGo.removeFirst();
}
return mailTo(mp);
}
private boolean mailTo(MailPackage mp) {
if(!fSessionInited) return false;
if(mp.to == null) return false;
try{
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(mp.from));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(mp.to));
msg.setSubject(mp.subject);
msg.setSentDate(new Date());
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(mp.sMessage);
MimeBodyPart mbp2 = new MimeBodyPart();
if ((mp.sFilename != null) && (mp.sAttachment != null))
if (mp.sFilename.length() > 0){
mbp2.setFileName(mp.sFilename);
mbp2.setText(mp.sAttachment, "us-ascii");
}
Multipart multiPart = new MimeMultipart();
multiPart.addBodyPart(mbp1);
if ((mp.sFilename != null) && (mp.sAttachment != null))
if (mp.sFilename.length() > 0) multiPart.addBodyPart(mbp2);
msg.setContent(multiPart);
Transport.send(msg);
} catch(Exception e) {
mp.errorMessage = e.getMessage();
if(fDebug) System.out.println("MailTo Error " + e.getMessage() + "\n");
if(fDebug) e.printStackTrace();
return false;
}
return true;
}
private synchronized void waitAWhile(){
try{
wait();
}catch(InterruptedException e){}
}
private synchronized void okLetsGo(){
notifyAll();
}
private synchronized void cntMails(boolean fInc){
if(fInc) simMails++;
else simMails--;
if(simMails < 0) simMails = 0;
}
public void run() {
Thread worker = null;
MailPackage mp = null;
while(isRunning()){
try{
if(mp == null)
Thread.sleep(1000 * 1);
}catch(InterruptedException e){fRunning = false;}
try{
synchronized(this){mp = (MailPackage)mailToGo.removeFirst();}
}catch(Exception e){mp = null;}
if(mp != null){
if(fDebug) System.out.println("Starting Worker " + mp.subject);
MailWorker mailWorker = new MailWorker(mp);
worker = new Thread(mailWorker);
worker.setPriority(Thread.MIN_PRIORITY);
worker.start();
cntMails(true);
if(simMails > maxNoOfConcurrentMails) waitAWhile();
}
}
if(fDebug) System.out.println("EXITING");
}
private class MailWorker implements Runnable {
private MailPackage mp = null;
private MailWorker(MailPackage mp) {
this.mp = mp;
}
public void run() {
if(fDebug) System.out.println("Sending Mail " + mp.subject);
boolean fWaitForMailSuccess = mailTo(mp);
if(fDebug) System.out.println("Mail Sent " + mp.subject);
if(!fWaitForMailSuccess){
if(fDebug) System.out.println("Entering Retry " + mp.subject);
int cntr = 0;
while(!fWaitForMailSuccess){
cntr += 1;
if(fDebug) System.out.println("RETRY " + mp.subject + " " + cntr);
fWaitForMailSuccess = mailTo(mp);
if(!fWaitForMailSuccess){
try{
Thread.sleep(1000 * 10);
}catch(InterruptedException e){fWaitForMailSuccess = true;}
}
if(cntr >= 3){
if(fDebug) System.out.println("FAILED TO SEND " + mp.subject);
fWaitForMailSuccess = true;
synchronized(this){
mailThatFailed.add(mp);
while(mailThatFailed.size() > maxFailedMails){
mailThatFailed.removeFirst();
}
}
}
}
}
cntMails(false);
okLetsGo();
}
}
}