Spring+quartz实现定时发送邮件功能实例

 更新时间:2017年7月6日 23:23  点击:2170
本文介绍了Spring+quartz实现定时发送邮件功能实例,非常实用,有兴趣的同学快来看看吧

在ApplicationContext.xml的内容如下:

 

 代码如下复制代码

<beans

 xmlns="http://www.springframework.org/schema/beans"

 xmlns:aop="http://www.springframework.org/schema/aop"

 xmlns:tx="http://www.springframework.org/schema/tx"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:p="http://www.springframework.org/schema/p"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

      http://www.springframework.org/schema/aop

       http://www.springframework.org/schema/aop/spring-aop-3.1.xsd

       http://www.springframework.org/schema/tx

       http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">

 

  

 

 <beanname="quartzBean"

  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

  

  

  

  

   sendEmail

  

  

   false

  

 

   

  

  

   

   

   

   

    0 0 10 1 * ?

   

  

  

 

  

   

  

 

 

 

 

至于方法如下:

 

 代码如下复制代码

packagecom.zhuyun.net;

 

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileNotFoundException;

importjava.io.FileOutputStream;

importjava.io.FileWriter;

importjava.io.IOException;

importjava.io.ObjectInputStream;

importjava.io.ObjectOutputStream;

importjava.io.OutputStream;

importjava.io.OutputStreamWriter;

importjava.io.Writer;

importjava.sql.SQLException;

importjava.text.SimpleDateFormat;

importjava.util.ArrayList;

importjava.util.Calendar;

importjava.util.Date;

importjava.util.List;

importjava.util.Properties;

 

importjavax.activation.DataHandler;

importjavax.activation.DataSource;

importjavax.activation.FileDataSource;

importjavax.mail.BodyPart;

importjavax.mail.Message;

importjavax.mail.Multipart;

importjavax.mail.Session;

importjavax.mail.Transport;

importjavax.mail.internet.InternetAddress;

importjavax.mail.internet.MimeBodyPart;

importjavax.mail.internet.MimeMessage;

importjavax.mail.internet.MimeMultipart;

 

 

 

