`
zhuqinglin
  • 浏览: 26403 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
log4j.properties
log4j.rootLogger=INFO, console, logFile
log4j.appender.console=org.apache.log4j.ConsoleAppender 
log4j.appender.console.Threshold=INFO
log4j.appender.console.layout=org.apache.log4j.PatternLayout 
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH\:mm\:ss,SSS} %p [%t] -%m%n 

log4j.appender.logFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logFile.File=logs/userbill.log
log4j.appender.logFile.DatePattern='.'yyyy-MM
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d{yy/MM/dd HH\:mm\:ss,SSS} %p [%t] -%m%n
meta-info
Manifest-Version: 1.0
Main-Class: com.mail.SendMail
Class-Path: lib/activation-1.1.jar lib/slf4j-log4j12-1.7.5.jar lib/slf4j-api-1.6.6.jar
  lib/aopalliance-1.0.jar lib/autojob-app-0.0.1-SNAPSHOT.jar
  lib/c3p0-0.9.1.1.jar lib/commons-codec-1.5.jar lib/commons-collections-3.2.1.jar
  lib/commons-io-2.4.jar lib/commons-lang-2.4.jar lib/commons-logging-1.1.1.jar
  lib/dom4j-1.6.1.jar lib/druid-0.2.26.jar lib/jsch-0.1.50.jar lib/log4j-1.2.17.jar
  lib/mail-1.4.7.jar lib/ojdbc14-14.jar lib/poi-3.9.jar lib/poi-ooxml-3.9.jar
  lib/poi-ooxml-schemas-3.9.jar lib/quartz-2.2.1.jar lib/spring-aop-3.2.4.RELEASE.jar
  lib/spring-beans-3.2.4.RELEASE.jar
  lib/spring-context-3.2.4.RELEASE.jar lib/spring-context-support-3.2.4.RELEASE.jar
  lib/spring-core-3.2.4.RELEASE.jar lib/spring-expression-3.2.4.RELEASE.jar
  lib/spring-tx-3.2.4.RELEASE.jar lib/stax-api-1.0.1.jar
  lib/velocity-1.7.jar lib/wlfullclient.jar lib/xml-apis-1.0.b2.jar
  lib/xmlbeans-2.3.0.jar
config-test.properties
ServerHost=smtp.wo.com.cn
ServerPort=25
FromAddress=henan10010@wo.com.cn
FromAddrPwd=henan1001010010
FilePath=E://sendmail//USERBILL_FILE
ThreadNum=10
com.util-Utils
/**
 *Project:autojob-app
 *Author:admin
 *Date:2013-10-15 
 */
package com.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.io.LineNumberReader;
import java.io.FileReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import javax.mail.MessagingException;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.springframework.ui.velocity.VelocityEngineUtils;

public class Utils {
	/**
	 * 格式化字符串处理.
	 * 如果字符串不为null,则返回去除前后空格的字符串
	 * @param str
	 * @return
	 */
	public static Logger log = Logger.getLogger(Object.class);
	public static String formatString(String str) {
		return str == null ? null : str.trim();
	}
	/**
	 * 判断给定字符串是否为空.
	 * 字符串为null,返回true,如果不为null,内容为空,返回true,只有当内容不为空时返回false
	 * @param str
	 * @return
	 */
	public static boolean isEmptyString(String str) {
		return Utils.formatString(str) == null ? true : (Utils
				.formatString(str).equals("") ? true : false);
	}
	/**
	 * 获取当前日式的yyyymmdd格式时间字符串
	 * @return
	 */
	public static String getDateYYYYMMDD() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		return sdf.format(new Date());
	}
	/**
	 * 获取系统默认流输入和输出编码
	 * @return
	 */
	public static String getSysDefaultStreamEncode(){
		return System.getProperty("sun.jnu.encoding");
	}
	
	public String getMailContent(String str,VelocityEngine velocityEngine) throws VelocityException,
	IOException, MessagingException{


		String spList[] = str.split("\\|");
		ArrayList<UserNoteItem> arryList = new ArrayList<UserNoteItem>();
		for (int i=1;i<spList.length;i++){
			String sbill[] = spList[i].split("@");
			if(sbill.length==3){
				UserNoteItem noteBill = new UserNoteItem();
				noteBill.setLevel(sbill[0]);
				noteBill.setItemName(sbill[1]);
				noteBill.setItemFee(sbill[2]);
				arryList.add(noteBill);
			}
		}
		Map<String, Object> emailModel = new HashMap<String, Object>();
		int indx = spList[0].indexOf(",");
		int indy = spList[0].length();
		
		emailModel.put("serial_number", stringFilter(spList[0].substring(0,indx)));
		emailModel.put("cust_name", changeCharSet(spList[0].substring(indx+1,indy)));
		emailModel.put("cycle_id", getStringDateB());
		emailModel.put("items",arryList );
		
		String emailBody = VelocityEngineUtils.mergeTemplateIntoString(
				velocityEngine, "com/template/mail_template.vm",
				"UTF-8", emailModel);
		
		return emailBody;
	}
	
	//过滤到除数字外的字符
	public   static   String stringFilter(String   str)   throws   PatternSyntaxException   { 
		String   regEx  =  "[^0-9]";  
		Pattern   p   =   Pattern.compile(regEx);  
		Matcher   m   =   p.matcher(str);
		return   m.replaceAll("").trim();
	}
	//获得当前时间HHmmss
	public static int getStringTime() {
	   Calendar cal = Calendar.getInstance();
	   Date currentTime = new Date();
       cal.setTime(currentTime);
	   SimpleDateFormat formatter = new SimpleDateFormat("HHmmss");
	   String dateString = formatter.format(cal.getTime());
	   int timeInt = Integer.parseInt(dateString);
	   return timeInt;
	}
	//上个月格式日期
	public static String getStringDateB() {
	   Calendar cal = Calendar.getInstance();
	   Date currentTime = new Date();
       cal.setTime(currentTime);
       cal.add(Calendar.MONTH, -1);
	   SimpleDateFormat formatter = new SimpleDateFormat("yyyy年MM月份");
	   String dateString = formatter.format(cal.getTime());
	   return dateString;
	}
	//格式化当前日期
	public static String getStringDateA() {
		   Calendar cal = Calendar.getInstance();
		   Date currentTime = new Date();
	       cal.setTime(currentTime);
		   SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		   String dateString = formatter.format(cal.getTime());
		   return dateString;
		}
	//获取某个路径下的文件名称
	public static List<String> ListFile(String filePath){
		List<String> list = new ArrayList<String>();
		File directory = new File(filePath);
		File[] files = directory.listFiles();
		if(files!=null){
			for (int i = 0; i < files.length; i++) {
				String name = files[i].getName();
				if(name.length()>8){
					list.add(files[i].getName());
				}
		    }
		}
		return list;
	}
	
	public static Properties getPropertyJob(){
		Properties properties = new Properties();    
		InputStream is = null; 
		is = Object.class.getResourceAsStream("/config/test.properties");   

		try {    
			properties.load(is);    
			} catch (IOException e) {    
				e.printStackTrace();    
			}    
		return properties;
	}
	
	public static String changeCharSet(String s) throws UnsupportedEncodingException{
			return  new String(s.getBytes("ISO-8859-1"), "UTF-8");
	}
	//读取指定路径的文件行数
	public static int getTotalLines(String filePath) throws IOException {
		FileReader in = new FileReader(filePath);
		LineNumberReader reader = new LineNumberReader(in);
		String strLine = reader.readLine();
		int totalLines = 0;
		while (strLine != null) {
			totalLines++;
			strLine = reader.readLine();
		}
		reader.close();
		in.close();
		return totalLines;
	}
	//把旧文件移到到新目录下
	public static boolean removeFile (File sourceFile,File newFile) {
        try {  
            // 读取文件创建一个管道  
            java.nio.channels.FileChannel srcChannel = new java.io.FileInputStream(sourceFile).getChannel();  
            // 在管道上创建一个输出的目标地址  
            java.nio.channels.FileChannel dstChannel = new java.io.FileOutputStream(newFile).getChannel();  
            // 进行文件复制  
            dstChannel.transferFrom(srcChannel, 0, srcChannel.size());  
            // 运行复制结束,并且关闭 输入/输出管道流  
            srcChannel.close();  
            dstChannel.close();  
            sourceFile.delete();
        }
        catch (IOException e) {  
        	log.error("文件复制失败:", e);  
            e.printStackTrace(); 
            return false;
        }  
        
		return true;
	}
	
	public static void SetLogFileName(String filename){
		DailyRollingFileAppender appender = (DailyRollingFileAppender)Logger.getRootLogger().getAppender("logFile");
		 appender.setFile( "logs/"+filename+".log");//动态地修改这个文件名 
		 appender.activateOptions();
	}
}
com.util-UserNoteItem
package com.util;

public class UserNoteItem {

	private String level;
	
	private String itemName;
	
	private String itemFee;

	public String getLevel() {
		return level;
	}

	public void setLevel(String level) {
		this.level = level;
	}

	public String getItemName() {
		return itemName;
	}

	public void setItemName(String itemName) {
		this.itemName = itemName;
	}

	public String getItemFee() {
		return itemFee;
	}

	public void setItemFee(String itemFee) {
		this.itemFee = itemFee;
	}
	
	
}
com.mail-Contants
/**
 *Project:autojob-app
 *Author:admin
 *系统常用变量设定
 *Date:2013-10-21 
 */
package com.util;

public class Contants {
	/**
	 * 读取数据文件目录
	 */
	public static final String DATASOURCE_LABEL="dataSourcePath";
	/**
	 * 发送附件时,附件读取文件路径
	 */
	public static final String ATTACHMENT_LABEL="attachmentPath";
	/**
	 * Excel模板文件路径
	 */
	public static final String EXCELTEMPLATE_LABEL="excelTemplatePath";
	/**
	 * 数据生成文件路径
	 */
	public static final String EXPORT_LABEL="dataPath";
	/**
	 * 数据文件路径
	 */
	public static final String DATA_LABEL="dataPath";
	
}
com.util-ConsoleProgressBar
package com.util;

import java.text.DecimalFormat;

/**
 * 控制台字符型进度条。
 * 
 * @author 傲风 <aofengblog@163.com>
 */
public class ConsoleProgressBar {

    private long minimum = 0; // 进度条起始值
    
    private long maximum = 100; // 进度条最大值
    
    private long barLen = 100; // 进度条长度
    
    private char showChar = '='; // 用于进度条显示的字符
    
    private DecimalFormat formater = new DecimalFormat("#.##%");
    
    /**
     * 使用系统标准输出,显示字符进度条及其百分比。
     */
    public ConsoleProgressBar() {
    }
    
    /**
     * 使用系统标准输出,显示字符进度条及其百分比。
     * 
     * @param minimum 进度条起始值
     * @param maximum 进度条最大值
     * @param barLen 进度条长度
     */
    public ConsoleProgressBar(long minimum, long maximum, 
            long barLen) {
        this(minimum, maximum, barLen, '=');
    }
    
    /**
     * 使用系统标准输出,显示字符进度条及其百分比。
     * 
     * @param minimum 进度条起始值
     * @param maximum 进度条最大值
     * @param barLen 进度条长度
     * @param showChar 用于进度条显示的字符
     */
    public ConsoleProgressBar(long minimum, long maximum, 
            long barLen, char showChar) {
        this.minimum = minimum;
        this.maximum = maximum;
        this.barLen = barLen;
        this.showChar = showChar;
    }
    
    /**
     * 显示进度条。
     * 
     * @param value 当前进度。进度必须大于或等于起始点且小于等于结束点(start <= current <= end)。
     */
    public void show(long value) {
        if (value < minimum || value > maximum) {
            return;
        }
        
        reset();
        minimum = value;
        float rate = (float) (minimum*1.0 / maximum);
        long len = (long) (rate * barLen);
        draw(len, rate);
        if (minimum == maximum) {
            afterComplete();
        }
    }

    private void draw(long len, float rate) {
        for (int i = 0; i < len; i++) {
            System.out.print(showChar);
        }
        System.out.print(' ');
        System.out.print(format(rate));
    }
    
    private void reset() {
        System.out.print('\r');
    }
    
    private void afterComplete() {
        System.out.print('\n');
    }
    
    private String format(float num) {
        return formater.format(num);
    }
    
    public static void main(String[] args) throws InterruptedException {
        ConsoleProgressBar cpb = new ConsoleProgressBar(0, 100, 20, '=');
        for (int i = 1; i <= 100; i++) {
            cpb.show(i);
            Thread.sleep(100);
        }
    }

} 
com.template-mail_template.vm
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>邮件模板</title>
<style type="text/css">
body{
	font-family:"宋体", "Arial Unicode MS", Arial;
}
</style>
</head>
<body>
<form>
<div style='margin-left:4mm;' >
<table width="700" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr>
            <td>
	            <table width="100%" cellspacing="0" cellpadding="0" border="0">
				    <tbody>
				        <tr>
				            <td>
				                <img width="700" height="150" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//benner_new.png"></img>
				            </td>
				        </tr>
				    </tbody>
				</table>
                <table width="100%" cellspacing="0" cellpadding="0" border="0">
                    <tbody>
                        <tr>
                            <td width="470" valign="top" align="left">
                                <table width="100%" cellspacing="0" cellpadding="0" border="0" style="margin-top:8px;">
                                    <tbody>
                                        <tr>
                                            <td valign="center" height="40" align="left">
                                                <img src="http://op.mail.wo.com.cn/bill_images/newyear2/img//zhangdan_1.png" style="margin-left:75px;"></img>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td valign="top" height="180" align="center">
                                                <table width="380" cellspacing="0" cellpadding="0" border="0" style="border:solid #f7b16f 1.0pt">
												<tbody>
												
<tr style='height:18.75pt'>
	<td width='53%' style='border-bottom:solid #f7b16f 1.0pt; '>
		<p > 
			<span style='font-size:9.0pt;'>号     码:</span>
			<span style='font-weight:bold;font-size:9.0pt'>${serial_number}</span>
		</p>
	</td>
	<td width='53%' style='border-left:solid #f7b16f 1.0pt;border-bottom:solid #f7b16f 1.0pt; '>
	        <p>    
	        	<span  style='font-size:9.0pt;'>计费月份:</span>
	        	<span  style='font-weight:bold;font-size:9.0pt'>${cycle_id}</span>
	        </p>
	</td>
</tr>
<tr style='height:18.75pt;background: none repeat scroll 0% 0% rgb(250, 247, 247);'>
	<td width='53%' style='border:none;adding:0cm 0cm 0cm 0cm;'>
        <p > 
        	<span style='font-weight:bold;font-size:10.0pt;'>费用名称</span>
        </p>
    </td>
    <td width='53%' style='border:none;border-left:solid #f7b16f 1.0pt;'>
        <p align=right style='text-align:right'>
        		<span style='font-weight:bold;font-size:10.0pt;'>金额(元)</span>
        </p>
	</td>
</tr>
#foreach($item in $items)
	#if ($item.level==1)
<tr style='height:15.0pt'>
	<td style='border:none;border-top:solid #f7b16f 1.0pt;'>
        <p > 
        	<span  style='font-weight:bold;font-size:10.0pt'>$item.itemName</span>
        </p>
    </td>
    <td style='border:none;border-left:solid #f7b16f 1.0pt;border-top:solid #f7b16f 1.0pt;'>
        <p align=right style='text-align:right'>
        	<span style='font-weight:bold;font-size:10.0pt'>$item.itemFee  </span>
        </p>
	</td>
</tr>
	#elseif ($item.level==2)
<tr style='height:15.0pt'>
	<td style='border:none;'>
        <p > 
        	<span  style='font-size:10.0pt'>--$item.itemName</span>
        </p>
    </td>
    <td style='border:none;border-left:solid #f7b16f 1.0pt;'>
        <p align=right style='text-align:right'>
        	<span style='font-size:10.0pt'>$item.itemFee  </span>
        </p>
	</td>
</tr>
	#else
<tr style='height:18.75pt;background: none repeat scroll 0% 0% rgb(250, 247, 247);'>
	<td style='border:none;border-top:solid #f7b16f 1.0pt;'>
        <p > 
        	<span  style='font-weight:bold;font-size:10.0pt;'>$item.itemName</span>
        </p>
    </td>
    <td style='border:none;border-left:solid #f7b16f 1.0pt;border-top:solid #f7b16f 1.0pt;'>
        <p align=right style='text-align:right'>
        	<span style='font-weight:bold;font-size:10.0pt'>$item.itemFee  </span>
        </p>
	</td>
</tr>
	#end
#end
                                            </tbody>
                                        </table>
                                    </td>
                                </tr>
                                <tr>
                                    <td valign="center" height="30" align="left">
                                        <img src="http://op.mail.wo.com.cn/bill_images/newyear2/img//zhangdan_2.png" style="margin-left:75px;"></img>
                                    </td>
                                </tr>
                                <tr>
                                    <td align="center">
                                        <table width="390" cellspacing="0" cellpadding="0" border="0" style="margin-bottom:10px;">
                                            <tbody>
                                                <tr>
                                                    <td align="left">
                                                        <table width="390" cellspacing="0" cellpadding="0" border="0">
                                                            <tbody>
                                                                <tr>
                                                                    <td align="left">
                                                                        <div style="line-height:22px;margin-top:10px;margin-bottom:10px;font-size:13px;">
                                                                         1、本信息仅供参考,每月出账请以营业厅账单为准,如果您对“电子账单”有任何疑问,请拨打当地客服电话,感谢您对我们服务的支持。
                                                                            </br>
                                                                         2、电子账单只为您本人单独提供您自己的账单信息,绝对不会泄露您的任何信息,请放心。
                                                                            </br>
                                                                         3、分享至社交网络完全取决于您的意愿和您的操作。 
                                                                            </br>
                                                                         4、请不要直接回复本邮件,如想取消“电子话费账单”投递服务,
                                                                            <span><a href="http://114.247.0.96/unsubscribe/?m=${serial_number}" style="color:#ff0000;">
																			请点击此处
                                                                            </a></span>。
                                                                        </div>
                                                                    </td>
                                                                </tr>
                                                            </tbody>
                                                        </table>
                                                    </td>
                                                </tr>
                                            </tbody>
                                        </table>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </td>
                    <td valign="top" style="position:relative;">
                        <a target="_blank" href="http://op.mail.wo.com.cn/app/about/index.html" style="position:absolute;width:80px;height:20px;margin-left:65px;top:195px;"></a>
                        <table width="230" cellspacing="0" cellpadding="0" border="0">
                            <tbody>
                                <tr style="position:relative;">
                                    <td>
                                        <img border="0" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//android.png"></img>
                                    </td>
                                </tr>
                                <tr>
                                    <td></td>
                                </tr>
                                <tr>
                                    <td>
                                        <div style="margin-top:35px;width:189px;height:208px;">
                                            <div>
                                                <img width="188" height="70" border="0" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//g1.png"></img>
                                            </div>
                                            <div>
                                                <img width="188" height="66" border="0" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//g2.png"></img>
                                            </div>
                                            <div>
                                                <img width="188" height="70" border="0" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//g3.png"></img>
                                            </div>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </td>
                </tr>
            </tbody>
        </table>
    </td>
</tr>
<tr>
    <td>
        <table width="100%" cellspacing="0" cellpadding="0" border="0">
            <tbody>
                <tr>
                    <td align="center">
                        <img border="0" src="http://op.mail.wo.com.cn/bill_images/newyear2/img//downimg.png"></img>
                    </td>
                </tr>
            </tbody>
        </table>
    </td>
</tr>
</tbody>
</table>
</div>
</form>
</body>
</html>
com.mail-SimpleMailSender
package com.mail;

import java.util.Date;    
import java.util.Properties;   
import javax.mail.Address;    
import javax.mail.BodyPart;    
import javax.mail.Message;    
import javax.mail.MessagingException;    
import javax.mail.Multipart;    
import javax.mail.Session;    
import javax.mail.Transport;    
import javax.mail.internet.InternetAddress;    
import javax.mail.internet.MimeBodyPart;    
import javax.mail.internet.MimeMessage;    
import javax.mail.internet.MimeMultipart;
import org.apache.log4j.Logger;

/** 
* 简单邮件(不带附件的邮件)发送器 
*/ 
public class SimpleMailSender  { 
	Session sendMailSession;
	public static Logger log = Logger.getLogger(Object.class);
	SimpleMailSender(MailSenderInfo mailInfo){
	  // 判断是否需要身份认证 
	  MyAuthenticator authenticator = null;
	  Properties pro = mailInfo.getProperties();
	  //如果需要身份认证,则创建一个密码验证器  
	  if (mailInfo.isValidate()) { 
		authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
	  } 
	  // 根据邮件会话属性和密码验证器构造一个发送邮件的session 
	  sendMailSession = Session.getDefaultInstance(pro,authenticator); 
	}
/** 
  * 以文本格式发送邮件 
  * @param mailInfo 待发送的邮件的信息 
  */ 
	public boolean sendTextMail(MailSenderInfo mailInfo) { 

	  try { 
	  // 根据session创建一个邮件消息 
	  Message mailMessage = new MimeMessage(sendMailSession); 
	  // 创建邮件发送者地址 
	  Address from = new InternetAddress(mailInfo.getFromAddress()); 
	  // 设置邮件消息的发送者 
	  mailMessage.setFrom(from); 
	  // 创建邮件的接收者地址,并设置到邮件消息中 
	  Address to = new InternetAddress(mailInfo.getToAddress()); 
	  mailMessage.setRecipient(Message.RecipientType.TO,to); 
	  // 设置邮件消息的主题 
	  mailMessage.setSubject(mailInfo.getSubject()); 
	  // 设置邮件消息发送的时间 
	  mailMessage.setSentDate(new Date()); 
	  // 设置邮件消息的主要内容 
	  String mailContent = mailInfo.getContent(); 
	  mailMessage.setText(mailContent); 
	  // 发送邮件 
	  Transport.send(mailMessage);
	  return true; 
	  } catch (MessagingException ex) { 
		  log.error(ex.getMessage());
	  } 
	  return false; 
	} 
	
	/** 
	  * 以HTML格式发送邮件 
	  * @param mailInfo 待发送的邮件信息 
	  */ 
	
	public String sendHtmlMail(MailSenderInfo mailInfo) { 
	  String flag = "0";
	  try { 
		  // 根据session创建一个邮件消息 
		  Message mailMessage = new MimeMessage(sendMailSession); 
		  // 创建邮件发送者地址 
		  Address from = new InternetAddress(mailInfo.getFromAddress()); 
		  // 设置邮件消息的发送者 
		  mailMessage.setFrom(from); 
		  // 创建邮件的接收者地址,并设置到邮件消息中 
		  Address to = new InternetAddress(mailInfo.getToAddress()); 
		  // Message.RecipientType.TO属性表示接收者的类型为TO 
		  mailMessage.setRecipient(Message.RecipientType.TO,to); 
		  // 设置邮件消息的主题 
		  mailMessage.setSubject(mailInfo.getSubject()); 
		  // 设置邮件消息发送的时间 
		  mailMessage.setSentDate(new Date()); 
		  // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象 
		  Multipart mainPart = new MimeMultipart(); 
		  // 创建一个包含HTML内容的MimeBodyPart 
		  BodyPart html = new MimeBodyPart(); 
		  // 设置HTML内容 
		  html.setContent(mailInfo.getContent(), "text/html; charset=utf-8"); 
		  mainPart.addBodyPart(html); 
		  // 将MiniMultipart对象设置为邮件内容 
		  mailMessage.setContent(mainPart); 
		  // 发送邮件 
		  Transport.send(mailMessage); 
		  
	  } catch (MessagingException ex) { 
		  String str = ex.getMessage();
		  if(str.indexOf("Could not connect to SMTP host")>-1){
			  flag ="1";
		  }else{
			  flag = str;
		  }
		  
	  } 
	  return flag; 
	} 
} 
com.mail-SendMail
package com.mail;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.springframework.ui.velocity.VelocityEngineFactoryBean;


import javax.mail.MessagingException;
import org.apache.log4j.Logger;

import com.util.Utils;


public class SendMail implements Runnable{
	private static BufferedReader br = null;
	private static Properties  prop ;
	private static List<String> tList;
	
	private static String serverHost;
	private static String serverPort;
	private static String fromAddress;
	private static String fromAddrPwd;
	private static String filePath;
	private static int nFlag = 0;
	private static FileWriter fWriter;
	private static int treadNum;
	
	public static Logger log = Logger.getLogger(Object.class);
	private static FileWriter sWriter ;
	
	static VelocityEngine velocityEngine = null;
	SendMail(){	}
	
	static{
		prop = Utils.getPropertyJob();
		serverHost  = prop.getProperty("ServerHost");
		serverPort  = prop.getProperty("ServerPort");
		fromAddress = prop.getProperty("FromAddress");
		fromAddrPwd = prop.getProperty("FromAddrPwd");
		filePath    = prop.getProperty("FilePath");
		treadNum	= Integer.parseInt(prop.getProperty("ThreadNum").trim());
		tList   	= new ArrayList<String>();
		Properties props = System.getProperties();
		props.put("resource.loader", "class");
		props.put("class.resource.loader.class",	"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
		VelocityEngineFactoryBean v = new VelocityEngineFactoryBean();
		v.setResourceLoaderPath("com/template");
		v.setVelocityProperties(props);
		try {
			velocityEngine = v.createVelocityEngine();
		} catch (VelocityException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void run() {
		String line = null;
		int count = 0;
		List<String> list;
		while(true) {
			list = new ArrayList<String>();
			synchronized(br) {
				try {
					while((line = br.readLine()) != null) {
						if(count<49) {
							list.add(line);
							count++;
						}else {
							list.add(line);
							count = 0;
							break;
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			//发送邮件每次发送50个用户 
			try {
				toMail(list);
				Thread.sleep(600);
			} catch (InterruptedException e) {
				log.error(e.getLocalizedMessage());
			}

			if(line == null){
				log.info(""+Thread.currentThread().getName()+"处理完成!"); 
				tList.add(Thread.currentThread().getName());
				break;
			}
			list = null;
		}

	}
	
	public void toMail(List<String> list) {
		Utils job = new com.util.Utils();
		
		MailSenderInfo mailInfo = new MailSenderInfo(); 
		mailInfo.setMailServerHost(serverHost);
		mailInfo.setMailServerPort(serverPort); 
		mailInfo.setValidate(true); 
		mailInfo.setUserName(fromAddress); 
		mailInfo.setPassword(fromAddrPwd);//您的邮箱密码 
		mailInfo.setFromAddress(fromAddress); 
		
		SimpleMailSender sms = new SimpleMailSender(mailInfo);
		
		//log.info("创建邮件发送对象!");
		for(String str:list) {
			String maillAddr="";
			String sp1[] = str.split("\\|");
			try {
				maillAddr = sp1[0].substring(0,sp1[0].indexOf(","));
				maillAddr=Utils.stringFilter(maillAddr)+"@wo.com.cn";
				//收件人的邮箱
				mailInfo.setToAddress(maillAddr); 
				mailInfo.setSubject("提醒您收取"+Utils.getStringDateB()+"的用户账单"); 
				mailInfo.setContent(job.getMailContent(str,velocityEngine));
		         //这个类主要来发送邮件
				String flag =  sms.sendHtmlMail(mailInfo);
				if("0".equals(flag)){
					sWriter.write(str+System.getProperty("line.separator"));
					sWriter.flush();
				}else if("1".equals(flag)){
					//如果是连接失败失败重新发送一次
					Thread.sleep(400);
					flag =sms.sendHtmlMail(mailInfo);
					if("0".equals(flag)){
						sWriter.write(str+System.getProperty("line.separator"));
						sWriter.flush();
					}else{
						log.info(maillAddr+"发送邮件失败(2)!"+flag);
						fWriter.write(str+System.getProperty("line.separator"));
						fWriter.flush();
					}
				}else{
					log.info(maillAddr+"发送邮件失败!"+flag);
					fWriter.write(str+System.getProperty("line.separator"));
					fWriter.flush();
				}	
				synchronized(this){
					nFlag++;
					if(nFlag%10000==0&&nFlag!=0){
						log.info("已经处理"+nFlag+"条数据!");
					}
				}
			}catch (VelocityException e) {
				log.error(e.getMessage());
			}catch(MessagingException e){
				log.error(e.getMessage());
			}catch (IOException e) {
				log.error(e.getMessage());
			} catch (InterruptedException e) {
				log.error(e.getLocalizedMessage());
			}
		}
		sms=null;
	}


	public static void main(String args[]) {
		System.out.println("/**********************************************/");
		System.out.println("/**********用户月账单邮件发送应用程序**********/");
		System.out.println("/**********************************************/");
		System.out.println("1.请将用户账单文件放在"+filePath+"文件夹下");
		System.out.println("2.每个用户账单文件分"+treadNum+"个进程读取");

		//System.out.println("请选择文件序号");
		//读取配置文件信息
		List<String> fileList =Utils.ListFile(filePath);
		List<String> fileList1 = new ArrayList<String>();
		String strTime = Utils.getStringDateA();
		//比较文件的工具对象
		DiffentContent diffContent = new DiffentContent();
		if(fileList!=null&&fileList.size()>0){
			try{
				String name ="";
				for (int n =0;n<fileList.size();n++){
					name = fileList.get(n);
					if(name.substring(0,8).equals(strTime)){
						fileList1.add(name);
					}
				}
				if(fileList1.size()>0){
					String fileName ="";//原文件
					String succFileName = "";//成功文件
					String failFileName = "";//失败文件
					File file = null;

					file = new File(filePath+"/failed/");
					if(!file.exists()){
						file.mkdirs();
					}
					file = new File(filePath+"/success/");
					if(!file.exists()){
						file.mkdirs();
					}
					file = new File(filePath+"/old/");
					if(!file.exists()){
						file.mkdirs();
					}
					file = new File(filePath+"/diffent/");
					if(!file.exists()){
						file.mkdirs();
					}
					int num =0;
					for (int i=0;i<fileList1.size();i++){
						fileName = fileList1.get(i);
						succFileName = "s_"+fileName.substring(0,fileName.indexOf("."))+".txt";
						failFileName = "f_"+fileName.substring(0,fileName.indexOf("."))+".txt";
	
						Utils.SetLogFileName(fileName);
						log.info("设置文件名"+fileName);
						//判断执行时间范围
						int timeInt = Utils.getStringTime();
						if (timeInt>180000||timeInt<70000){
							log.info("文件"+fileName+"超出执行时间范围!");
							continue;
						}
						
						String readFilePath = filePath+"/"+fileName;
						//如果已经存在success成功的文件,则进行比对,发送文件从比对后的文件读取
						if(new File (filePath+"/success/"+succFileName).exists()){
							if(!new File (filePath+"/old/"+fileName).exists()){
							readFilePath = diffContent.getDiffentFIle(succFileName,fileName);
							}
						}

						file = new File(readFilePath);
						fWriter = new FileWriter(filePath+"/failed/"+failFileName);
						sWriter = new FileWriter(filePath+"/success/"+succFileName,true);

						int totalLine = Utils.getTotalLines(readFilePath);
						//String fileCharSet = diffContent.codeString(readFilePath);
						InputStream in = new FileInputStream(file);
						br = new BufferedReader(new InputStreamReader(in,"gbk"));
						//启动进程
						log.info("开始处理用户账单文件"+fileName);
						
						for(int j=0;j<treadNum-1;j++){
							num= j+(100*i);
							String threadName = "sMailT"+num;
							new Thread(new SendMail(),threadName).start();
						}
						//等待进程结束
						int preNum = 0;
						while(tList.size()<treadNum&&nFlag<totalLine){
							if(nFlag ==0){
								Thread.sleep(20000);
							}else{
								log.info("当前处理条数 = "+nFlag+"("+Thread.activeCount()+")");
								preNum = nFlag;
								Thread.sleep(20000);
								if(preNum==nFlag){
									log.info("当前处理条数 = "+nFlag+"("+Thread.activeCount()+")");
									Thread.sleep(60000);
									if(preNum==nFlag){
										log.info("当前处理条数 = "+nFlag+"("+Thread.activeCount()+")"+",总数"+totalLine+"未正常结束!");
										break;
									}
								}
							
							}
						}
						log.info("文件"+fileName+"全部数据"+nFlag+"处理完毕!");
						fWriter.close();
						sWriter.close();
						br.close();
						in.close();
						file=null;
						tList.clear();
						nFlag=0;
						//转移文件到old目录下
						Utils.removeFile(new File(filePath+"/"+fileName),new File(filePath+"/old/"+fileName));
					}
				}else{
					log.error("未找到当天发生的账单,请检查!");
				}
			}catch (NumberFormatException e){
				log.error("选择序号错误!");
			}catch (FileNotFoundException e) {
				log.error("未找到所选择的文件!");
			}catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}catch (Exception e){
				e.printStackTrace();
			}
		}else{
			System.out.println("目录"+filePath+"无数据文件个数不对,有("+fileList.size()+")个文件");
		}
	}
}
com.mail-MyAuthenticator
package com.mail;


import javax.mail.*;
  
public class MyAuthenticator extends Authenticator{
	String userName=null;
	String password=null;
	 
	public MyAuthenticator(){
	}
	public MyAuthenticator(String username, String password) { 
		this.userName = username; 
		this.password = password; 
	} 
	protected PasswordAuthentication getPasswordAuthentication(){
		return new PasswordAuthentication(userName, password);
	}
}
 
com.mail-MailSenderInfo
package com.mail;

import java.util.Properties;
public class MailSenderInfo { 
		// 发送邮件的服务器的IP和端口 
		private String mailServerHost; 
		private String mailServerPort = "25"; 
		// 邮件发送者的地址 
		private String fromAddress; 
		// 邮件接收者的地址 
		private String toAddress; 
		// 登陆邮件发送服务器的用户名和密码 
		private String userName; 
		private String password; 
		// 是否需要身份验证 
		private boolean validate = false; 
		// 邮件主题 
		private String subject; 
		// 邮件的文本内容 
		private String content; 
		// 邮件附件的文件名 
		private String[] attachFileNames; 	
		
		/** 
		  * 获得邮件会话属性 
		  */ 
		public Properties getProperties(){ 
		  Properties p = new Properties(); 
		  p.put("mail.smtp.host", this.mailServerHost); 
		  p.put("mail.smtp.port", this.mailServerPort); 
		  p.put("mail.smtp.auth", validate ? "true" : "false"); 
		  return p; 
		} 
		public String getMailServerHost() { 
		  return mailServerHost; 
		} 
		public void setMailServerHost(String mailServerHost) { 
		  this.mailServerHost = mailServerHost; 
		}
		public String getMailServerPort() { 
		  return mailServerPort; 
		}
		public void setMailServerPort(String mailServerPort) { 
		  this.mailServerPort = mailServerPort; 
		}
		public boolean isValidate() { 
		  return validate; 
		}
		public void setValidate(boolean validate) { 
		  this.validate = validate; 
		}
		public String[] getAttachFileNames() { 
		  return attachFileNames; 
		}
		public void setAttachFileNames(String[] fileNames) { 
		  this.attachFileNames = fileNames; 
		}
		public String getFromAddress() { 
		  return fromAddress; 
		} 
		public void setFromAddress(String fromAddress) { 
		  this.fromAddress = fromAddress; 
		}
		public String getPassword() { 
		  return password; 
		}
		public void setPassword(String password) { 
		  this.password = password; 
		}
		public String getToAddress() { 
		  return toAddress; 
		} 
		public void setToAddress(String toAddress) { 
		  this.toAddress = toAddress; 
		} 
		public String getUserName() { 
		  return userName; 
		}
		public void setUserName(String userName) { 
		  this.userName = userName; 
		}
		public String getSubject() { 
		  return subject; 
		}
		public void setSubject(String subject) { 
		  this.subject = subject; 
		}
		public String getContent() { 
		  return content; 
		}
		public void setContent(String textContent) { 
			
		  this.content = textContent; 
		} 
		
	} 
com.mail-DiffentContent
package com.mail;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.log4j.Logger;

import com.util.Utils;

public class DiffentContent {
	public static Logger log = Logger.getLogger(Object.class);
	/**
	 * 获得b.txt文件中a.txt没有的部分
	 */
	private List<String> diffent(File a, File b,String charsetA,String charsetB) {
		List<String> list = new ArrayList<String>();
		try {
			list = this.readB(b,charsetB);// 得到要比较的b.txt中的内容
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(a)));// 把a.txt读入到缓存
			String oneLine = "";
			while ((oneLine = reader.readLine()) != null) {// 一行一行的读取
				oneLine = oneLine.trim();// 去掉前后空格

				if (list.contains(oneLine))//如果包含就移除
					list.remove(oneLine);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 把B文件的没一行放入到List中
	 * @return
	 */
	private List<String> readB(File b,String charsetB) {
		
		List<String> list = new ArrayList<String>();//要返回的b.txt文本中的内容
		if(b != null) {
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(b),charsetB));//把b.txt读入到缓存
				String oneLine = "";
				while((oneLine=reader.readLine()) != null){//一行一行的读取
					list.add(oneLine.trim());//加入到List中
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return list;
	}
	
	/**
	 * 把不同的内容写入到c.txt文件中
	 */
	private void writeC(List<String> different, String diffFile) {
		try {
			if(different != null) {
				PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(diffFile),"GBK")));
				for(String str : different) {
					out.append(str).append("\r\n");
				}
				out.flush();
				out.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public String codeString(String fileName) throws Exception{
        BufferedInputStream bin = new BufferedInputStream(
        new FileInputStream(fileName));
        int p = (bin.read() << 8) + bin.read();
        String code = null;
         
        switch (p) {
            case 0xefbb:
                code = "UTF-8";
                break;
            case 0xfffe:
                code = "Unicode";
                break;
            case 0xfeff:
                code = "UTF-16BE";
                break;
            default:
                code = "GBK";
        }
         
        return code;
    }
	
	//入口方法
	//B文件是原始文件名称
	//A是执行成功的文件名称
	//diffPath是差别文件放置的目录
	public String getDiffentFIle(String fileA,String fileB) {
		log.info("开始比较文件");
		String charsetA="";
		String charsetB="";
		Properties  prop = Utils.getPropertyJob();
		String filePath = prop.getProperty("FilePath");
		String diffFile = filePath+"/diffent/d_"+fileB;
		try {
			charsetA = codeString(filePath+"/success/"+fileA);
			charsetB = codeString(filePath+"/"+fileB);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		File a = new File(filePath+"/success/"+fileA);//a.txt文件
		File b = new File(filePath+"/"+fileB);//b.txt文件
		List<String> diffent = diffent(a, b,charsetA,charsetB);//获得b.txt文件中a.txt没有的部分
		writeC(diffent, diffFile);
		log.info("结束比较文件");
		return diffFile;
	}

}
Global site tag (gtag.js) - Google Analytics