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;
}
}
|