spring简单实现邮件任务调度

虽然是叫简单实现,但对我来说确实花了一番功夫,可想而知自己对新事物的学习能力,或者说英语理解能力还需要很大提高。现说一下自己碰到的几个大坑(小坑不说了,太多记不清了)。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");
	}



大哭大哭大哭不说了,都是泪啊~~~~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程背景 CRM(客户关系系统)一直是企业中必备的软件系统,企业通过CRM系统,可以建立与客户之间的联系,保持与客户之间良好的沟通,从而建立商机。可以说,CRM系统对于企业来讲是至关重要的。在中国,CRM系统的还没有被广泛的应用,但是在外国,CRM系统已经被很多企业所接受,应用范围十分广泛,并且也有很多成熟优秀的CRM产品。可以说,市场上对于CRM系统的需求还有很大的上升空间。本课程以一个现实的CRM系统为原型,在对系统需求分析的基础上,对系统进行了设计并且实现。由于课程时间有限,对于CRM系统的功能只实现了一部分,但是已经涵盖了全部的CRM系统的技术点。 1.2、课程内容介绍 在本课程当中,主要讲述了3个核心的知识点。第一个知识点是EasyJWeb框架,这也是国人自主研发的一款优秀的MVC框架。EasyJWeb框架是基于Velocity模板技术的,所有的页面都是静态HTML页面,省略了JSP的编译过程,大大提高了系统的访问速度。EasyJWeb对于中小型的软件项目来说是十分优秀的,内置的Action可以轻易的捕获前台的请求,而EasyJWeb提供了类似于DWR的Ajax技术,大大简化了Ajax的调用过程,提高了开发效率和运行速度。作为国内的MVC框架,EasyJWeb并没有struts2那么大的名气,但是EasyJWeb的初衷就是想要取代struts2的市场份额,在此课程中,我们也为国内自主研发的软件尽一份力量。 第二个知识点是服务调度。这个主意是针对于性能优化的方案,其核心是一种分布式的架构思想,具体的实现手段有很多种,在本课程我们使用了RMI技术来完成。通常我们会将一个完成的程序包运行在Web容器(tomcat或其他)中,容器除了要负责接受前台的请求和返回响应以外,还需要开辟大量的内存来负责数据的处理,逻辑的运算,算法的解析等。一个Web容器的内存是有限的,但是绝大多数的内存都用来处理后台的运算,那么用来接收客户请求的资源就会减少,这样就会使系统的并发数下降。为了提高系统的性能,本课程中的服务调度实际上将系统的前台和后台进行分离,Web容器只服务接收请求和返回响应,一切的数据操作和逻辑运算都交给独立的服务端运行,这样可以极大程度的提高系统的并发数。 第三个知识点是自定义邮件引擎,针对于CRM系统来说,大批量的持续发送邮件是一个很重要的功能,但是普通的邮件群发是无法完成的,邮件服务器会对邮件进行过滤和处理,为了能够尽可能的提高邮件发送的准确性,在本课程中专门讲解了一个邮件调度的功能,以邮件任务为集合,将多个邮件变成邮件任务,然后通过线程和其他的一些控制手段,提高邮件发送的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值