虽然是叫简单实现,但对我来说确实花了一番功夫,可想而知自己对新事物的学习能力,或者说英语理解能力还需要很大提高。现说一下自己碰到的几个大坑(小坑不说了,太多记不清了)。1.在applicationContext.xml中配置MethodInvokingJobDetailFactoryBean的时候我误以为可以直接配targetClass=XX.class,但任务就是不会自动执行。2.在调用任务方法的时候我取bean的时候写成ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml");MailSenderService mailSender = (MailSenderService) context.getBean("mailsenderService");导致了可悲的结果,任务被重复创建,无数次的发送邮件,最后阿里云把我发送邮件的功能都停止了5分钟。其他的不说了,头有点昏,上代码吧!
applicationContext.xml
<!-- <context:component-scan base-package="com.gewb"></context:component-scan> -->
<!-- mail配置文件 -->
<bean name="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:mail.properties</value>
</list>
</property>
</bean>
<!-- 基本的mail发送类 -->
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}" />
<property name="username" value="${mail.username}" />
<property name="password" value="${mail.password}" />
<property name="defaultEncoding" value="UTF-8"></property>
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
<!-- <prop key="mail.smtp.starttls.enable">true</prop> <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
<prop key="mail.smtp.socketFactory.fallback">false</prop> -->
</props>
</property>
</bean>
<!-- 定义mail消息,应该不是必须 -->
<bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage"
scope="prototype">
<property name="from">
<value>${mail.default.from}</value>
</property>
</bean>
<!-- 引用模板vm需要用到的类 -->
<bean id="velocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="velocityProperties">
<props>
<prop key="resource.loader">class</prop>
<prop key="class.resource.loader.class">
org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
</prop>
<prop key="velocimacro.library"></prop>
</props>
</property>
</bean>
<!-- 自己实现的方法 -->
<bean id="mailsenderService" class="com.gewb.service.MailSenderService">
<property name="mailSender" ref="mailSender" />
<property name="simpleMailMessage" ref="simpleMailMessage" />
<property name="velocityEngine" ref="velocityEngine" />
</bean>
<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法 -->
<!-- 定义目标bean和bean中的方法 -->
<!-- 需要调用方法的类 -->
<bean id="quartzTest" class="com.gewb.test.MailTest">
<property name="mailSenderService" ref="mailsenderService"></property>
</bean>
<!-- 方法调用基类 -->
<bean id="SpringQtzJobMethod"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="quartzTest">
<!-- <bean class="com.gewb.service.MailSenderService"></bean> -->
</property>
<!-- 要执行的方法名称 -->
<property name="targetMethod" value="quartzTest"></property>
</bean>
<!-- ======================== 调度触发器,每到指定时间触发 ======================== -->
<bean id="CronTriggerBean"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="SpringQtzJobMethod"></property>
<property name="cronExpression" value="0/30 * * * * ?"></property>
</bean>
<!-- 简单触发器,每隔5秒执行一次任务 -->
<!-- <bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="SpringQtzJobMethod" />
<property name="repeatInterval" value="5000" />
<property name="startDelay" value="1000" />
</bean> -->
<!-- ======================== 调度工厂 ======================== -->
<bean id="SpringJobSchedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="CronTriggerBean" />
</list>
</property>
<!-- <property name="jobDetails">
<list>
<ref bean="SpringQtzJobMethod" />
</list>
</property> -->
</bean>
mail.properties
mail.host=smtp.mail.aliyun.com
mail.port=25
mail.username=怎么可能告诉你
mail.password=怎么可能告诉你
mail.smtp.auth=true
mail.smtp.timeout=10000
mail.default.from=怎么可能告诉你
mail.vm
亲爱的${username}
欢迎加入!
当您收到这封信的时候,您已经可以正常登录了。
请点击链接登录首页:${url}
如果您的email程序不支持链接点击,请将上面的地址拷贝至您的浏览器(如IE)的地址栏进入。
如果您还想申请管理员权限,可以联系管理员${email}
我们对您产生的不便,深表歉意。
希望您在这里度过快乐的时光!
-----------------------
(这是一封自动产生的email,请勿回复。)
MailSenderService
public JavaMailSender getMailSender() {
return mailSender;
}
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public SimpleMailMessage getSimpleMailMessage() {
return simpleMailMessage;
}
public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
this.simpleMailMessage = simpleMailMessage;
}
public VelocityEngine getVelocityEngine() {
return velocityEngine;
}
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
private JavaMailSender mailSender; //spring配置中定义
private SimpleMailMessage simpleMailMessage; //spring配置中定义
private VelocityEngine velocityEngine;//spring配置中定义 //spring配置中定义
private String from; //发件人
private String to; //收件人
private String subject; //邮件主题
private String content; //邮件内容
private String templateName; //引用模板名
private boolean validate = false; //是否需要验证
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTemplateName() {
return templateName;
}
public void setTemplateName(String templateName) {
this.templateName = templateName;
}
public boolean isValidate() {
return validate;
}
public void setValidate(boolean validate) {
this.validate = validate;
}
/**
* 发送模板邮件
*
*/
public void sendWithTemplate(Map model){
// simpleMailMessage.setFrom(getFrom());
simpleMailMessage.setTo(getTo());
simpleMailMessage.setSubject(getSubject());
String text = null;
try {
text = VelocityEngineUtils.mergeTemplateIntoString(getVelocityEngine(), this.getTemplateName(), "UTF-8",model);
} catch (VelocityException e) {
e.printStackTrace();
}
simpleMailMessage.setText(text);
mailSender.send(simpleMailMessage);
}
/**
* 发送普通文本邮件
*
*/
public void sendText(){
// mailSender = this.getMailSender();
simpleMailMessage.setTo(this.getTo()); //接收人
simpleMailMessage.setFrom(simpleMailMessage.getFrom()); //发送人,从配置文件中取得
simpleMailMessage.setSubject(this.getSubject());
simpleMailMessage.setText(this.getContent());
mailSender.send(simpleMailMessage);
}
/**
* 发送普通Html邮件
*
*/
public void sendHtml(){
// mailSender = this.getMailSender();
// 调用MimeMessageHelper辅助类
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
try {
messageHelper.setTo(this.getTo());
messageHelper.setFrom(simpleMailMessage.getFrom());
messageHelper.setSubject(this.getSubject());
messageHelper.setText(this.getContent(),true); //true使用html格式
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(mimeMessage);
}
/**
* 发送普通带一张图片的Html邮件
*
*/
public void sendHtmlWithImage(String imagePath){
//mailSender = this.getMailSender();
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setTo(this.getTo());
messageHelper.setFrom(simpleMailMessage.getFrom());
messageHelper.setSubject(this.getSubject());
messageHelper.setText(this.getContent(),true);
// Content="<html><head></head><body><img src=\"cid:image\"/></body></html>";
//图片必须这样子:<img src='cid:image'/>
FileSystemResource img = new FileSystemResource(new File(imagePath));
messageHelper.addInline("im",img);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(mimeMessage);
}
/**
* 发送普通带附件的Html邮件
*
*/
public void sendHtmlWithAttachment(String filePath){
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String data = format.format(new Date());
System.out.println("邮件发送程序开始:" + data);
// mailSender = this.getMailSender();
MimeMessage mimeMessage = mailSender.createMimeMessage();
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setTo(this.getTo());
messageHelper.setFrom(simpleMailMessage.getFrom());
messageHelper.setSubject(this.getSubject());
messageHelper.setText(this.getContent(),true);
FileSystemResource file = new FileSystemResource(new File(filePath));
messageHelper.addAttachment(file.getFilename(),file);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(mimeMessage);
}
MailTest
private MailSenderService mailSenderService;
public MailSenderService getMailSenderService() {
return mailSenderService;
}
public void setMailSenderService(MailSenderService mailSenderService) {
this.mailSenderService = mailSenderService;
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml");
MailSenderService mailSender = (MailSenderService) context.getBean("mailsenderService");
mailSender.setTo(******); //收件人
mailSender.setSubject("测试邮件!"); //邮件主题
// mailSender.setTemplateName("mail.vm"); //引用的模板
// mailSender.setContent("<html><head></head><body>发送附件测试<br><img src=\"cid:image\"/></body></html>"); //发送图片
mailSender.setContent("附件测试!");
// Map model=new HashMap(); //设置页面参数
// model.put("username", "Bingo");
// model.put("url", "www.gewb.com.cn");
// model.put("email", ******);
// mailSender.sendWithTemplate(model);
// mailSender.sendText();
// mailSender.sendHtml();
// mailSender.sendHtmlWithImage("D:\\workspace\\velocityQuartz\\velocityQuartz\\src\\main\\resources\\eg_tulip.jpg");
// mailSender.sendHtmlWithAttachment("C:\\Users\\Administrator\\Desktop\\公司网络设置.PNG");
System.out.println("邮件发送成功!");
}
public void quartzTest() {
// ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml");
// MailSenderService mailSender = (MailSenderService) context.getBean("mailsenderService");
// SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
// String data = format.format(new Date());
// System.out.println(data);
System.out.println("i am coming");
mailSenderService.setTo("******"); //收件人
mailSenderService.setSubject("测试邮件!"); //邮件主题
mailSenderService.setContent("这是一封定时任务发送的文件!");
mailSenderService.sendHtmlWithAttachment("C:\\Users\\Administrator\\Desktop\\公司网络设置.PNG");
}
不说了,都是泪啊~~~~