精华内容
下载资源
问答
  • SpringBoot中发送邮件

    2020-03-04 16:43:27
    SpringBoot中发送邮件 Spring Boot中发送邮件具体的使用步骤如下 1、添加Starter模块依赖 2、添加Spring Boot配置(QQ/网易系/Gmail) 3、调用JavaMailSender接口发送邮件 1、添加依赖 在 Maven pom.xml 配置文件中...

    SpringBoot中发送邮件

    原文地址:https://www.jianshu.com/p/a7097a21b42d

    Spring Boot中发送邮件具体的使用步骤如下

    • 1、添加Starter模块依赖
    • 2、添加Spring Boot配置(QQ/网易系/Gmail)
    • 3、调用JavaMailSender接口发送邮件

    1、添加依赖

    在 Maven pom.xml 配置文件中加入 spring-boot-starter-mail 依赖。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    

    2、添加配置参数

    然后在 application.yml 文件中加入以下配置。
    application.yml 配置

    (1).qq邮箱配置

    ## QQ邮箱配置
    spring:
      mail:
        host: smtp.qq.com #发送邮件服务器
        username: ceshi@qq.com #发送邮件的邮箱地址
        password:  ivhkrc*****kbdcf #客户端授权码,不是邮箱密码,这个在qq邮箱设置里面自动生成的
        properties.mail.smtp.port: 465 #端口号465587
        from: ceshi@qq.com # 发送邮件的地址,和上面username一致
      可以任意
        properties.mail.smtp.starttls.enable: true
        properties.mail.smtp.starttls.required: true
        properties.mail.smtp.ssl.enable: true
        default-encoding: utf-8
    

    (2).网易系(126/163/yeah)邮箱配置

    ##网易系(126/163/yeah)邮箱配置
    spring:
      mail:
        host: smtp.126.com #发送邮件服务器
        username: xx@126.com #发送邮件的邮箱地址
        password: xxxxxxx #客户端授权码,不是邮箱密码,网易的是自己设置的
        properties.mail.smtp.port: 994 #465或者994
        from: xxx@126.com # 发送邮件的地址,和上面username一致
       可以任意
        properties.mail.smtp.starttls.enable: true
        properties.mail.smtp.starttls.required: true
        properties.mail.smtp.ssl.enable: true
        default-encoding: utf-8
    

    注意:

    • 126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994
    • 163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994
    • yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994

    注意:发送邮件的邮箱地址必须开通STMP服务,开通方式请自行查阅

    3.封装邮件接口,方便调用发送邮件

    IMailService 接口

    
    /**
     * @Author: 姜飞祥
     * @Description: 封装一个发邮件的接口,后边直接调用即可
     * @Date: Create in 2019/1/28/0028 21:57
     * @param: $params$
     * @return: $returns$
     */
    public interface IMailService {
    
        /**
         * 发送文本邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         */
        void sendSimpleMail(String to, String subject, String content);
    
        /**
         * 发送HTML邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         */
        public void sendHtmlMail(String to, String subject, String content);
    
    
    
        /**
         * 发送带附件的邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         * @param filePath 附件
         */
        public void sendAttachmentsMail(String to, String subject, String content, String filePath);
    }
    

    IMailServiceImpl 实现类

    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Service;
    
    import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File;
    
    /**
     * @Author: 姜飞祥
     * @Description:
     * @Date: Create in 2019/1/28/0028 22:00
     * @param: $params$
     * @return: $returns$
     */
    @Service
    public class IMailServiceImpl implements IMailService {
        private final Logger logger = LoggerFactory.getLogger(this.getClass());
    
        /**
         * Spring Boot 提供了一个发送邮件的简单抽象,使用的是下面这个接口,这里直接注入即可使用
         */
        @Autowired
        private JavaMailSender mailSender;
    
        /**
         * 配置文件中我的qq邮箱
         */
        @Value("${spring.mail.from}")
        private String from;
    
        /**
         * 简单文本邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         */
        @Override
        public void sendSimpleMail(String to, String subject, String content) {
            //创建SimpleMailMessage对象
            SimpleMailMessage message = new SimpleMailMessage();
            //邮件发送人
            message.setFrom(from);
            //邮件接收人
            message.setTo(to);
            //邮件主题
            message.setSubject(subject);
            //邮件内容
            message.setText(content);
            //发送邮件
            mailSender.send(message);
        }
    
        /**
         * html邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         */
        @Override
        public void sendHtmlMail(String to, String subject, String content) {
            //获取MimeMessage对象
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper messageHelper;
            try {
                messageHelper = new MimeMessageHelper(message, true);
                //邮件发送人
                messageHelper.setFrom(from);
                //邮件接收人
                messageHelper.setTo(subject);
                //邮件主题
                message.setSubject(subject);
                //邮件内容,html格式
                messageHelper.setText(content, true);
                //发送
                mailSender.send(message);
                //日志信息
                logger.info("邮件已经发送。");
            } catch (MessagingException e) {
                logger.error("发送邮件时发生异常!", e);
            }
        }
    
        /**
         * 带附件的邮件
         * @param to 收件人
         * @param subject 主题
         * @param content 内容
         * @param filePath 附件
         */
        @Override
        public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
            MimeMessage message = mailSender.createMimeMessage();
            try {
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from);
                helper.setTo(to);
                helper.setSubject(subject);
                helper.setText(content, true);
    
                FileSystemResource file = new FileSystemResource(new File(filePath));
                String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
                helper.addAttachment(fileName, file);
                mailSender.send(message);
                //日志信息
                logger.info("邮件已经发送。");
            } catch (MessagingException e) {
                logger.error("发送邮件时发生异常!", e);
            }
    
    
        }
    }
    

    4.测试

    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class SendemailApplicationTests {
    
        /**
         * 注入发送邮件的接口
         */
        @Autowired
        private IMailService mailService;
    
        /**
         * 测试发送文本邮件
         */
        @Test
        public void sendmail() {
            mailService.sendSimpleMail("ceshi@163.com","主题:你好普通邮件","内容:第一封邮件");
        }
    
        @Test
        public void sendmailHtml(){
            mailService.sendHtmlMail("ceshi@163.com","主题:你好html邮件","<h1>内容:第一封html邮件</h1>");
        }
    }
    
    展开全文
  • ​ 使用Bugscan检测到我自己的网站有这...此处将主要围绕解决方案来说,文本旨在读者看后能得到一个正常运行的设置。 首先,如何验证邮件伪造? ​ 解决对邮件伪造的疑惑,这里有一个在线的测试网站:https://emke

    使用Bugscan检测到我自己的网站有这个漏洞后,我费了好一番功夫来查找资料,终于是解决了这个问题。在此把经验分享出来,主要觉得这方面中文资料太少了。

    检测到你的服务器存在邮件伪造的时候,你可能还在疑惑:这到底是什么东西?有什么危害?和我有什么关系?

    这里就不再细说邮件伪造的始末。遇到问题大家最关心的是解决方案。此处将主要围绕解决方案来说,文本旨在读者看后能得到一个正常运行的设置。

    首先,如何验证邮件伪造?

    解决对邮件伪造的疑惑,这里有一个在线的测试网站:https://emkei.cz/ 。可以尝试使用这个网站测试发送一封邮件给自己。例如:检测说a.com存在邮件伪造漏洞。那么我们可以尝试使用admin@a.com作为发件人,给一个自己的邮箱,例如我的treeoph(at)gmail(dot)com发送一封测试邮件。内容随意填写,不到一分钟你应该就能收到邮件了,也有可能会在垃圾邮件里。注意,请勿用于非法用途。

    第二,有什么危害?

    可以想见如果有一个a.com的用户,在收到admin@a.com 的邮件后,用户很可能就相信这就是管理员(admin)发来的邮件。因此,用户很可能会毫不犹豫地点开邮件中的链接、下载并打开其中的附件。这个时候,作为一个a.com的用户,就很可能被攻击控制了。如果用户是管理员,那么可能服务器权限也会沦落他人之手。

    另外一种危害方式,一个垃圾邮件生产者可以伪造海量的a.com域名的邮件来散播木马、病毒、钓鱼页面,色情、暴力、恐怖的信息,等等。其危害是不可预测的。

    第三,如何防止邮件伪造?

    答案是:Sender PolicyFramework (SPF) 发信者策略

    1. SPF是什么呢?

    简单来说就是人们设计的一套可以杜绝邮件伪造的机制,只要遵照他们设计的方法来配置自己域名的DNS解析,就可以杜绝邮件伪造。

    关于SPF的一切,你可以在这个网站(英文)上获得:http://www.openspf.org

    ​ SPF 的原理是这样的,伪造这虽然能伪造你的域名,但是却不能控制你的域名的DNS解析记录。因为只有拥有域名账户权限,才能更改解析记录。你的域名解析到的ip1.1.1.1,而伪造者的ip2.2.2.2。如果能做一个声明,告诉邮件接收者,我的域名发的邮件ip都是1.1.1.1,其他的都是假的,可以抛弃掉,那么就可以杜绝邮件伪造了。SPF就是这样的一个协议,你可以按照SPF的格式发出声明,邮件服务器按照SPF解读你的声明。这样的一次沟通,就可以解决邮件伪造问题了。

    2. 如何使用SPF

    首先,登录你的域名提供商的管理页面,这个页面就是通常是用来设置域名解析ip地址的地方。例如上述例子,可以这样声明,在域名的解析记录里添加一条txt记录,

    二级域名:空或@

    txt记录值为:v=spf1 ip4:1.1.1.1 -all

    这样,就设置了你的邮件只能是从1.1.1.1这个ip发出的。其中txt记录的意义:

    v=spf1      #版本号声明;

    ip4:x.x.x.x #指定ip地址;

    -all        #对其余的标记为无效(FAIL)

    当然这样设置有些问题就是你的域名可能需要变化的ip地址,或扩增多个ip,这时候就可以用其他方式,更改中间的部分(ip4对应位置):

    二级域名:空或@

    txt记录值为:v=spf1 include:spf1.a.com include:spf2.a.com -all

    再设置一个spf1.a.comtxt解析记录,内容为:

    二级域名:spf1

    txt记录值为:v=spf1 ip4:1.1.1.0/24 ip4:1.2.3.4 -all

    其中include的意思是使用其后的地址的SPF记录。而ip4:1.1.1.0/24则是使用一个段。设置spf2.a.com与此类似。这样就可以使用更多的地址作为合法地址。也可以include多层,但常见的一般最多三层已经够用,最后一层要指定到具体的ip或域名。

    其他如:v=spf1 a mx ip4:x.x.x.x -all 使用a记录,mx解析记录和指定的ip作为合法地址。

    3.更多

    关于剩余检查项all前面的“-”符号,参见下表:

    "+"  Pass(通过)

    "-"  Fail(拒绝)

    "~"  Soft Fail(软拒绝)

    "?"  Neutral(中立)

    建议使用“-all”来拒绝陌生地址的邮件。当使用“~all”时,一般会将邮件标记为垃圾邮件。但是由于有时人们还是会翻查垃圾邮件(甚至有时官方都会建议去检查垃圾邮件),因此这样处理并不安全。所以如无特殊需求,建议使用“-all”来拒绝。

    禁用所有邮件服务:

    v=spf1 -all

    详细语法说明(英文): http://www.openspf.org/SPF_Record_Syntax

    http://www.openspf.org/RFC_4408

    (用空的话把这个翻译出来)

    参考链接(中文):http://www.renfei.org/blog/introduction-to-spf.html

    展开全文
  • 一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱  要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的...

    一、 邮件开发涉及到的一些基本概念

    1.1、邮件服务器和电子邮箱

      要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。

      这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

      电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请,确切地说,电子邮箱其实就是用户在邮件服务器上申请的一个账户,用户在邮件服务器上申请了一个帐号后,邮件服务器就会为这个账号分配一定的空间,用户从而可以使用这个帐号以及空间发送电子邮件和保存别人发送过来的电子邮件。

    1.2、邮件传输协议

    1.2.1、SMTP协议

      用户连接上邮件服务器之后,要想给它发送一封电子邮件,需要遵循一定的通讯规则,SMTP协议就是用来定义这种通讯规则的。因此,我们通常也把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

    1.2.2、POP3协议

      同样,用户若想从邮件服务器管理的电子邮箱当中接收一封电子邮件话,它连上邮件服务器后,也要遵循一定的通讯格式,POP3协议就是用来定义这种通讯格式的。因此,我们通常也把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

    1.3、电子邮件的发送和接收过程

      通过一张图来说明一封邮件的发送和接收过程,如下图所示:

      

      简单说一下这个邮件收发过程:

      1、xdp@sohu.com 用户写好一封Email发送到sohu的Smtp服务器。对应于上图的步骤①

      2、sohu的Smtp服务器开始处理xdp@sohu.com 用户的请求,它会根据收件人的地址判断,当前收件人是不是自己管辖的用户,如果是,就直接将Email存放到为该收件人的分配的邮箱空间当中。sohu的Smtp服务器判断收件人地址发现,这一封Email的收件人gacl@sina.com 是Sina的邮件服务器管理的,于是又将Email转发给Sina的Smtp服务器。对应于上图的步骤②

      3、Sina的Smtp服务器开始处理sohu的Smtp服务器发送过来的Email,Sina的Smtp服务器根据收件人的地址判断,发现收件人自己管辖的用户,于是就直接将Email存放到为gacl@sina.com 用户的分配的邮箱空间当中。对应于上图的步骤③。

      4、xdp@sohu.com 用户将邮件发出去之后,就通知gacl@sina.com 用户去收取。gacl@sina.com 用户于是就连接上Sina的POP3服务器收取邮件,对应于上图的步骤④。

      5、POP3服务器从gacl@sina.com 用户的邮箱空间当中取出Email,对应于步骤⑤。

      6、POP3服务器将取出来的Email发给gacl@sina.com 用户,对应于步骤⑥。

    二、使用Smtp协议发送邮件

    2.1、Smtp协议讲解

      使用smtp协议发送邮件给邮件服务器时规定了要做以下几件事

      1、使用"ehlo"命令和连接上的smtp服务器打声招呼,例如:

         ehlo gacl

      2、使用"auth login"命令登录到Smtp服务器,登录使用的用户名和密码必须经过Base64加密,例如:   

        ①、输入命令:auth login  

        ②、输入使用Base64加密过后的用户名:Z2FjbA==  

        ③、输入Base64加密过后的密码:MTIzNDU2

      3、指明邮件的发件人和收件人

        mail from:<gacl@sohu.com>

        rcpt to:<xdp_gacl@sina.cn>

       4、编写要发送的邮件内容,邮件的编写格式是有一定的规则的,一封格式良好的邮件应该包含邮件头和邮件的主体内容。

        邮件头使用下面的三个字段来指明

      1. from字段用于指明邮件的发送人
      2. to字段用于指明邮件的收件人
      3. subject字段用于指明邮件的主题

        邮件的内容包含了这些信息之后才是一封格式良好的邮件。

        ①、输入"data"命令

          data

        ②、编写邮件内容

          from:<gacl@sohu.com>    ----邮件头

          to:<xdp_gacl@sina.cn>     ----邮件头

          subject:hello          ----邮件头

                          -----空行

          hello gacl            ----邮件的具体内容

      5、输入一个.告诉邮件服务器邮件内容已经写完了

        .

      6、输入quit命令断开与邮件服务器的连接

        quit

      以上的6个步骤就是Smtp协议规定的发送一封Email必须要做的事情。

    2.2、使用Smtp协议手工发送邮件

      在对Smtp协议有一定的了解之后,我们就可以使用Smtp协议来发送邮件了。下面演示一下使用Telnet客户端连接上搜狐的邮件服务器然后发一封Email到新浪的邮箱中去

      为了能够对Smtp协议有一个直观的认识,这里我们不借助任何第三方邮件客户端工具,而是使用最原始的的Telnet客户端来完成邮件的发送过程,Telnet是一个Window自带的网络客户端程序,通过它可以连接上互联网上面的任意一台主机。

      使用telnet客户端连接到搜狐的smtp服务器,如下图所示:

      

      通过telnet客户端发Email,如下图所示:

       

      我们登录到<xdp_gacl@sina.cn>邮箱当中,就可以收取到由<gacl@sohu.com>发送的Email了,如下图所示:

      

      这就是使用Smtp协议发送邮件的过程。

    三、使用POP3协议接收邮件

    3.1、POP3协议讲解

      POP3协议规定了收取邮件时要做以下几件事

    ①、输入用户名和密码登录到POP3服务器,用户名和密码不需要经过Base64加密

      user username --登录邮箱的用户名
      pass password --登录邮箱使用的密码

    ②、使用retr命令收取邮件
      retr 数字 收取邮件,retr 1表示收取邮箱当中的第一封邮件,这是POP3协议里面最重要的一个命令。

      在使用retr命令收取邮件之前,可以使用如下的两个命令查看一下邮箱里面的邮件的一些相关信息。

      stat

        返回邮箱里面的邮件数量以及邮件占用的空间大小信息
      list 数字

        返回某一封邮件的统计信息

    ③、邮件收取完成之后使用quit命令断开与POP3服务器的连接。
      quit 断开与POP3服务器的连接

    3.2、使用POP3协议手工接收邮件

      收取邮件我们也不借助任何第三方客户端工具,而是使用Telnet客户端连接到POP3服务器进行收取。

      例如:现在我的搜狐邮箱当中有这样的一封邮件,如下图所示:

      

      现在我们不用使用foxmail或者outLook这样的客户端工具去收取,而是使用Telnet客户端连接到搜狐的POP3服务器去手工收取。

      1、使用Telnet连接上搜狐的POP3服务器,使用命令:telnet pop3.sohu.com 110,如下图所示:

      

      根据POP3协议规定的邮件收取步骤来收取邮件。如下图所示:

      

      可以看到,我们POP3协议纯手工从搜狐的POP3服务器当中收取回来了一封Email,Email里面的内容都经过了Base64编码处理,下面我们写一个小程序将经过Base64编码后的邮件内容进行解码,还原回邮件的内容,代码如下:

    复制代码
     1 package me.gacl.encrypt;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.InputStreamReader;
     6 
     7 import sun.misc.BASE64Decoder;
     8 import sun.misc.BASE64Encoder;
     9 
    10 public class Base64Encrypt {
    11 
    12     public static void main(String args[]) throws IOException{
    13         /*System.out.print("请输入用户名:");
    14         BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    15         String userName = in.readLine();
    16         System.out.print("请输入密码:");
    17         String password = in.readLine();
    18         BASE64Encoder encoder = new BASE64Encoder();
    19         System.out.println("编码后的用户名为:" + encoder.encode(userName.getBytes()));
    20         System.out.println("编码后的密码为:" + encoder.encode(password.getBytes()));*/
    21         
    22         BASE64Decoder decoder = new BASE64Decoder();
    23         //邮件主题的Base64编码
    24         String emailSubject = "=?GBK?B?08q8/rLiytQ=?=";
    25         //邮件文本内容的Base64编码
    26         String emailPlainContent = "vPK1pbXE08q8/reiy82y4srUo6E=";
    27         //带html标签和邮件内容的Base64编码
    28         String emailHtmlContent = "PFA+vPK1pbXE08q8/reiy82y4srUo6E8L1A+";
    29         //将使用Base64编码过后的文本内容再使用Base64来解码
    30         emailSubject = new String(decoder.decodeBuffer(emailSubject),"GBK");
    31         emailPlainContent = new String(decoder.decodeBuffer(emailPlainContent),"GBK");
    32         emailHtmlContent = new String(decoder.decodeBuffer(emailHtmlContent),"GBK");
    33         System.out.println("邮件标题:"+emailSubject);
    34         System.out.println("邮件内容:"+emailPlainContent);
    35         System.out.println("带html标签的邮件内容:"+emailHtmlContent);
    36     }
    37 }
    复制代码

      运行结果如下:
      

      这就是使用POP3协议收取邮件的过程。

      以上就是邮件的发送与接收原理的相关内容,这一篇文章主要是介绍邮件发送和接收过程中使用到的smtp协议和pop3协议。没有涉及到太多代码方面的东西,后面会具体介绍使用JavaMail来进行邮件发送。

    转载:http://blog.csdn.net/qq_15646957/article/details/52544099

    展开全文
  • 一个自托管的台式机Node.js应用程序,它观察任意数量的subreddit,并为经过过滤的Reddit新帖子提供电子邮件通知。 它是完全免费的,适用于Windows,Mac和Linux。 功能支持... 无限的subreddits 。 是否想获得有关和...
  • 根据生日定时发送生日祝福邮件

    千次阅读 2020-09-04 00:54:27
    根据不同的生日日期,在生日当天发送一个祝福邮件,这是需要做到两个事情 定时,根据生日定时到每年的那一天 发送邮件 定时发送 要想做到定时发送,这时就需要一个定时任务调度的工具,这里使用的是Quartz Quartz...

    需求

    根据不同的生日日期,在生日当天发送一个祝福邮件,这是需要做到两个事情

    1. 定时,根据生日定时到每年的那一天
    2. 发送邮件

    定时发送

    要想做到定时发送,这时就需要一个定时任务调度的工具,这里使用的是Quartz
    Quartz是一个定时任务调度框架,主要包含三个部分,Schedule(调度器)、
    JobDetail(任务)CronTrigger(触发器)

    1. Scheduler
      调度器主要是调度调度规则,在规则下启动任务
    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
    
    1. CronTrigger
      触发器中可以设置任务的触发规则
      主要属性:
      startNow():设置起始时间为即时启动
      **withSchedule:**设置任务的执行规律和执行次数
      withIntervalInSecos() :每隔多长时间执行,时间单位是秒
      repeatForever():持续循环执行,直到结束
      endAt: 触发器的结束时间
      因为使用的是CronTrigger,所以时间表达式按照cron的规则
      依次为(秒 分 时 日 月 星期 (年(可选)))
      特殊符号:
      **,**并列
      - 区间,范围
      / 间隔,从起始点间隔多长时间
      ***** 任意值
      **?**不确定值
      SimpleTrigger trigger = TriggerBuilder.newTrigger()
                  trigger.startNow();
                  trigger.withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1) //每秒执行一次
                            .repeatForever());
                  trigger.endAt(new Date(120,8,3,12,45,0))         
                  
      
    2. JobDetial
      创建新任务要实现Job接口,重写execute方法
    public class Myjob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
    //        System.out.println("执行方法");
        }
    }
    
    
    最后要将任务和触发器交给调度器调度
    
    Trigger trigger = triggerBuilder.build();
            //将任务交给触发器
            JobDetail job =JobBuilder.newJob(Myjob.class).build();
            //将触发器交给调度器
            scheduler.scheduleJob(job,trigger);
            //启动调度器
            scheduler.start();
    

    配置式

    调度器:ScheduleFacrotyBean
    任务:JobDetailFactoryBean
    触发器:CronTriggerFactoryBean

    <!--配置任务-->
        <bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="name" value="myjob"/>
            <property name="group" value="mygroup"/>
            <property name="jobClass" value="quartz.MyJob3"/>
        </bean>
        <!--配置调度规则-->
       <bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
           <property name="jobDetail" ref="jobDetail"/>
           <property name="cronExpression" value="* * * * * ?"/>
       </bean>
        <!--配置调度器-->
        <bean name="" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="cronTrigger"></ref>
                </list>
            </property>
        </bean>
    

    注解式

    要使用注解,首先要扫描目标文件,获取注解解析器

     <context:component-scan base-package="quartz"/>
        <task:annotation-driven/>
    

    使用@Schedule注解

    发送邮件

    导入相关的jar包:
    在这里插入图片描述
    想要发送邮件,首先要有一个邮件平台 比如腾讯、新浪,并且要开启邮箱的授权码,获得授权码之后才能进行自动转发

    public static void sendMessage() throws MessagingException {
    		
            //设置邮箱服务器类型
            String host = "smtp.qq.com";
            //设置第三方登录使用验证码
            String auth = "xxxxxxxxx";
            //设置发件人
            Stirng form="xxxxx@qq.com";
            //设置收件人
            String to="xxxxxx@qq.com";
            //获取本地系统参数
            Properties properties=System.getProperties();
            //设置邮件服务器地址
            properties.setProperty("mail.smtp.host",host);
            //告诉邮件客户端,本次请求是需要认证的
            properties.put("mail.smtp.auth", "true");
            //获取邮件服务器连接
            Session session=Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                public  PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(from,auth);
                }
            });
            //组装邮件内容
            MimeMessage message = new MimeMessage(session);
            //发送人
            message.setFrom(new InternetAddress(from));
            //接收人
            message.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress(to));
            //邮件主题
            message.setSubject(subject);
            //邮件内容
            message.setText(context);
            //发送邮件
            Transport.send(message);
            System.out.println("发送成功");
        }
    

    实现

    分别实现了定时任务调度和自动转发邮件之后,就可以将自动转发当做一个Job,通过CronTrigger的表达式设置生日,进行定时转发
    这里采用配置式,方便对任务的分组和批量管理

    将自动发送邮件作为任务

    public class MyJob3 implements Job{
        @Autowired
        private UserDao userDao;
        @Override
        public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            Calendar calendar=Calendar.getInstance();
            int birth_year=calendar.get(Calendar.YEAR);
            int birth_month=calendar.get(Calendar.MONTH)+1;
            int birth_day=calendar.get(Calendar.DAY_OF_MONTH);
            User u=new User();
            u.setBirth_year(birth_year);
            u.setBirth_month(birth_month);
            u.setBirth_day(birth_day);
            List<User> users = userDao.selectUserByBirthday(u);
            for (User user : users) {
                String from ="xxxxxxxx@qq.com";
                String to=user.getEmail();
                String subject="生日祝福";
                String context="今天是您"+(birth_year-user.getBirth_year()+1)+"的生日,祝你生日快乐";
                try {
                    SendMessage.sendMessage(from,to,subject,context);
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    //调用SendMessage方法
    public class SendMessage{
        public static void sendMessage(String from,String to,String subject,String context) throws MessagingException {
            //设置邮箱服务器类型
            String host = "smtp.qq.com";
            //设置第三方登录使用验证码
            String auth = "xxxxxxxxxxx";
            //获取本地系统参数
            Properties properties=System.getProperties();
            //设置邮件服务器地址
            properties.setProperty("mail.smtp.host",host);
            //告诉邮件客户端,本次请求是需要认证的
            properties.put("mail.smtp.auth", "true");
            //获取邮件服务器连接
            Session session=Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                public  PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(from,auth);
                }
            });
            //组装邮件内容
            MimeMessage message = new MimeMessage(session);
            //发送人
            message.setFrom(new InternetAddress(from));
            //接收人
            message.addRecipient(MimeMessage.RecipientType.TO,new InternetAddress(to));
            //邮件主题
            message.setSubject(subject);
            //邮件内容
            message.setText(context);
            //发送邮件
            Transport.send(message);
            System.out.println("发送成功");
        }
    
    }
    

    配置文件

    因为生日是从数据库中读取的,使用到了ssm框架进行整合
    在spring配置文件中配置定时任务调度

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xmlns:task="http://www.springframework.org/schema/task"
           xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
    							http://www.springframework.org/schema/beans/spring-beans.xsd
    							http://www.springframework.org/schema/context
    							http://www.springframework.org/schema/context/spring-context.xsd
    							http://mybatis.org/schema/mybatis-spring
    							http://mybatis.org/schema/mybatis-spring.xsd
    							http://www.springframework.org/schema/tx
    							http://www.springframework.org/schema/tx/spring-tx.xsd
    							http://www.springframework.org/schema/task
    							http://www.springframework.org/schema/task/spring-task.xsd
    							http://www.springframework.org/schema/aop
    							http://www.springframework.org/schema/aop/spring-aop.xsd">
    
        <!--配置任务-->
        <bean name="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="name" value="myjob"/>
            <property name="group" value="mygroup"/>
            <property name="jobClass" value="quartz.MyJob3"/>
        </bean>
        <!--配置调度规则-->
       <bean name="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
           <property name="jobDetail" ref="jobDetail"/>
           <property name="cronExpression" value="0 0 6 * * ?"/>
       </bean>
        <!--配置调度器-->
        <bean name="" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="cronTrigger"></ref>
                </list>
            </property>
        </bean>
    <!--    配置数据库配置文件-->
        <context:property-placeholder location="classpath:jdbc.properties"/>
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <property name="url" value="${url}"/>
            <property name="username" value="${jdbc.userName}"/>
            <property name="password" value="${password}"/>
        </bean>
        <bean class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="mapperLocations" value="classpath*:Dao/*.xml"/>
        </bean>
        <mybatis:scan base-package="Dao"/>
    </beans>
    

    为了方便对任务调度器的管理,可以根据任务的分组和命名进行管理和批量操作,可以在Controller层,通过页面请求
    对Schedule进行操作
    停止
    Schedule.pauseJob()

    scheduler.pauseJob(JobKey.jobKey("jobName","groupName"))
    

    重新开始
    Schedule.resumeJob()

    scheduler.resumeJon(JobKey.jobKey("jobName","groupName"))
    

    删除
    Schedule.deleteJob()

    scheduler.deleteJob(JobKey.jobKey("jobName","groupName"))
    

    问题:

    在数据库映射数据时,数据库的生日字段使用的是data类型的存储方式,在映射的过程中可能会出现下面的错误

    异常:
    原因:Druid版本低,造成字段映射失败,主要是德鲁伊不支持该类型的字段映射
    解决:

    1. 更新德鲁伊的版本,下载对应的映射包

    2. 或者将生日字段分开;
      在这里插入图片描述
      在设置日期是可以使用Calendar获取设置时间:

    		Calendar calendar=Calendar.getInstance();
    		//获取int型的年份
            int birth_year=calendar.get(Calendar.YEAR);
           //获取int型的月份(0-11)
            int birth_month=calendar.get(Calendar.MONTH)+1;
            //获取对应月份的日(自动区分日期)
            int birth_day=calendar.get(Calendar.DAY_OF_MONTH);
    
    展开全文
  • 1、打开cmd(可快捷键window + R,输入cmd) 2、输入 telnet(可能出现提示没有该命令,是因为系统默认没有打开该功能,在网上有很多教程,可自行搜索解决) ...这时将显示邮件成功发送的信息 。
  • Python 利用SMTP协议,基于第三方的邮件服务器发送邮件 在编程时,经常会有各种数据异常或者处理失败等需要发送警示邮件的场合,目前我知道只有两种,一种是利用shell脚本,在异常情况下,发送邮件;其实吧,python...
  • 继续输入邮件正文内容Merry christmas,正文输入结束后,按Ctrl-D 结束输入并发送邮件。 从文件中读取邮件内容并发送 给邮箱example@qq.com发送邮件邮件主题为Text message,邮件内容为/home/user/message.txt中...
  • 用Python发送邮件,需要这样三步

    千次阅读 2020-05-05 12:25:05
    检查和答复电子邮件会占用大量的时间。当然,你不能只写一个程序来处理所有电子邮件,因为每个消息都需要有自己的回应。...好在,可以编写自己的程序来发送这些电子邮件,节省了大量复制和粘贴电子邮件...
  • python批量发送邮件--包括批量不同附件

    万次阅读 热门讨论 2018-08-30 14:42:00
    每个月初都要给每个工长发预付款账单邮件,月中发结算款账单。重复性机械工作。  一个及格线上的程序员,最起码的觉悟就是将重复性的机械工作自动化,于是,在我花了一个多小时,帮她给一部分工长发了一次邮箱后,...
  • 很多小伙伴对于【程序发送邮件】不明觉厉的同时又羡慕嫉妒恨,其实发送邮件是一个很常用的功能, 我们这里就简单做一个发送邮箱的案例。 PS:案例使用qq邮箱,当然,也可以使用其他邮箱,只要替换邮箱关键字即可,...
  • 标题 前言介绍 1.邮件分为发送、接收两部分: 发送邮件:执行smtp协议 接收邮件:执行pop3协议 ...③接收人利用浏览器或其他终端软件从自己的s163邮件服务器获得发给自己的邮件,走pop3协议 3.PHPmail...
  • json发送数据加密方法Do you need to send someone sensitive information through email? Regular email is sent “in the clear” and therefore is subject to interception by hackers. However, there are many...
  • PHPMailer 是一个非常强大的 php发送邮件类,可以设定发送邮件地址、回复地址、邮件主题、html网页,上传附件,并且使用起来非常方便。 1.2PHPMailer优点 1、在邮件中包含多个 TO、CC、BCC 和 REPLY-TO。 2、平台...
  • 一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱  要在Internet上提供电子邮件功能,...例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。  这些邮件...
  • 邮件发送和接收原理

    万次阅读 多人点赞 2016-09-14 23:57:18
    一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱  要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己...
  • 邮件发送与接收原理

    万次阅读 2016-07-20 11:21:26
    1.邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱  要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件...
  • thinkcmf 邮箱获取发送邮件(验证码)

    千次阅读 2017-10-06 16:33:37
    可运行在任何平台之上支持SMTP验证发送...8bit,base64,binary和quoted-printable支持冗余SMTP服务器,即可以指定主smtp服务器地址也只可以指定备份smtp服务器支持带附件的邮件,可以为邮件添加任意格式的附件—当然
  • 上一篇写了一个java发送邮件的工具,原本想用到Android中,但是java工程中的jar包与Android中使用的jar是不一样的。用法也有所不同,其实也一样,稍微有点变化。 Android中使用的两个个jar包 activation.jar 、...
  • /*PHPMailer是一个用于发送电子邮件的PHP函数包。它提供的功能包括:  *.在发送邮时指定多个收件人,抄送地址,暗送地址和回复地址  *.支持多种邮件编码包括:8bit,base64,binary和quoted-printable  *.支持...
  • Python SMTP模块使用QQ邮箱发送邮件

    千次阅读 2018-06-24 10:45:24
    前言: 尝试实现《Python编程快速上手 让...(根据之前编写的读取表格示例可以实现,思路是读取联系人,邮箱,标志位,根据标志位判断使用不同邮件模板发送,就不编程实现了)过程:首先确认QQ邮箱 smtp地址,端...
  • 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。  这些邮件服务器类似于现实生活中的邮局,它主要负责...
  • 由于工作需要,经常要批量发送邮件,最开始的解决方法是通过Excel的VBA宏+outlook进行发送,但由于平时更多的使用Foxmail,而VBA调用Foxmail的办法至今都没有很好的解决(汗…)并且,很多环境中excel的vba与outlook...
  • 一、 邮件开发涉及到的一些基本概念 1.1、邮件服务器和电子邮箱 ...例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。  这些邮件服务器类似于现实生活中的邮局
  • PHP实现邮件的自动发送

    万次阅读 2016-10-28 11:47:24
    最近做一个邮箱验证的功能,研究了一会,搞定了邮件的自动发送。下面用qq邮箱作为演示,一步一步来解释: 代码下载地址 首先,就是做到邮件发送,代码如下: //邮件发送 require './mailer/class....
  • Java mail 发送邮件

    万次阅读 2014-02-08 17:45:41
    * 设置发送邮件的主机(JavaMail需要Properties来创建一个session对象。 * 它将寻找字符串"smtp.hanyastar.com",属性值就是发送邮件的主机); * * @param hostName */ public void setSmtpHost(String ...
  • 一、使用javamail发送普通文本邮件 发送电子邮件 主要步骤如下: 1,获取系统Properties. Properties props = System.getProperties(); 2,将您的SMTP服务器名添加到mail.smtp.host关键字的属性中. Props.pout( ...
  • 遥志邮件服务器最新破解版

    热门讨论 2011-07-21 16:23:28
    CMailServer还提供了完善的Web Mail网页收发邮件功能,用户可以通过浏览器申请邮箱、修改密码、接收和发送邮件邮件发送身份验证功能可以有效的防止垃圾邮件发送者的入侵。管理员可以通过浏览器进行远程邮件帐号...
  • SMTP全称是简单邮件传输协议,它专门用来发送邮件用的。Pop全称是邮局协议,是专门用于接收邮件的。我主要是负责如何实现发送邮件功能的。MailSend命名空间是我整个程序的核心。它包括两个类。在SmtpMail的类中包含...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 57,595
精华内容 23,038
关键字:

发送任意邮件获得最新