javax.mail.NoSuchProviderException: Unable to locate provider for protocol:stmp
异常处理:
不要用环境自带的mail.jar;;;使用自己导入的javax.mail的jar包
maven配置:
昨天下午就码好了定时发送邮件的代码,用main方法测试的时候,发过去的邮件的附件一直是乱码,如图
妹的,一直出现无主题,附件为乱码,而且这哪里是附件????!!!!
在网上找来找去,也就那几种编码方式,挨着试过来,依旧是乱码,改了不下于10次,依旧这样...我那个**都碎了!
今天下午就没管他,正准备下班呢,想着把web项目运行下跑一下项目,......我擦,成了,有木有!!!
不多说,贴代码:
功能实现每天,每周一,每月定时发送邮件!!
定时器
ava定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)
如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);
schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒
由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期.
注:发送邮件要设置邮箱客户端,我用的是腾讯企业邮箱,因此
props.put("mail.smtp.host","smtp.exmail.qq.com"); 中设置的是腾讯企业邮箱的电子信箱服务器 smtp.exmail.qq.com
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.logger.util.HandleTime;
public class MyTimerTask implements ServletContextListener {
private Timer timer = null;
public void contextDestroyed(ServletContextEvent event) {
timer.cancel();
event.getServletContext().log("定时器销毁");
}
public void contextInitialized(ServletContextEvent event) {
// 在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能
timer = new Timer(true);
event.getServletContext().log("定时器已启动");// 添加日志,可在tomcat日志中查看到
// 调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
timer.schedule(new MyEmail(event.getServletContext()), 0,
24 * 60 * 60 * 1000);
// 判断到每天的 8:8:8
if(HandleTime.judgeEveryDay()){
event.getServletContext().log("定时器已启动");// 添加日志,可在tomcat日志中查看到
// 调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
timer.schedule(new SendEveryDayEmail(event.getServletContext()), 0,
24 * 60 * 60 * 1000);
}
// 判断是周一的话
if(HandleTime.judgeMonday()){
event.getServletContext().log("定时器已启动");// 添加日志,可在tomcat日志中查看到
// 调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
timer.schedule(new SendMondayEmail(event.getServletContext()), 0,
7*24 * 60 * 60 * 1000);
}
// 判断是一号
if(HandleTime.judgeFirstDayOfMonth()){
event.getServletContext().log("定时器已启动");// 添加日志,可在tomcat日志中查看到
// 调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时;
timer.schedule(new SendFirstDayOfMonthEmail(event.getServletContext()), 0,
60*24 * 60 * 60 * 1000);
}
}
}
发送邮件的类之一
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import java.util.TimerTask;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import javax.servlet.ServletContext;
import com.logger.job.CreatExecl;
public class SendEveryDayEmail extends TimerTask {
private ServletContext context = null;
public SendEveryDayEmail(ServletContext context) {
this.context = context;
}
@Override
public void run() {
System.out.println("正在发送邮件");
Properties props=new Properties();
props.put("mail.smtp.host","smtp.exmail.qq.com");//发件人使用发邮件的电子信箱服务器我使用的是163的服务器
props.put("mail.smtp.auth","true");
Session s=Session.getInstance(props);
s.setDebug(true);
MimeMessage message=new MimeMessage(s);
try {
//给消息对象设置发件人/收件人/主题/发信时间
InternetAddress from = new InternetAddress("发件人邮箱");
message.setFrom(from);
InternetAddress to=new InternetAddress(" 发邮件的目的地(收件人信箱)
message.setRecipient(Message.RecipientType.TO,to);
message.setSubject(MimeUtility.encodeText("title","utf-8","B"));// ttitle为邮件的标题
message.setSentDate(new Date());
Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
// 设置信件文本内容
BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象
mdp.setContent("邮件內容","text/html;charset=utf-8");//给BodyPart对象设置内容和格式/编码方式tcontent为邮件内容
mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart)
// 設置信件的附件
mdp = new MimeBodyPart();
// 创建用来传输的文件
CreatExecl.creatUvAndPVAndIpExecl();
String file = "d:\\job.xls";
FileDataSource fds = new FileDataSource(file);
DataHandler dh = new DataHandler(fds);
int i = file.lastIndexOf("\\"); //提取文件名
String fname = file.substring(i);
mdp.setFileName(fds.getName()); //
mdp.setFileName(MimeUtility.encodeText(fds.getName(),"utf-8","B")); //
mdp.setDataHandler(dh);
mm.addBodyPart(mdp);
message.setContent(mm);//把mm作为消息对象的内容
message.saveChanges();
Transport transport=s.getTransport("smtp");
transport.connect("smtp.exmail.qq.com","发邮件人帐户密码,此外是我的帐户密码,使用时请修改。
transport.sendMessage(message,message.getAllRecipients());
transport.close();
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后定义配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>com.shiyimm.logger.email.MyTimerTask</listener-class>
</listener>
</web-app>
Over,安心下班喽!!!