publicclassAttachmentEmailUtil {

 

 privateString host ="";// smtp服务器

 privateString from ="";// 发件人地址

 privateString to ="";// 收件人地址

 privateString affix ="";// 附件地址

 privateString affixName ="";// 附件名称

 privateString user ="";// 用户名

 privateString pwd ="";// 密码

 privateString subject ="";// 邮件标题

 

 publicvoidsetAddress(String from, String to, String subject) {

  this.from = from;

  this.to = to;

  this.subject = subject;

 }

 

 publicvoidsetAffix(String affix, String affixName) {

  this.affix = affix;

  this.affixName = affixName;

 }

 

 publicvoidsend(String host, String user, String pwd) {

  this.host = host;

  this.user = user;

  this.pwd = pwd;

 

  Properties props =newProperties();

 

  // 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)

  props.put("mail.smtp.host", host);

  // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证

  props.put("mail.smtp.auth","true");

  props.put("mail.smtp.port",465);

  props.put("mail.smtp.ssl.enable",true);

  // 用刚刚设置好的props对象构建一个session

  Session session = Session.getDefaultInstance(props);

 

  // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使

  // 用(你可以在控制台(console)上看到发送邮件的过程)

  session.setDebug(true);

 

  // 用session为参数定义消息对象

  MimeMessage message =newMimeMessage(session);

  try{

   // 加载发件人地址

   message.setFrom(newInternetAddress(from));

   // 加载收件人地址

   message.addRecipient(Message.RecipientType.TO,newInternetAddress(

     to));

   // 加载标题

   message.setSubject(subject);

 

   // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件

   Multipart multipart =newMimeMultipart();

 

   // 设置邮件的文本内容

   BodyPart contentPart =newMimeBodyPart();

   contentPart.setText("第二种方法···");

   multipart.addBodyPart(contentPart);

   // 添加附件

   BodyPart messageBodyPart =newMimeBodyPart();

   DataSource source =newFileDataSource(affix);

   // 添加附件的内容

   messageBodyPart.setDataHandler(newDataHandler(source));

   // 添加附件的标题

   // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码

   sun.misc.BASE64Encoder enc =newsun.misc.BASE64Encoder();

   messageBodyPart.setFileName("=?GBK?B?"

     + enc.encode(affixName.getBytes()) +"?=");

   multipart.addBodyPart(messageBodyPart);

 

   // 将multipart对象放到message中

   message.setContent(multipart);

   // 保存邮件

   message.saveChanges();

   // 发送邮件

   Transport transport = session.getTransport("smtp");

   // 连接服务器的邮箱

   transport.connect(host, user, pwd);

   // 把邮件发送出去

   transport.sendMessage(message, message.getAllRecipients());

   transport.close();

  }catch(Exception e) {

   e.printStackTrace();

  }

 }

 

 publicvoidsendEmail() {

  File file =newFile("/root/EmailFile/content.csv");

  if(!file.exists()) {

   try{

    file.createNewFile();

   }catch(IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  String pushInfoContent ="成功了";

 

  FileWriter writer =null;

  try{

   // 打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件

   writer =newFileWriter(file,true);

   writer.write(pushInfoContent +"\r\n");

  }catch(IOException e) {

   e.printStackTrace();

  }finally{

   try{

    if(writer !=null) {

     writer.close();

    }

   }catch(IOException e) {

    e.printStackTrace();

   }

  }

 

  AttachmentEmailUtil cn =newAttachmentEmailUtil();

  // 设置发件人地址、收件人地址和邮件标题

  cn.setAddress("发件人地址","收件人地址","一个带附件的JavaMail邮件(标题)");

  // 设置要发送附件的位置和标题

  cn.setAffix("附件的位置","附件的文件名");

  // 设置smtp服务器以及邮箱的帐号和密码

  cn.send("smtp.qq.com","帐号","密码");

 

  if(file.exists()) {

   file.delete();

  }

 }

}

 

大概就是这样子了。

本文介绍了详谈Linux开发中常见段错误问题的原因及分析,非常实用,有兴趣的同学快来看看吧!

1    使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因。

2    内存读/写越界。包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等。

3    对于C++对象,应该通过相应类的接口来去内存进行操作,禁止通过其返回的指针对内存进行写操作,典型的如string类的c_str()接口,如果你强制往其返回的指针进行写操作肯定会段错误的,因为其返回的地址是只读的。

4    函数不要返回其中局部对象的引用或地址,当函数返回时,函数栈弹出,局部对象的地址将失效,改写或读这些地址都会造成未知的后果。

5    避免在栈中定义过大的数组,否则可能导致进程的栈空间不足,此时也会出现段错误,同样的,在创建进程/线程时如果不知道此线程/进程最大需要多少栈空间时最好不要在代码中指定栈大小,应该使用系统默认的,这样问题比较好查,ulimit一下即可知道。这类问题也是为什么我的程序在其他平台跑得好好的,为什么一移植到这个平台就段错误了。

6    操作系统的相关限制,如:进程可以分配的最大内存,进程可以打开的最大文件描述符个数等,在Linux下这些需要通过ulimit、setrlimit、sysctl等来解除相关的限制,这类段错误问题在系统移植中也经常发现,以前我们移植Linux的程序到VxWorks下时经常遇到(VxWorks要改内核配置来解决)。

7    多线程的程序,涉及到多个线程同时操作一块内存时必须进行互斥,否则内存中的内容将不可预料。

8    在多线程环境下使用非线程安全的函数调用,例如 strerror 函数等。

9    在有信号的环境中,使用不可重入函数调用,而这些函数内部会读或写某片内存区,当信号中断时,内存写操作将被打断,而下次进入时将无法避免地出错。

10    跨进程传递某个地址,传递的都是经过映射的虚拟地址,对另外一个进程是不通用的。

11   某些有特殊要求的系统调用,例如epool_wait,正常情况下使用close关闭一个套接字后,epool会不再返回这个socket上的事件,但是如果你使用dup或dup2操作,将导致epool无法进行移除操作,此时再进行读写操作肯定是段错误的。

小编给大家推荐的这篇文章详细解析了前端框架学习总结之Angular、React与Vue的比较,非常有用,有兴趣的朋友快来看看吧

近几年前端的技术发展很快,细分下来,主要可以分成四个方面:

      1.开发语言技术,主要是ES6&7,coffeescript,typescript等;

      2.开发框架,如Angular,React,Vue.js,Angular2等;

      3.开发工具的丰富和前端工程化,像Grunt,Gulp,Webpack,npm,eslint,mocha这些技术;

       4.前端开发范围的扩展,如服务端的nodejs,express,koa,meteor,GraphQL;移动端和跨平台的PhoneGap,ionic,ReactNative,Weex;计算机图形学和3维建模领域的WebGL(three.js等);可视化与数据分析领域的d3.js等;包括浏览器不断开放的更多新特性和接口比如svg,canvas,蓝牙,电池,本地存储,service  worker,Houdini等新的API能力,以及像WASM这样的底层优化技术;

就开发框架这块,Angular(1&2),React,Vue目前占据着主流地位而且会相持比较长的一段时间,所以这里对比一下这三门技术,以便之后的技术选型。

一、数据流

数据绑定

Angular 使用双向绑定即:界面的操作能实时反映到数据,数据的变更能实时展现到界面。

实现原理:

$scope变量中使用脏值检查来实现。像ember.js是基于setter,getter的观测机制,

$scope.$watch函数,监视一个变量的变化。函数有三参数,”要观察什么”,”在变化时要发生什么”,以及你要监视的是一个变量还是一个对象。

使用ng-model时,你可以使用双向数据绑定。

使用$scope.$watch(视图到模型)以及$scope.$apply(模型到视图),还有$scope.$digest

调用$scope.$watch时只为它传递了一个参数,无论作用域中的什么东西发生了变化,这个函数都会被调用。在ng-model中,这个函数被用来检查模型和视图有没有同步,如果没有同步,它将会使用新值来更新模型数据。

双向绑定的三个重要方法:

 
$scope.$apply()
 
$scope.$digest()
 
$scope.$watch()

在AngularJS双向绑定中,有2个很重要的概念叫做dirty check,digest loop,dirty  check(脏检测)是用来检查绑定的scope中的对象的状态的,例如,在js里创建了一个对象,并且把这个对象绑定在scope下,这样这个对象就处于digest  loop中,loop通过遍历这些对象来发现他们是否改变,如果改变就会调用相应的处理方法来实现双向绑定

Vue 也支持双向绑定,默认为单向绑定,数据从父组件单向传给子组件。在大型应用中使用单向绑定让数据流易于理解。

脏检测的利弊

和ember.js等技术的getter/setter观测机制相比(优):

getter/setter当每次对DOM产生变更,它都要修改DOM树的结构,性能影响大,Angular会把批量操作延时到一次更新,性能相对较好。

和Vue相比(劣):

Vue.js 有更好的性能,并且非常非常容易优化,因为它不使用脏检查。Angular,当 watcher  越来越多时会变得越来越慢,因为作用域内的每一次变化,所有 watcher 都要重新计算。并且,如果一些 watcher  触发另一个更新,脏检查循环(digest cycle)可能要运行多次。 Angular  用户常常要使用深奥的技术,以解决脏检查循环的问题。有时没有简单的办法来优化有大量 watcher 的作用域。Vue.js  则根本没有这个问题,因为它使用基于依赖追踪的观察系统并且异步列队更新,所有的数据变化都是独立地触发,除非它们之间有明确的依赖关系。唯一需要做的优化是在  v-for 上使用 track-by。

React-单向数据流

MVVM流的Angular和Vue,都是通过类似模板的语法,描述界面状态与数据的绑定关系,然后通过内部转换,把这个结构建立起来,当界面发生变化的时候,按照配置规则去更新相应的数据,然后,再根据配置好的规则去,从数据更新界面状态。

React推崇的是函数式编程和单向数据流:给定原始界面(或数据),施加一个变化,就能推导出另外一个状态(界面或者数据的更新)。

React和Vue都可以配合Redux来管理状态数据。

二、视图渲染

Angular1

AngularJS的工作原理是:HTML模板将会被浏览器解析到DOM中,  DOM结构成为AngularJS编译器的输入。AngularJS将会遍历DOM模板,  来生成相应的NG指令,所有的指令都负责针对view(即HTML中的ng-model)来设置数据绑定。因此, NG框架是在DOM加载完成之后,  才开始起作用的。

React

React 的渲染建立在 Virtual DOM 上——一种在内存中描述 DOM 树状态的数据结构。当状态发生变化时,React 重新渲染 Virtual DOM,比较计算之后给真实 DOM 打补丁。

Virtual DOM 提供了函数式的方法描述视图,它不使用数据观察机制,每次更新都会重新渲染整个应用,因此从定义上保证了视图与数据的同步。它也开辟了 JavaScript 同构应用的可能性。

在超大量数据的首屏渲染速度上,React 有一定优势,因为 Vue 的渲染机制启动时候要做的工作比较多,而且 React 支持服务端渲染。

React 的 Virtual DOM 也需要优化。复杂的应用里可以选择 1. 手动添加 shouldComponentUpdate  来避免不需要的 vdom re-render;2. Components 尽可能都用 pureRenderMixin,然后采用 Flux 结构 +  Immutable.js。其实也不是那么简单的。相比之下,Vue  由于采用依赖追踪,默认就是优化状态:动了多少数据,就触发多少更新,不多也不少。

React 和 Angular 2 都有服务端渲染和原生渲染的功能。

Vue.js 不使用 Virtual DOM 而是使用真实 DOM 作为模板,数据绑定到真实节点。Vue.js 的应用环境必须提供 DOM。Vue.js 有时性能会比 React 好**,而且几乎不用手工优化。

三、性能与优化

性能方面,这几个主流框架都应该可以轻松应付大部分常见场景的性能需求,区别在于可优化性和优化对于开发体验的影响。Vue 的话需要加好  track-by 。React 需要 shouldComponentUpdate 或者全面 Immutable,Angular 2 需要手动指定  change detection  strategy。从整体趋势上来说,浏览器和手机还会越变越快,框架本身的渲染性能在整个前端性能优化体系中,会渐渐淡化,更多的优化点还是在构建方式、缓存、图片加载、网络链路、HTTP/2  等方面。

四、模块化与组件化

Angular1 -> Angular2

Angular1使用依赖注入来解决模块之间的依赖问题,模块几乎都依赖于注入容器以及其他相关功能。不是异步加载的,根据依赖列出第一次加载所需的所有依赖。

可以配合类似于Require.js来实现异步加载,懒加载(按需加载)则是借助于 ocLazyLoad 方式的解决方案,但是理想情况下应该是本地框架会更易懂。

Angular2使用ES6的module来定义模块,也考虑了动态加载的需求。

Vue

Vue中指令和组件分得更清晰。指令只封装 DOM 操作,而组件代表一个自给自足的独立单元 —— 有自己的视图和数据逻辑**。在 Angular1 中两者有不少相混的地方。

React

一个 React 应用就是构建在 React 组件之上的。

组件有两个核心概念:props,state。

一个组件就是通过这两个属性的值在 render 方法里面生成这个组件对应的 HTML 结构。

传统的 MVC 是将模板放在其他地方,比如 script 标签或者模板文件,再在 JS 中通过某种手段引用模板。按这种思路,想想多少次我们面对四处分散的模板片段不知所措?纠结模板引擎,纠结模板存放位置,纠结如何引用模板。

React 认为组件才是王道,而组件是和模板紧密关联的,组件模板和组件逻辑分离让问题复杂化了。所以就有了 JSX 这种语法,就是为了把  HTML 模板直接嵌入到 JS 代码里面,这样就做到了模板和组件关联,但是 JS 不支持这种包含 HTML 的语法,所以需要通过工具将 JSX  编译输出成 JS  代码才能使用(可以进行跨平台开发的依据,通过不同的解释器解释成不同平台上运行的代码,由此可以有RN和React开发桌面客户端)。

五、语法与代码风格

React,Vue,Angular2都支持ES6,Angular2官方拥抱了TypeScript这种 JavaScript 风格。

React 以 JavaScript 为中心,Angular 2 依然保留以 HTML 为中心。Angular 2 将 “JS” 嵌入  HTML。React 将 “HTML” 嵌入 JS。Angular 2 沿用了 Angular 1 试图让 HTML 更强大的方式。

React 推荐的做法是 JSX + inline style,也就是把 HTML 和 CSS 全都整进 JavaScript 了。Vue  的默认 API 是以简单易上手为目标,但是进阶之后推荐的是使用 webpack + vue-loader  的单文件组件格式(template,script,style写在一个vue文件里作为一个组件)

本篇文章主要介绍了node.js爬虫爬取拉勾网职位信息的方法。具有很好的参考价值。下面跟着小编一起来看下吧

用node.js写了一个简单的小爬虫,用来爬取拉勾网上的招聘信息,共爬取了北京、上海、广州、深圳、杭州、西安、成都7个城市的数据,分别以前端、PHP、java、c++、python、Android、ios作为关键词进行爬取,爬到的数据以json格式储存到本地,为了方便观察,我将数据整理了一下供大家参考

数据结果

上述数据为3月13日22时爬取的数据,可大致反映各个城市对不同语言的需求量。

爬取过程展示

控制并发进行爬取

爬取到的数据文件

json数据文件

爬虫程序

实现思路

请求拉钩网的  “https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false&city=城市&kd=关键词&pn=页数”可以返回一个json格式的数据,该数据包含所要请求职位的信息,省去了使用chreio解析的麻烦,所以直接用superagent来进行请求上述地址,并将数据储存在本地即可,其中参数city是为城市,kd为所要搜索的关键词,pn为要请求的页数,当中使用到了async来控制异步流程,使得并发数不超过3,防止被封ip。

代码地址及使用

github:https://github.com/zsqosos/positionAnalysis

代码请在github上查看,使用该程序需要安装node环境,如果觉得还不错的话烦请给个star,欢迎大家修改使用该程序。

[!--infotagslink--]

相关文章

  • NodeJS实现阿里大鱼短信通知发送

    本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20
  • PHP测试成功的邮件发送案例

    mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
  • php邮件发送的两种方式

    这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<&#63;php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
  • c# 实现发送邮件的功能

    这篇文章主要介绍了c# 如何实现发送邮件的功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
  • php邮件发送的两种方式

    这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<&#63;php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
  • C#实现图片放大功能的按照像素放大图像方法

    这篇文章主要介绍了C#实现图片放大功能的按照像素放大图像方法,功能非常实用,需要的朋友可以参考下...2020-06-25
  • python中翻译功能translate模块实现方法

    在本篇文章中小编给各位整理了一篇关于python中翻译功能translate模块实现方法,有需要的朋友们可以参考下。...2020-12-18
  • python实现企业微信定时发送文本消息的实例代码

    这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-25
  • c#使用netmail方式发送邮件示例

    这篇文章主要介绍了c#使用netmail方式发送邮件的示例,大家参考使用吧...2020-06-25
  • PHPMailer在SAE上无法发送邮件的解决方法

    PHPMailer在SAE上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决 在SAE上直接用5.2.7...2016-11-25
  • PHP测试成功的邮件发送案例

    mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
  • phpMyAdmin 高级功能设置的方法图解

    phpmyadmin还有高级功能可能大部份站长不知道吧,今天本文章就来给大家介绍phpMyAdmin 高级功能设置的方法图解,希望文章对大家会有所帮助。 phpMyAdmin 安装后,默认...2016-11-25
  • AngularJS 让人爱不释手的八种功能

    AngularJS 让人爱不释手的八种功能,想知道AngularJS哪八种功能让人喜欢就快点看下本文吧...2016-03-28
  • 整理几个android后台发送邮件的方法

    本文我们整理了三个android后台发送邮件的方法及示例,第一个是不借助Intent在android后台发送Email,第二个是用在收集应用的异常信息,第三个是分享一个android后台发送邮...2016-09-20
  • 网上找到的两个PHP发送邮件的例子,很不错,贴出来给初学者参考吧(不知道是否有兄弟曾贴过),呵呵(2

    Advanced Example Here we will show the full capabilities of the PHP mail function. PHP Code: <?php echo "<html><body>"; $recipient = "Kris Arndt <karn@nu...2016-11-25
  • EMUI11上手体验 新颜值/新功能/新体验

    EMUI11值得升级吗?好不好用?下面小编带来EMUI11上手体验,一起来看看手机鸿蒙OS的提前预演...2020-12-08
  • 小爱同学5.0新增了哪些机型 小爱同学5.0新功能介绍

    小爱同学5.0即将发布,据已知报道小爱同学5.0将新增机型,跟着小编一起来看看吧,顺便了解下即将都有哪些新功能面市吧...2020-12-08
  • 微信小程序实现导航功能的操作步骤

    这篇文章主要给大家介绍了关于微信小程序实现导航功能的操作步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • 很全面的JavaScript常用功能汇总集合

    这篇文章主要为大家分享了一份很全面的JavaScript常用功能汇总集合,一些常用的额JS 对象、基本数据结构、功能函数等,感兴趣的小伙伴们可以参考一下...2016-01-24
  • Perl中使用MIME::Lite发送邮件实例

    这篇文章主要介绍了Perl中使用MIME::Lite发送邮件实例,本文介绍了使用sendmail方式发送、发送HTML格式邮件、smtp方式发送邮件等内容,需要的朋友可以参考下...2020-06-29