自己写的java邮件客户端

来源:互联网 发布:零基础学java pdf 编辑:程序博客网 时间:2024/06/07 04:59

网上类似的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();// StringBufferprivate 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.rarlong 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   storedirString 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 blocke.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 blocke1.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的文件名xxxrarName = fileName.substring(0, index1);}//storedir = storedir + separator + rarName + separator + String.valueOf(chunk);  //c:\\tmp\\symbols\\1\1170232storedir = 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.rarif (!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); //解压rartry {bean.unRarOrZipFile(storefile.toString(), storedir);// 既可以解压rar// 也可以解压zip} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 解压rarsetHasRar(--countRar);} else if ((fileName.endsWith(suffixZ))) {System.out.println("zip:" + fileName);try {// bean.unzip(storefile.toString(), storedir); //解压zipbean.unRarOrZipFile(storefile.toString(), storedir);} catch (ZipException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.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\4609110if (f2.isDirectory()) { // C:\tmp\symbols\pdb2\4609110\String[] files = f2.list();if (files.length == 0) { // 排除情况3System.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()) {// 排除情况2String 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 blocke.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("你的邮箱的用户名 别直接拷", "<pre name="code" class="java">你的邮箱的密码 别直接拷
"); }});//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("<meta http-equiv=Content-Type content=text/html; charset=GBK>"+ "您好,您的邮件已经收到,谢谢!", "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<MailHandler> threadPool; //= new DefaultThreadPool<MailHandler>(11);private static ArrayBlockingQueue<Message> MailQueue; //= new ArrayBlockingQueue<Message>(100, false);public MyDataGenerator(){threadPool = new DefaultThreadPool<MailHandler>(11);MailQueue = new ArrayBlockingQueue<Message>(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 blocke.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  jiapublic 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() {  //1for(;;){// 执行具体的工作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 blocke1.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 blocke.printStackTrace();}} catch (InterruptedException ie) {// 忽略此ExceptionSystem.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();");    }       //rarpublic 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")); // gbkString line;while ((line = br.readLine()) != null) {// System.out.println(line);}br = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); // gbkwhile ((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 blocke.printStackTrace();}p.destroy();} catch (IOException e) {// TODO Auto-generated catch blockp.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\\symbolString subFileName = fileName;//String RARCMD = "winrar.exe x -o+";   //unrar.exe xString 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 blocke.printStackTrace();}BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "UTF-8")); // gbkString line;while ((line = br.readLine()) != null) {// System.out.println(line);}br = new BufferedReader(new InputStreamReader(p.getErrorStream(), "UTF-8")); // gbkwhile ((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 blocke.printStackTrace();}p.destroy();}//解压rarpublic synchronized void unRarFile2(String fileName, String srcRarPath, String dstDirectoryPath) {// 外部调用 如bbb.rar c:\\tmp\\symbols\\bbb.rar c:\\tmp\\symbols或c:\\tmpif (!srcRarPath.toLowerCase().endsWith(".rar")) {System.out.println("rar");return;}int index1;String rarName = null;if ((index1 = fileName.lastIndexOf(".")) != -1) {// 获取压缩包xxx.rar的文件名xxxrarName = fileName.substring(0, index1);} //File dstDiretory = new File(dstDirectoryPath);File dstDiretory = new File(dstDirectoryPath + File.separator + rarName); // c:\\tmp\\symbols\\bbbif (!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 blocke.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;}@Overridepublic 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 blocke1.printStackTrace();}long end = System.currentTimeMillis();System.out.println("last time of one email is : " + (end - start));}}

package receiveMail;/** * 6-19 */public interface ThreadPool<Job extends Runnable> {    // ִ��һ��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<Job extends Runnable> implements ThreadPool<Job> {    // �̳߳����������    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<Job> jobs                   = new LinkedList<Job>();    // �������б�    private final List<Worker>    workers                = Collections.synchronizedList(new ArrayList<Worker>());    // �������̵߳�����    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.propertiesserver = *****authUser = *****authPassword = *****



1 0
原创粉丝点击