网上类似的java客户端很多,因为javamail的API的确是挺好用的。我也参考了其中一个人的代码 省了不少事,这篇博客主要是自己留个纪念,因为这个项目更多的是自己一些特殊的需求,别人应该不需要用到。
package receiveMail;
import java.io.*;
import java.text.*;
import java.util.*;
import java.util.zip.ZipException;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.Message.RecipientType;
import javax.mail.internet.*;
import sun.misc.BASE64Encoder;
public class PraseMimeMessage {
private MimeMessage mimeMessage = null;
private String saveAttachPath = "";
private StringBuffer bodytext = new StringBuffer();
// StringBuffer
private String dateformat = "yy-MM-dd HH:mm";
private File storefile;
private String storedir = null;
private Process ps = null; //invokeBatStorePdb
//long chunk;
public Process getPs() {
return ps;
}
//private Multipart multipart = new MimeMultipart(); //forwardmail()
CompressZIP bean = CompressZIP.getInstance();
private int hasPdb, hasRar,hasZip;
public int getHasRar() {
return hasRar;
}
public void setHasRar(int hasRar) {
this.hasRar = hasRar;
}
public int getHasZip() {
return hasZip;
}
public void setHasZip(int hasZip) {
this.hasZip = hasZip;
}
public int getHasPdb() {
return hasPdb;
}
public void setHasPdb(int hasPdb) {
this.hasPdb = hasPdb;
}
/**
*
*/
public PraseMimeMessage() {
}
public PraseMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
// System.out.println("create a PraseMimeMessage object........");
}
public void setMimeMessage(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
}
/**
*
*/
public String getFrom() throws Exception {
InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
String from = address[0].getAddress();
if (from == null)
from = "";
String personal = address[0].getPersonal();
if (personal == null)
personal = "";
String fromaddr = personal + "<" + from + ">";
return fromaddr;
}
public String getMailAddress(String type) throws Exception {
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress[] address = null;
if (addtype.equals("TO") || addtype.equals("CC") || addtype.equals("BCC")) {
if (addtype.equals("TO")) {
address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.TO);
} else if (addtype.equals("CC")) {
address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.CC);
} else {
address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if (address != null) {
for (int i = 0; i < address.length; i++) {
String email = address[i].getAddress();
if (email == null)
email = "";
else {
email = MimeUtility.decodeText(email);
}
String personal = address[i].getPersonal();
if (personal == null)
personal = "";
else {
personal = MimeUtility.decodeText(personal);
}
String compositeto = personal + "<" + email + ">";
mailaddr += "," + compositeto;
}
mailaddr = mailaddr.substring(1);
}
} else {
throw new Exception("Error emailaddr type!");
}
return mailaddr;
}
/**
*
*/
public String getSubject() throws MessagingException {
String subject = "";
try {
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null)
subject = "";
} catch (Exception exce) {
}
return subject;
}
/**
*
*/
public String getSentDate() throws Exception {
Date sentdate = mimeMessage.getSentDate();
SimpleDateFormat format = new SimpleDateFormat(dateformat);
return format.format(sentdate);
}
public String getBodyText() {
//System.out.println(bodytext.toString());
return bodytext.toString();
}
public void getMailContent(Part part) throws Exception {
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf("name");
boolean conname = false;
if (nameindex != -1)
conname = true;
//System.out.println("CONTENTTYPE: " + contenttype);
if (part.isMimeType("text/plain") && !conname) {
bodytext.append((String) part.getContent());
} else if (part.isMimeType("text/html") && !conname) {
//bodytext.append((String) part.getContent());
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
getMailContent(multipart.getBodyPart(i));
}
} else if (part.isMimeType("message/rfc822")) {
getMailContent((Part) part.getContent());
} else {
}
}
/**
*
*/
public boolean getReplySign() throws MessagingException {
boolean replysign = false;
String needreply[] = mimeMessage.getHeader("Disposition-Notification-To");
if (needreply != null) {
replysign = true;
}
return replysign;
}
/**
*
*/
public String getMessageId() throws MessagingException {
return mimeMessage.getMessageID();
}
/**
*
*/
public boolean isNew() throws MessagingException {
boolean isnew = false;
Flags flags = ((Message) mimeMessage).getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
System.out.println("flags's length: " + flag.length);
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isnew = true;
System.out.println("seen Message.......");
break;
}
}
return isnew;
}
/**
*
*/
public boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
// String contentType = part.getContentType();
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
}
/**
*
*/
public void saveAttachMent(Part part,PraseMimeMessage pmessage , String senderFrom) throws Exception {
String fileName = "";
//String savaPath = ""; //附件保存路径 增加以附件大小为名的文件夹(后期可能用uuid)
//int chunk = 0;
String uuid = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
System.out.println("mpart.getFileName():" + fileName);
//chunk = mpart.getSize();//获取邮件附件大小? 不知道对不对 可能不准确 (Return the number of lines in the content of this part.)
//System.out.println("邮件附件大小: " + chunk);
uuid = UUID.randomUUID().toString();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
System.out.println("decodeText fileName:" + fileName);
}
if (fileName.toLowerCase().indexOf("utf") != -1) {
fileName = MimeUtility.decodeText(fileName);
System.out.println("decodeText fileName:" + fileName);
}
int j = fileName.toLowerCase().indexOf("utf");
System.out.println("indexOf utf" + j);
//saveFile(fileName, mpart.getInputStream()); //fileName为附件名 如1.rar
long start = System.currentTimeMillis();
//saveFile(chunk,fileName, mpart.getInputStream());
saveFile(uuid,fileName, mpart.getInputStream(), senderFrom);
long end = System.currentTimeMillis();
System.out.println("Save Last Time" + (end - start));
unCompress(fileName,storefile, storedir);
//
if(fileName.endsWith(".rar")|| fileName.endsWith(".zip")){
storefile.delete();
}
//createAttach(fileName, pmessage); //...
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart,pmessage,senderFrom);
} else {
fileName = mpart.getFileName();
if ((fileName != null) && (fileName.toLowerCase().indexOf("GB2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
//saveFile(chunk,fileName, mpart.getInputStream());//
saveFile(uuid,fileName, mpart.getInputStream(),senderFrom);
unCompress(fileName, storefile, storedir);
System.out.println("ELSE multipart/*");
//createAttach(fileName,pmessage); //...
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent(),pmessage,senderFrom);
}
}
//
public void invokeBatStorePdb(String senderFrom) {
System.out.println("invokeBatStorePdb");
Runtime rt = Runtime.getRuntime();
//System.out.println("DL:" +storedir + storefile.toString());
//String command = "cmd.exe /C start /b C:\\symstore.bat c:\\tmp\\symbols"; // c:\\tmp\\symbols storedir
String command = "cmd.exe /C start /b C:\\symstore-del.bat c:\\tmp\\symbols" + "\\" + senderFrom;
if(senderFrom.isEmpty() || senderFrom.equals("")){
command = "cmd.exe /C start /b C:\\symstore-del.bat c:\\tmp\\symbols";
System.out.println("senderFrom为空");
}
//Process ps = null;
try {
ps = rt.exec(command);
// final BufferedReader normalReader = new BufferedReader(new
// InputStreamReader(ps.getInputStream()));
// final BufferedReader errorReader = new BufferedReader(new
// InputStreamReader(ps.getErrorStream()));
final InputStream normalStream = ps.getInputStream();
final InputStream errorStream = ps.getErrorStream();
new Thread() {
public void run() {
BufferedReader br1 = new BufferedReader(new InputStreamReader(normalStream));
try {
String line1 = null;
while ((line1 = br1.readLine()) != null) {
if (line1 != null) {
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
normalStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
BufferedReader br2 = new BufferedReader(new InputStreamReader(errorStream));
try {
String line2 = null;
while ((line2 = br2.readLine()) != null) {
if (line2 != null) {
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
errorStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
try {
if(ps.waitFor() !=0){
System.err.println("exit value = " + ps.exitValue());
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ps.destroy();
//System.out.println("");
} catch (Exception e) {
try {
ps.getErrorStream().close();
ps.getInputStream().close();
ps.getOutputStream().close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
//
public void clearDir(File file) {
if (file.isDirectory()) {
for (File f : file.listFiles()) {
clearDir(f);
//if(!(f.getPath().endsWith(".pdb")))
f.delete();
}
}
if(!file.getPath().endsWith(".pdb"))
//file.delete();
file.getAbsoluteFile().delete();
//System.out.println("file delete" + file.getAbsoluteFile().delete());
//log.debug();
}
/**
*
*/
public void setAttachPath(String attachpath) {
this.saveAttachPath = attachpath;
}
/**
*
*/
public void setDateFormat(String format) throws Exception {
this.dateformat = format;
}
/**
*
*/
public String getAttachPath() {
return saveAttachPath;
}
/**
*
*/
private void saveFile( String uuid,String fileName, InputStream in, String senderFrom) throws Exception { //chunk为附件大小int chunk,
String osName = System.getProperty("os.name");
// String storedir = getAttachPath();
storedir = getAttachPath();
String separator = "";
if (osName == null)
osName = "";
if (osName.toLowerCase().indexOf("win") != -1) {
separator = "\\";
if (storedir == null || storedir.equals(""))
storedir = "c:\\tmp";
} else {
separator = "/";
storedir = "/tmp";
}
int index1;
String rarName = null;
String sendPerson = senderFrom;
if ((index1 = fileName.lastIndexOf(".")) != -1) {// 获取压缩包xxx.rar的文件名xxx
rarName = fileName.substring(0, index1);
}
//storedir = storedir + separator + rarName + separator + String.valueOf(chunk); //c:\\tmp\\symbols\\1\1170232
storedir = storedir + separator + sendPerson + separator +rarName + separator + uuid; //c:\\tmp\\symbols\\zhangsan\\1\\1170232
//storedir = storedir + separator + rarName + separator + uuid;
// File storefile = new File(storedir + separator + fileName);
storefile = new File(storedir + separator + fileName); //c:\\tmp\\symbols\\1\1170232\\1.rar
if (!storefile.exists()) {
if (!storefile.getParentFile().exists()) {//
storefile.getParentFile().mkdirs();
}
System.out.println("storefile out: " + storefile);
storefile.createNewFile();
}
System.out.println("storefile's path: " + storefile.toString());
// for(int i=0;storefile.exists();i++){
// storefile = new File(storedir+separator+fileName+i);
// }
BufferedOutputStream bos = null;
BufferedInputStream bis = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(storefile));
bis = new BufferedInputStream(in);
int c;
while ((c = bis.read()) != -1) {
bos.write(c);
bos.flush();
}
} catch (Exception exception) {
exception.printStackTrace();
throw new Exception("exception");
} finally {
bos.close();
bis.close();
}
}
/*
* private void createAttach(String fileName,PraseMimeMessage pmessage)
* throws MessagingException { // BodyPart bp1 = new MimeBodyPart(); //
* bp1.setText(pmessage.getBodyText()); // System.out.println("DL" +
* pmessage.getBodyText());
*
* //hasPdb = 0; //Multipart multipart = new MimeMultipart(); String suffix
* = ".pdb"; if(fileName.endsWith(suffix)){ System.out.println("DL" +
* "PDB Attach"); ++hasPdb; return; } String suffixR = ".rar"; String
* suffixZ = ".zip"; if(fileName.endsWith(suffixR) ||
* fileName.endsWith(suffixZ)){ System.out.println("DL" + "Rar||Zip Attach"
* ); return; } BodyPart bp2 = new MimeBodyPart(); DataSource dataSource =
* new FileDataSource(storefile); //System.out.println("DL" +storefile);
* DataHandler dataHandler = new DataHandler(dataSource);
* bp2.setDataHandler(dataHandler); bp2.setFileName(fileName);
*
* //multipart = new MimeMultipart(); //multipart.addBodyPart(bp1);
* multipart.addBodyPart(bp2); }
*/
private void unCompress(String fileName, File storefile, String storedir) {
String suffixR = ".rar";
String suffixZ = ".zip";
int countRar = 0;
int countZip = 0;
if (fileName.endsWith(suffixR)) {
System.out.println("rar:" + fileName);
setHasRar(++countRar);
// bean.unRarFile(fileName,storefile.toString(), storedir); //解压rar
try {
bean.unRarOrZipFile(storefile.toString(), storedir);// 既可以解压rar
// 也可以解压zip
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 解压rar
setHasRar(--countRar);
} else if ((fileName.endsWith(suffixZ))) {
System.out.println("zip:" + fileName);
try {
// bean.unzip(storefile.toString(), storedir); //解压zip
bean.unRarOrZipFile(storefile.toString(), storedir);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
++countZip;
setHasZip(countZip);
} else {
System.out.println("non-compress:" + fileName);
return;
}
}
private void addBodyPart(String RARPath, String FileName, Multipart multipart) {
BASE64Encoder enc = new BASE64Encoder();
BodyPart bp2 = new MimeBodyPart();
DataSource dataSource = new FileDataSource(RARPath);
DataHandler dataHandler = new DataHandler(dataSource);
// dataHandler.getName()
try {
bp2.setDataHandler(dataHandler);
String s = enc.encode((dataSource.getName()).getBytes());
// System.out.println("encode:" + s);
bp2.setFileName("=?UTF-8?B?" + s + "?=");
// bp2.setFileName(FileName);
// bp2.setFileName(dataSource.getName());
multipart.addBodyPart(bp2);
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// public void createRarAttach(File srcDir, String drczip) {
public void createRarAttach(File file, Multipart multipart) { // file
// c:\\tmp\\symbols
// reStoredir = C:\tmp\symbols\pdb2\4609110
// String FileName = file.getName();
String FileName = "";
String RARPath = "";
String f3Path = "";
try {
for (File f : file.listFiles()) {// c:\\tmp\\symbols目录下所有文件夹和文件(第一级目录
// 不递归)
// C:\tmp\symbols\ zhangsan\ pdb2\4609110\xxxx
/*
* 假设附件名为pdb2.rar
*
* file c:\\tmp\\symbols
* f C:\tmp\symbols\\zhangsan
* f1 C:\tmp\symbols\\zhangsan\pdb2
* f2 C:\tmp\symbols\\zhangsan\pdb2\4609110\
* f3 C:\tmp\symbols\\zhangsan\pdb2\4609110\pdb2
* */
System.out.println("file.listFiles() :" + f.getName());
f3Path = "";
// 因为在之前invokepdb时 上传的同时把pdb删除了
// 但是这个file还是能探测到pdb,这里不做处理,算是跳过bug吧
if (f.getName().endsWith(".pdb"))
continue;
if (f.isDirectory()) {// C:\tmp\symbols\\zhangsan \pdb2 \4609110\pdb2\\...
for (File f1 : f.listFiles()) {// C:\tmp\symbols\\zhangsan \pdb2// 自注:因为邮件只能发压缩包和文件 如果为目录,说明是解压过后的文件夹
for (File f2 : f1.listFiles()) {// f.listFiles() // C:\tmp\symbols\pdb2\4609110
if (f2.isDirectory()) { // C:\tmp\symbols\pdb2\4609110\
String[] files = f2.list();
if (files.length == 0) { // 排除情况3
System.out.println("目录 " + f2.getPath() + " 为空!" + "情况3");
break;
}
for (File f3 : f2.listFiles()) // 情况1C:\tmp\symbols\pdb2\4609110\pdb2
// 情况2或C:\tmp\symbols\pdb2\4609110\1.txt
// 情况3或C:\tmp\symbols\pdb2\4609110\空(原来是pdb被上传了)
{
if (f3.isDirectory()) {
RARPath = f3.getAbsolutePath() + ".rar";
f3Path = f3.getAbsolutePath();
System.out.println("情况1RARPath:" + RARPath);
for(File f4 : f3.listFiles())
System.out.println(f4);
bean.RarFile(RARPath, f3Path); //压缩
FileName = f1.getName() + ".rar";
addBodyPart(RARPath, FileName, multipart);
} else if (f3.isFile()) {// 排除情况2
String Name = f3.getName();
System.out.println("情况2:" + Name);
if (Name.endsWith(".pdb"))
continue;
addBodyPart(f3.getAbsolutePath(), Name, multipart);
}
}
}
}
//
// bean.RarFile(RARPath, f3Path);
// FileName = f.getName() + ".rar";
// //System.out.println("createRarAttachName:" + FileName);
// addBodyPart(RARPath, FileName, multipart);
}
} else if (f.getName().endsWith(".tar") == false && f.getName().endsWith(".zip") == false) {
FileName = f.getName();
System.out.println("createRarAttachName:" + FileName);
addBodyPart(f.getAbsolutePath(), FileName, multipart);
} else {
System.out.println("ElsehName:" + FileName);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// BodyPart bp2 = new MimeBodyPart();
// DataSource dataSource = new FileDataSource(RARPath);
// // System.out.println("DL" +storefile);
// DataHandler dataHandler = new DataHandler(dataSource);
// bp2.setDataHandler(dataHandler);
// bp2.setFileName(RARPath);
// multipart.addBodyPart(bp2);
}
public void forwardmail(PraseMimeMessage pmessage, Message message, Multipart multipart) throws Exception {
// Transport transport = MyDataGenerator.session.getTransport("25");
//
// transport.connect(MyDataGenerator.mailConfig.getProperty("smtp.hikvision.com.cn"),
// MyDataGenerator.mailConfig.getProperty("authUser"),
// MyDataGenerator.mailConfig.getProperty("authPassword"));
System.out.println("forwardmail");
Properties prop2 = new Properties();
//prop2.put("mail.smtp.host", "smtp.hikvision.com.cn");
prop2.setProperty("mail.store.protocol", "smtp");
prop2.setProperty("mail.smtp.host", "smtp.hikvision.com.cn");
prop2.setProperty("mail.smtp.port", "25");
prop2.put("mail.smtp.auth", "true");
Session session2 = Session.getInstance(prop2, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("你的邮箱的用户名 别直接拷", "你的邮箱的密码 别直接拷
"); }});//Session session2 = Session.getDefaultInstance(prop2, null);BodyPart bp1 = new MimeBodyPart();pmessage.getMailContent(message);bp1.setText(pmessage.getBodyText());try{multipart.addBodyPart(bp1);}catch(IllegalWriteException e){e.printStackTrace();}catch(MessagingException e){e.printStackTrace();}catch(Exception e){e.printStackTrace();}//System.out.println("DL" + pmessage.getBodyText());Message forward = new MimeMessage(session2);forward.setSubject(pmessage.getSubject());forward.setFrom(new InternetAddress(pmessage.getFrom()));forward.addRecipient(Message.RecipientType.TO, new InternetAddress(pmessage.getMailAddress("to")));//System.out.println("DL"+ pmessage.getSubject() + pmessage.getFrom()+ pmessage.getMailAddress("to"));forward.setContent(multipart); // ...forward.saveChanges();try {Transport.send(forward);multipart = null;} catch(SendFailedException e){e.printStackTrace();}catch (MessagingException e) {e.printStackTrace();}}public void replyMail(PraseMimeMessage pmm, Message message) throws Exception { System.out.println("replyMail");Properties prop3 = new Properties();//prop2.put("mail.smtp.host", "smtp.hikvision.com.cn");prop3.setProperty("mail.store.protocol", "smtp"); prop3.setProperty("mail.smtp.host", "smtp.hikvision.com.cn"); prop3.setProperty("mail.smtp.port", "25");prop3.put("mail.smtp.auth", "true"); Session session3 = Session.getInstance(prop3, new Authenticator(){ protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("
你的邮箱的用户名 别直接拷
", "
你的邮箱的密码 别直接拷
"); }});// MimeMessage reply;// try {// reply = (MimeMessage)message.reply(true);// try {// reply.setFrom(new InternetAddress(pmm.getFrom()));// reply.setText("Thanks, Your Email has bean processed.");// Transport.send(reply);// } catch (Exception e) {// // TODO Auto-generated catch block// e.printStackTrace();// }// } catch (MessagingException e) {// // TODO Auto-generated catch block// e.printStackTrace();// } String sendFrom = MyDataGenerator.mailConfig.getProperty("authUser") + "@hikvision.com.cn"; MimeMessage msg = (MimeMessage) message.reply(false); msg.setFrom(new InternetAddress(sendFrom)); msg.setRecipients(RecipientType.TO, pmm.getFrom()); Multipart mp = new MimeMultipart(); MimeBodyPart mbp = new MimeBodyPart(); mbp.setContent("
"+ "您好,您的邮件已经收到,谢谢!", "text/html;charset=gb2312"); mp.addBodyPart(mbp); msg.setContent(mp); msg.setSentDate(new Date()); msg.saveChanges(); Transport trans = session3.getTransport("smtp"); //trans.connect("smtp.hikvision.com.cn", "dingliang", "Dl123456"); trans.connect(MyDataGenerator.mailConfig.getProperty("server"),MyDataGenerator.mailConfig.getProperty("authUser"),MyDataGenerator.mailConfig.getProperty("authPassword")); trans.sendMessage(msg, msg.getAllRecipients()); trans.close(); } /** * PraseMimeMessage */// public static void main(String args[]) throws Exception {// public void Mymain() throws Exception {// String host = "10.1.11.124";// String username = "*******";// String password = "*******";// Properties props = new Properties();// Session session = Session.getDefaultInstance(props, null);// Store store = session.getStore("pop3");// store.connect(host, username, password);// Folder folder = store.getFolder("INBOX");// folder.open(Folder.READ_ONLY);// Message message[] = folder.getMessages();// System.out.println("Messages's length: " + message.length);// PraseMimeMessage pmm = null;// for (int i = 0; i < message.length; i++) {// pmm = new PraseMimeMessage((MimeMessage) message[i]);// System.out.println("Message " + i + " subject: " + pmm.getSubject());// //System.out.println("Message " + i + " sentdate: " + pmm.getSentDate());// //System.out.println("Message " + i + " replysign: " +// pmm.getReplySign());// //System.out.println("Message " + i + " hasRead: " + pmm.isNew());// System.out.println("Message " + i + " containAttachment: " +// pmm.isContainAttach((Part) message[i]));// System.out.println("Message " + i + " form: " + pmm.getFrom());// System.out.println("Message " + i + " to: " + pmm.getMailAddress("to"));// //System.out.println("Message " + i + " cc: " +// pmm.getMailAddress("cc"));// //System.out.println("Message " + i + " bcc: " +// pmm.getMailAddress("bcc"));// //pmm.setDateFormat("yy��MM��dd�� HH:mm");// //System.out.println("Message " + i + " sentdate: " + pmm.getSentDate());// //System.out.println("Message " + i + " Message-ID: " +// pmm.getMessageId());// //pmm.getMailContent((Part) message[i]);// //System.out.println("Message " + i + " bodycontent: \r\n" +// pmm.getBodyText());//// File file = new File("c:\\tmp\\symbols");// if (!file.exists()) {// file.mkdirs();// }// pmm.setAttachPath(file.toString());// pmm.saveAttachMent((Part) message[i]);// pmm.invokeBatStorePdb((Part) message[i]);// }// }}
package receiveMail;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class MyDataGenerator extends SchedThread {
static Store store;
static Folder folder;
static Session session;
static String host, username, password;
static Properties mailConfig;
private static ThreadPool threadPool; //= new DefaultThreadPool(11);
private static ArrayBlockingQueue MailQueue; //= new ArrayBlockingQueue(100, false);
public MyDataGenerator(){
threadPool = new DefaultThreadPool(11);
MailQueue = new ArrayBlockingQueue(100, false);
}
protected void executeWork() throws Exception {
System.out.println("Execute work ...");
System.out.println("currentThread Name: "+ Thread.currentThread().getName());
// String host = "10.1.11.124";
// String username = "dingliang";
// String password = "Dl123456";
// Properties props = new Properties();
// Session session = Session.getDefaultInstance(props, null);
// Store store = session.getStore("pop3");
store = session.getStore("pop3");
// store.connect(host, username, password);
// System.out.println(mailConfig.getProperty("server")
// +mailConfig.getProperty("authUser") +
// mailConfig.getProperty("authPassword"));
store.connect(mailConfig.getProperty("server"), mailConfig.getProperty("authUser"),
mailConfig.getProperty("authPassword"));
// Connection conn = pool.getConnection();
Folder folder = store.getFolder("INBOX");
// folder.open(Folder.READ_ONLY);
folder.open(Folder.READ_WRITE);
Message message[] = folder.getMessages();
System.out.println("Messages's length: " + message.length);
PraseMimeMessage pmm = null;
for (int i = 0; i < message.length; i++) {
pmm = new PraseMimeMessage((MimeMessage) message[i]);
System.out.println("Message " + i+" subject: " + pmm.getSubject());
System.out.println("Message " + i+ " containAttachment: " + pmm.isContainAttach((Part) message[i]));
System.out.println("Message " + i+ " form: " + pmm.getFrom());
System.out.println("Message " + i + " to: " + pmm.getMailAddress("to"));
MailQueue.offer(message[i]);
System.out.println("message" + i + "offer");
// for(Message m : MailQueue)
// System.out.println(m);
//processMail();
message[i].setFlag(Flags.Flag.DELETED, true);
}
try {
// for(Message m : MailQueue)
// System.out.println(m);
folder.close(true);
store.close();
System.out.println("folder.close");
} catch (MessagingException e) {
System.out.println("delete problem");
}
//store.close();
}
protected void executeWork2() throws Exception {
System.out.println("processMailing ......" );
processMail();
}
protected long getNextTime() {
return System.currentTimeMillis() + 10000L;
}
protected long getNextProcessTime() {
return System.currentTimeMillis() + 5000L;
}
private static Properties getProp() throws IOException {
//
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream inputStream = classLoader.getResourceAsStream("mailConfig.properties");
Properties prop = new Properties();
prop.load(inputStream);
return prop;
}
private static void processMail(){
//while(true){
try {
Message message = MailQueue.poll(2, TimeUnit.SECONDS);
System.out.println("poll message: "+message);
if(message == null)
return;
PraseMimeMessage pmm = new PraseMimeMessage((MimeMessage) message);
threadPool.execute(new MailHandler(message, pmm));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//}
public static void main(String argv[]) {
try {
mailConfig = getProp();// mailConfig.properties
} catch (IOException e) {
e.printStackTrace();
}
Properties props = new Properties();
session = Session.getDefaultInstance(props, null);
// pool = ConnectionPool.getInstance();
MyDataGenerator generator = new MyDataGenerator();
generator.start();
// while(true){
// processMail();
// }
}
}
package receiveMail;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
/**
* 基于Java线程实现后台定时监控
*/
public abstract class SchedThread {
protected static final long NEVER = Long.MAX_VALUE;
// 定义一个线程锁,保证当前只有一个工作在操作中
private final Object lock = new Object();
// 定义一个Thread变量
private Thread thread, thread2; //jia
// 控制线程循环的开关
private boolean active = true;
// 定义一个毫秒级的时间变量,指示何时执行下一个操作
private long nextTime;
/**
* 定义个一个抽象的方法用来获取下一个执行操作的时间,可使用NEVER
*/
protected abstract long getNextTime();
protected abstract long getNextProcessTime();
/**
* 定义一个抽象的方法,让子类来定义具体的工作过程
* @throws NoSuchProviderException
*/
//protected abstract void executeWork();
protected abstract void executeWork() throws Exception;
protected abstract void executeWork2() throws Exception;
protected String getName() {
return getClass().getName();
}
/**
* 启动线程
*/
public void start() {
thread = new Thread(new Runnable() {//用来取邮件 并offer到阻塞队列中
public void run() {
runInternal();
}
}, getName());
System.out.println("offer Thread start: "+ thread.getName());
thread.start();
thread2 = new Thread(new Runnable() { //用来processMail jia
public void run() {
runInternal2();
}
}, getName());
System.out.println("process Thread start: "+ thread2.getName());
thread2.start();
}
/**
* 强迫停止线程,跳出for循环
*/
public void stop() throws InterruptedException {
synchronized (lock) {
active = false;
lock.notify();
}
thread.join();
}
/**
* 此方法可以在任何时候激活当前线程,让线程进入工作执行环节
*/
public void workAdded(long time) {
synchronized (lock) {
if (time < nextTime) {
// 立刻激活线程工作继续运行
lock.notify();
}
}
}
private void runInternal2() { //1
for(;;){
// 执行具体的工作
try {
synchronized (lock) {
nextTime = getNextProcessTime(); //2
// 获得时间区间,即要等待的时间段
long interval = nextTime - System.currentTimeMillis();
if (interval > 0) {
try {
lock.wait(interval);
} catch (InterruptedException e) {
// 忽略此Exception
}
}
// 如果active为false,强制中断
if (!active) {
break;
}
}
executeWork2(); //3
} catch (Exception e) {
e.printStackTrace();
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
/**
* 线程监测控制逻辑部分
*/
private void runInternal() { //1
// 无限循环
for (;;) {
// 该过程忽略了所有的Exception,以保证线程不会因此而中断
try {
synchronized (lock) {
nextTime = getNextTime(); //2
// 获得时间区间,即要等待的时间段
long interval = nextTime - System.currentTimeMillis();
if (interval > 0) {
try {
lock.wait(interval);
} catch (InterruptedException e) {
// 忽略此Exception
}
}
// 如果active为false,强制中断
if (!active) {
break;
}
}
// 执行具体的工作
executeWork();//3
} catch (Throwable t) {
try {
System.out.println("Throwable t");
t.printStackTrace();
Thread.sleep(10000);
try {
if(MyDataGenerator.folder !=null){
MyDataGenerator.folder.close(true);
}
MyDataGenerator.store.close();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (InterruptedException ie) {
// 忽略此Exception
System.out.println("InterruptedException ie");
}
}
}
}
}
package receiveMail;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.zip.ZipException;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import com.github.junrar.Archive;
import com.github.junrar.rarfile.FileHeader;
import com.sun.org.apache.xerces.internal.util.SynchronizedSymbolTable;
public class CompressZIP {
private static CompressZIP instance = new CompressZIP();
private static int count = 0;
public static int getCount() {
return count;
}
public static void setCount(int count) {
CompressZIP.count = count;
}
private CompressZIP() {
}
public static CompressZIP getInstance() {
return instance;
}
public synchronized void zip(String inputFilename, String zipFilename)
throws IOException {
zip(new File(inputFilename), zipFilename);
}
public synchronized void zip(File inputFile, String zipFilename) throws IOException {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
zipFilename));
try {
zip(inputFile, out, "");
} catch (IOException e) {
throw e;
} finally {
out.close();
}
}
//ѹ��zip
private synchronized void zip(File inputFile, ZipOutputStream out, String base)
throws IOException {
if (inputFile.isDirectory()) {
File[] inputFiles = inputFile.listFiles();
out.putNextEntry(new ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < inputFiles.length; i++) {
zip(inputFiles[i], out, base + inputFiles[i].getName());
}
} else {
if (base.length() > 0) {
out.putNextEntry(new ZipEntry(base));
} else {
out.putNextEntry(new ZipEntry(inputFile.getName()));
}
FileInputStream in = new FileInputStream(inputFile);
try {
int c;
byte[] by = new byte[BUFFEREDSIZE];
while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
} catch (IOException e) {
throw e;
} finally {
in.close();
}
}
}
//��ѹzip
public synchronized void unzip(String zipFilename, String outputDirectory) throws ZipException, IOException
{ //throws IOException
if (!zipFilename.toLowerCase().endsWith(".zip")) {
System.out.println("rar");
return;
}
File outFile = new File(outputDirectory);
if (!outFile.exists()) {
outFile.mkdirs();
}
ZipFile zipFile = null;
try{
zipFile = new ZipFile(zipFilename,"UTF-8"); //��Q���āy�a
}catch(IOException e){
e.printStackTrace();
}
// ZipFile zipFile = new ZipFile(zipFilename,"gbk");
Enumeration en = zipFile.getEntries();
ZipEntry zipEntry = null;
while (en.hasMoreElements()) {
zipEntry = (ZipEntry) en.nextElement();
if (zipEntry.isDirectory()) {
// mkdir directory
String dirName = zipEntry.getName();
dirName = dirName.substring(0, dirName.length() - 1);
File f = new File(outFile.getPath() + File.separator + dirName);
f.mkdirs();
} else {
// unzip file
File f = new File(outFile.getPath() + File.separator
+ zipEntry.getName());
try{
if(f.getParent()!=null && !new File(f.getParent()).exists()){ //createNewFile
new File(f.getParent()).mkdirs();
}
f.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
InputStream in = zipFile.getInputStream(zipEntry);
FileOutputStream out = new FileOutputStream(f);
try {
int c;
byte[] by = new byte[BUFFEREDSIZE];
while ((c = in.read(by)) != -1) {
out.write(by, 0, c);
}
// out.flush();
} catch (IOException e) {
throw e;
} finally {
out.close();
in.close();
System.out.println("unzip stream close");
}
}
}
zipFile.close(); //!!不然.zip文件一直是占用状态 删不掉
System.out.println("zipFile.close();");
}
//rar
public synchronized void RarFile( String RARRealpath, String fileName) throws IOException {
//String command = "cmd.exe /C start /b C:\\symstore-del.bat c:\\tmp\\symbols";
//String RARCMD = "C:\\Program Files\\WinRAR\\Rar.exe a -r -ep1";
String RARCMD = "C:\\Progra~1\\WinRAR\\Rar.exe a -r -x*.pdb -ep1";
// RARFile("d:\\download.rar","d:\\�ַ���2");
if (fileName == null) {
return;
}
fileName = fileName.trim();
if (fileName.equals("")) {
return;
}
//String command = "cmd.exe /C"+ " start /b C:\\rar.bat" + RARRealpath + fileName;
//String command1 = "Rar.exe a -r -ep1 c:\\bbb.rar c:\\bb";
String command = RARCMD + " " + RARRealpath + " " + fileName; //��Ҫ���û������� rar.exeҲ�в�ͨ Ҫ��rar.exe�ŵ�c://windows·����
System.out.println("rar command: "+command);
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
p = rt.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8")); // gbk
String line;
while ((line = br.readLine()) != null) {
// System.out.println(line);
}
br = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); // gbk
while ((line = br.readLine()) != null) {
// System.err.println(line);
}
//
try {
if(p.waitFor() !=0){
System.err.println("exit value = " + p.exitValue());
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.destroy();
} catch (IOException e) {
// TODO Auto-generated catch block
p.getErrorStream().close();
p.getInputStream().close();
p.getOutputStream().close();
e.printStackTrace();
}
}
//用winrar.exe解压 可以解压rar或者zip 要把winrar.exe放到c:\Windows下(注:unrar只能解压.rar)
public synchronized void unRarOrZipFile( String RARRealpath, String fileName) throws IOException{ //fileName 即是storedir
//unrar x C:\\pdb.rar C:\\temp\\symbol
String subFileName = fileName;
//String RARCMD = "winrar.exe x -o+"; //unrar.exe x
String RARCMD = "C:\\Progra~1\\WinRAR\\winrar.exe x -o+";
if (fileName == null) {
return;
}
fileName = fileName.trim();
if (fileName.equals("")) {
return;
}
if(RARRealpath.endsWith(".rar") || RARRealpath.endsWith(".zip") ){
String rarName = new File(RARRealpath).getName();
int index = rarName.lastIndexOf(".");
subFileName = rarName.substring(0, index);
}
String cmdfileName;
if(count++ == 0){ //每封邮件只执行一次 加一层文件夹 防止一个压缩包下都是文件 而不是一个文件夹
cmdfileName = fileName + File.separator + subFileName;
System.out.println("count1: " + count);
}
else{
cmdfileName = fileName;
System.out.println("count2: " + count);
}
System.out.println("unFile cmdfileName: " + cmdfileName);
File dstDiretory = new File(cmdfileName);
//String command = RARCMD + " " + RARRealpath + " " + fileName;
String command = RARCMD + " " + RARRealpath + " " + cmdfileName;
if (!dstDiretory.exists()) {
dstDiretory.mkdirs();
}
Runtime rt = Runtime.getRuntime();
Process p = null;
try {
p = rt.exec(command);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8")); // gbk
String line;
while ((line = br.readLine()) != null) {
// System.out.println(line);
}
br = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); // gbk
while ((line = br.readLine()) != null) {
// System.err.println(line);
}
//
try {
if(p.waitFor() !=0)
System.err.println("exit value = " + p.exitValue());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.destroy();
}
//解压rar
public synchronized void unRarFile2(String fileName, String srcRarPath, String dstDirectoryPath) {
// 外部调用 如bbb.rar c:\\tmp\\symbols\\bbb.rar c:\\tmp\\symbols或c:\\tmp
if (!srcRarPath.toLowerCase().endsWith(".rar")) {
System.out.println("rar");
return;
}
int index1;
String rarName = null;
if ((index1 = fileName.lastIndexOf(".")) != -1) {// 获取压缩包xxx.rar的文件名xxx
rarName = fileName.substring(0, index1);
}
//File dstDiretory = new File(dstDirectoryPath);
File dstDiretory = new File(dstDirectoryPath + File.separator + rarName); // c:\\tmp\\symbols\\bbb
if (!dstDiretory.exists()) {
dstDiretory.mkdirs();
}
Archive a = null;
try {
a = new Archive(new File(srcRarPath));
if (a != null) {
a.getMainHeader().print(); //
FileHeader fh = a.nextFileHeader();
while (fh != null) {
String entrypath = "";
if (fh.isUnicode()) { // jiejue zhongwenluanma !@_@!
entrypath = fh.getFileNameW().trim();
System.out.println("entrypath1: " + entrypath);
} else {
entrypath = fh.getFileNameString().trim();
System.out.println("entrypath2: " + entrypath);
}
int index;
if ((index = entrypath.indexOf("\\")) != -1) {
String entrypathName = entrypath.substring(0, index);
if (rarName.equals(entrypathName)) {
//System.out.println("rarName + entrypathName: " + rarName + " " + entrypathName);
entrypath = entrypath.substring(index+1);
//System.out.println("entrypath: " + entrypath);
}
}
if (fh.isDirectory()) {
//File fol = new File(dstDirectoryPath + File.separator + entrypath);
File fol = new File(dstDiretory.toString() + File.separator+ entrypath);
fol.mkdirs();
} else {
//File out = new File(dstDirectoryPath + File.separator + entrypath);
File out = new File(dstDiretory.toString() + File.separator+ entrypath);
try {//
if (!out.exists()) {
if (!out.getParentFile().exists()) {//
out.getParentFile().mkdirs();
}
//System.out.println("out: " + out);
out.createNewFile();
}
FileOutputStream os = new FileOutputStream(out);
a.extractFile(fh, os);
os.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
fh = a.nextFileHeader();
}
a.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static final int BUFFEREDSIZE = 1024;
public static void main(String[] args) {
CompressZIP bean = new CompressZIP();
// try {
// //bean.zip("c:/mysymbol-(3)", "c:/b.zip");
//
// try {
// bean.unzip("c:\\tmp\\symbols\\b.zip", "c:\\tmp\\symbols");
// } catch (ZipException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
try {
//bean.unRarFile("C:\\pdb2.rar", "C:\\temp");
bean.unRarOrZipFile("C:\\pdb2.rar", "C:\\temp");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// new File("c:\\bbb.rar").delete();
// try {
// bean.RarFile( "c:\\bbb.rar", "c:\\bbb");
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } //·
//
// //bean.RarFile("c:\\bbb.rar", "c:\\mysymbol-(4)"); //
// } catch (IOException e) {
// e.printStackTrace();
// }
// bean.unRarFile("temp.txt","c:\\bbb.rar", "c:\\a");
}
}
package receiveMail;
import java.io.File;
import javax.mail.Flags;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class MailHandler implements Runnable {
Message message;
PraseMimeMessage pmm;
//int messageID;
public MailHandler(Message message,PraseMimeMessage pmm ){
this.message = message;
this.pmm = pmm;
}
@Override
public void run() {
Thread current = Thread.currentThread();
System.out.println("Thread Name: " + current.getName());
// try {
// System.out.println("isContainAttach: " + pmm.isContainAttach((Part) message));
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
long start = System.currentTimeMillis();
CompressZIP.setCount(0);// 在解压时unRarOrZipFile时, 只在count==0时执行一次
// 创建与.rar同名的文件夹 然后count++
Multipart multipart = new MimeMultipart(); // 每一封邮件一份 用来存放附件
// createRarAttach()
// forwardmail()
// pmm.clearDir(new File("c:\\tmp\\symbols"));
pmm = new PraseMimeMessage((MimeMessage) message);
try {
boolean IsHasAttach = pmm.isContainAttach((Part) message);
if (IsHasAttach) { //如果有附件
File file = new File("c:\\tmp\\symbols");
if (!file.exists()) {
file.mkdirs();
}
pmm.setHasPdb(0);
String senderFrom = pmm.getFrom();
int beginIndex, endIndex;
if ((beginIndex = senderFrom.indexOf("<")) != -1 && (endIndex = senderFrom.indexOf("@")) != -1) {
senderFrom = senderFrom.substring(beginIndex + 1, endIndex);
System.out.println(" senderFrom: " + senderFrom);
}
pmm.setAttachPath(file.toString());
pmm.saveAttachMent((Part) message, pmm, senderFrom); // 包括保存附件到本地 // 和 解压
pmm.invokeBatStorePdb(senderFrom);
pmm.createRarAttach(file, multipart);
if (pmm.getMailAddress("to") != null && !pmm.getMailAddress("to").isEmpty()) {
pmm.forwardmail(pmm, message, multipart);
}
//message.setFlag(Flags.Flag.DELETED, true); //
System.out.println("Flag.DELETED");
pmm.clearDir(new File("c:\\tmp\\symbols"));
pmm.replyMail(pmm, message); // 回复邮件
} //如果有附件
//pmm.replyMail(pmm, message); // 回复邮件
}catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("last time of one email is : " + (end - start));
}
}
package receiveMail;
/**
* 6-19
*/
public interface ThreadPool {
// ִ��һ��Job�����Job��Ҫʵ��Runnable
void execute(Job job);
// �ر��̳߳�
void shutdown();
// ���ӹ������߳�
void addWorkers(int num);
// ���ٹ������߳�
void removeWorker(int num);
// �õ����ڵȴ�ִ�е���������
int getJobSize();
}
package receiveMail;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
/**
* 6-20
*/
public class DefaultThreadPool implements ThreadPool {
// �̳߳����������
private static final int MAX_WORKER_NUMBERS = 10;
// �̳߳�Ĭ�ϵ�����
private static final int DEFAULT_WORKER_NUMBERS = 5;
// �̳߳���С������
private static final int MIN_WORKER_NUMBERS = 1;
// ����һ�������б�������������빤��
private final LinkedList jobs = new LinkedList();
// �������б�
private final List workers = Collections.synchronizedList(new ArrayList());
// �������̵߳�����
private int workerNum = DEFAULT_WORKER_NUMBERS;
// �̱߳������
private AtomicLong threadNum = new AtomicLong();
public DefaultThreadPool() {
initializeWokers(DEFAULT_WORKER_NUMBERS);
}
public DefaultThreadPool(int num) {
workerNum = num > MAX_WORKER_NUMBERS ? MAX_WORKER_NUMBERS : num < MIN_WORKER_NUMBERS ? MIN_WORKER_NUMBERS : num;
initializeWokers(workerNum);
}
public void execute(Job job) {
if (job != null) {
// ���һ��������Ȼ�����֪ͨ
synchronized (jobs) {
jobs.addLast(job);
jobs.notify();
}
}
}
public void shutdown() {
for (Worker worker : workers) {
worker.shutdown();
}
}
public void addWorkers(int num) {
synchronized (jobs) {
// ����������Worker�������ܳ������ֵ
if (num + this.workerNum > MAX_WORKER_NUMBERS) {
num = MAX_WORKER_NUMBERS - this.workerNum;
}
initializeWokers(num);
this.workerNum += num;
}
}
public void removeWorker(int num) {
synchronized (jobs) {
if (num >= this.workerNum) {
throw new IllegalArgumentException("beyond workNum");
}
// ���ո���������ֹͣWorker
int count = 0;
while (count < num) {
workers.get(count).shutdown();
count++;
}
this.workerNum -= count;
}
}
public int getJobSize() {
return jobs.size();
}
// ��ʼ���̹߳�����
private void initializeWokers(int num) {
for (int i = 0; i < num; i++) {
Worker worker = new Worker();
workers.add(worker);
Thread thread = new Thread(worker, "ThreadPool-Worker-" + threadNum.incrementAndGet());
thread.start();
}
}
// �����ߣ�������������
class Worker implements Runnable {
// �Ƿ���
private volatile boolean running = true;
public void run() {
while (running) {
Job job = null;
synchronized (jobs) {
// ����������б��ǿյģ���ô��wait
while (jobs.isEmpty()) {
try {
jobs.wait();
} catch (InterruptedException ex) {
// ��֪���ⲿ��WorkerThread���жϲ���������
Thread.currentThread().interrupt();
return;
}
}
// ȡ��һ��Job
job = jobs.removeFirst();
}
if (job != null) {
try {
job.run();
} catch (Exception ex) {
// ����Jobִ���е�Exception
}
}
}
}
public void shutdown() {
running = false;
}
}
}
//mailConfig.properties
server = *****
authUser = *****
authPassword = *****