Fork项目工作流程,SpringBoot邮件发送
分类:www.澳门新萄京赌场

这篇文章介绍springboot的邮件发送。

最近项目中有一个功能,注册的时候需要验证邮箱,发送激活连接,激活之后才能登陆,在写的时候也是遇到了一些小阻碍,这里写下来给大家借鉴借鉴。

JavaMail是SUN提供给广大Java开发人员的一款邮件发送和接受的一款开源类库,支持常用的邮件协议,如:SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,不再需要考虑底层的通讯细节如:Socket而是关注在逻辑层面。JavaMail可以发送各种复杂MIME格式的邮件内容,注意JavaMail仅支持JDK4及以上版本。虽然JavaMail是JDK的API但它并没有直接加入JDK中,所以我们需要另外添加依赖,下面我们开始讲解本章的内容。

目的

为规范和控制代码提交采用Fork加Merge Request(请求合并)方式提交可测试代码(前端同事还是以原来的方式进行开发)。新的流程将于下一个月版本开始执行,请仔细阅读此文档,如有疑问请直接和我沟通。

码农小马七夕节去相亲了,见了一个不错的姑娘,长的非常甜美!聊着聊着很投缘!通过介绍人了解到,对方也很满意~~想着自己单身多年的生活就要结束啦,心里满是欢喜,美美哒!但是突然想起年初还有几万块在股市里面,一直被套着,心里难受!

由于很简单就没有分出server和imp之类,只是在controller简单写个方法进行测试。

澳门新萄京 1

本章目标

将Java提供的JavaMail类库与SpringBoot项目进行整合,并且简单封装下JavaMail类库。

工作流程

澳门新萄京 2

image.png

为了以后能多一点娶老婆的本钱,日子过的好一点,怎么咬着牙也要把股票的钱捞回来,这些可都是辛苦加班赚来的呀!怎么办呢,于是一咬牙,干脆用万能的Python写一个量化股票系统!

首先pom文件加入spring-boot-starter-mail,代码如下:

sinnamm.jpg

构建项目

本章项目无关Web相关内容,所以创建项目时选择Jar形式创建,并且不需要预先导入依赖。项目结构如下图1所示:

澳门新萄京 3

图1

可以看到上图1内容,多余的依赖并没有添加,如果你选择的是War项目也没有关系名,那好,我们接下来把我们的主角JavaMail请出来吧,把对应的依赖添加到pom.xml配置文件内。如下图2所示:

澳门新萄京 4

图2

依赖我们已经导入成功了,接下来我们开始编写JavaMail的封装,我这里简单的对JavaMail做出封装,如果您需要更完美的封装,请对我的代码做出修改即可,先来编写一个MailEntity类来保存发送邮件时需要的参数字段,如下图3所示:

澳门新萄京 5

图3

我们的MailEntity包含了上图3的字段内容,都是一些必填选项,下面我们来创建一个MailSender也就是邮件发送者实体,主要作用就是用来配置发送邮件参数以及执行发送邮件,代码如下图4、5、6、7、8所示:

澳门新萄京 6

图4

澳门新萄京 7

图5

澳门新萄京 8

图6

澳门新萄京 9

图7

澳门新萄京 10

图8

因为简书的富文本编辑器不支持代码块,下次编写文章使用MarkDown方式来写,类过长贴起来图挺费劲。上面可以看到我使用到了MailContentTypeEnum以及PropertiesUtil工具类。

工作流程详解

前置操作,管理员将各个成员的组角色改为Reporter(无法直接提交代码)。

  • 第一步:登录GitLab进入你想要Fork的项目里面点击fork,然后点击项目名称fork即可,成功以后会在你的项目中出现你自己的项目(用户名/项目名)
![](https://upload-images.jianshu.io/upload_images/3629187-3ef4de277dbdae5f.png)

image.png



![](https://upload-images.jianshu.io/upload_images/3629187-241e161f2e3a5c39.png)

image.png



![](https://upload-images.jianshu.io/upload_images/3629187-c7fa82a8c7a1137f.png)

image.png
  • 第二步:
    第一种情况,还没有本地仓库(新建):从你自己的远程库clone,可采用ssh验证或者每次验证的方式。克隆后此项目的远程库默认为你自己的远程项目库。
![](https://upload-images.jianshu.io/upload_images/3629187-1102bce485994633.png)

image.png



![](https://upload-images.jianshu.io/upload_images/3629187-9fcc849fc40766f0.png)

image.png

第二种情况:已有本地仓库并且远程默认仓库origin指向的地址不是自己的远程库地址(目前大家都属于此中情况),直接修改origin远程地址即可。需要注意的是,请在切换的时候将所有代码更新并提交到原有中心库。修改origin远程库url地址使用:git remote set-url origin [url(远程库地址)]

澳门新萄京 11

image.png

  • 第三步:为项目添加同步中心远程库,然后pull对应的分支,同步项目的最新可用代码。
    使用命令 git remote add [name(远程库名字可任意取有意义的名字)] [url(远程库地址)]
    方法如下:
![](https://upload-images.jianshu.io/upload_images/3629187-8b55640a0822e6df.png)

image.png

前面的步骤除了代码同步以外其它都只要执行一次即可。

  • 第四步:修改代码,测试完成,提交代码,推送代码到自己的远程库。
![](https://upload-images.jianshu.io/upload_images/3629187-52193be35d67e5fd.png)

image.png

*第五步:当一个功能完成后,请求合并代码。登入GitLab,进入你fork出来的项目,点击左侧栏中的Merge Request,点击新增Merge Request,选择对应的远程库和对应的分支点击COMPARE BRANCHES按钮,添加相应的请求合并信息,点击提交即可。

澳门新萄京 12

image.png

git

澳门新萄京 13

image.png

澳门新萄京 14

image.png

澳门新萄京 15

image.png

需要注意的点,在发送请求合并的时候请务必将中心库中的代码合并到本地,并push到自己的远程库。

发送请求合并后请发送邮件或者及时通知我,通过代码检视后将合并你的代码,并发送通知给测试同事开始测试你的代码。

澳门新萄京 16

image.png

澳门新萄京 17image

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.dalaoyang</groupId> <artifactId>springboot_mail</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot_mail</name> <description>springboot_mail</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

项目环境

我直接使用的是我们项目环境来写的,使用ssm框架,所以呢dao层访问数据库的部分我就省略啦,这里大家直接使用原生的jdbc或者其他的orm框架都是没有问题的。好了,不多说啦,直接进入重点吧。

MailContentTypeEnum

这是一个我自定义的枚举类型,枚举类型包含了邮件内容的类型,目前我仅仅添加了两种,一种是html另外一种则是text形式,具体代码如下图9所示:

澳门新萄京 18

图9

这个小迷小量化系统,麻雀虽小但是五脏俱全,我们今天先从实时提醒这个模块做起,提醒系统分下面几个部分:

接下来是application.properties,里面包含发送邮箱的地址,账号密码,接信地址,由于只是测试,所以都是固定写死的,如果项目中需要,可以根据自行情况进行修改。

代码

PropertiesUtil

PropertiesUtil是用于读取*.properties配置文件的工具类,使用JavaMail需要配置SMTP以及用户名、密码等也就是MailEntity内的字段,那么我们在/resource目录下创建一个名字叫mail.properties的配置文件,里面存放我们定义的邮件发送参数配置,这样方便修改,我分别贴出PropertiesUtil、mail.properties代码内容,如下图10、图11所示:

澳门新萄京 19

图10

澳门新萄京 20

图11

我使用的QQ邮箱地址作为测试,如果你需要使用你的QQ地址作为测试,请先到QQ邮箱开启POP3/SMTP服务,开启步骤如下。

-实时获取股票数据-连接邮件服务器-预警配置管理-监控数据并发送邮件

##端口号server.port=8888##这里根据自己的情况填写##邮箱服务器地址##QQ smtp.qq.com##sina smtp.sina.cn##aliyun smtp.aliyun.com##163 smtp.163.comspring.mail.host=smtp.aliyun.com##邮箱用户名spring.mail.username=dalaoyang@aliyun.com##邮箱密码(注意:qq邮箱应该使用独立密码,去qq邮箱设置里面获取)spring.mail.password=******##编码格式spring.mail.default-encoding=UTF-8##发送邮件地址mail.fromMail.sender=dalaoyang@aliyun.com##接收邮件地址mail.fromMail.receiver=yangyang@dalaoyang.cn

1、实体类User

这里实体类和数据库是对应的,省略get和set方法以及构造器。

public class User {
    private Integer id;
    private  String username;
    private String password;
    private String email;
    /*
    * 0 未激活
    * 1 已激活
    * */
    private Integer state;
    /*
    * 激活码
    * */
    private String code;
}

开启POP3/SMTP

第一步:进入邮箱点击“设置”,如下图12所示:

澳门新萄京 21

Fork项目工作流程,SpringBoot邮件发送。图12

第二步:点击“账户”后往下拉找到POP3/IMAP/SMTP...,如下图13所示:

澳门新萄京 22

图13

我的POP3以及SMTP以及开启了所以这里显示的状态是已开启,如果您第一次使用QQ邮箱的SMTP服务,请点击“开启”并且按照提示步骤完成获取“授权码”即可,授权码就是发送邮件参数的smtp.pwd属性。

希望通过实时提醒,来提高交易的收益率,试试看,万一有用呢,反正写代码对码农来说,so easy!

然后先展示一下controller的完整代码:

2、注册界面

注册界面写的很简单啦,<form> <table>的组合,界面简单,只是为了测试。

<form action="/register" method="post">
    <table>
        <tr>
            <td>用户名:</td>
            <td><input type="text" id="username" name="username"></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="password"></td>
        </tr>
        <tr>
            <td>邮箱:</td>
            <td><input type="text" name="email"></td>
        </tr>
        <tr >
            <td aria-colspan="2"><input type="submit" value="注册"></td>
        </tr>
    </table>
</form>

测试发送邮件

我们创建一个TestMail类来作为测试入口,因为我们的项目是jar形式,所以我们直接新建一个main方法直接调用发送邮件就可以了,如下图14所示测试代码:

澳门新萄京 23

图14

我是向我的钉钉邮箱发送了一条文本类型的测试邮件,发送效果图如下图15所示:

澳门新萄京 24

图15

可以看到我们的邮件收到了,证明我们已经完成了邮件发送的功能了,但是你在发送中配置mail.properties文件时配置昵称的时候最有可能出现的问题就是乱码,那么该问题如何解决呢?

Fork项目工作流程,SpringBoot邮件发送。一.实时获取股票价格

package com.dalaoyang.controller;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.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.mail.MessagingException;import javax.mail.internet.MimeMessage;import java.io.File;/** * @author dalaoyang * @Description * @project springboot_learn * @package com.dalaoyang.controller * @email yangyang@dalaoyang.cn * @date 2018/4/10 */@RestControllerpublic class MailController { private final Logger logger = LoggerFactory.getLogger(this.getClass; @Value("${mail.fromMail.sender}") private String sender; @Value("${mail.fromMail.receiver}") private String receiver; @Autowired private JavaMailSender javaMailSender; /* * * @Description http://localhost:8888/sendMail * @author dalaoyang * @email 397600342@qq.com * @method 发送文本邮件 * @date * @param * @return */ @RequestMapping("/sendMail") public String sendMail() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom; message.setTo; message.setSubject; message.setText("你好你好你好!"); try { javaMailSender.send; logger.info("简单邮件已经发送。"); } catch (Exception e) { logger.error("发送简单邮件时发生异常!", e); } return "success"; } /* * * @Description http://localhost:8888/sendHtmlMail * @author dalaoyang * @email 397600342@qq.com * @method 发送html邮件 * @date * @param * @return */ @RequestMapping("/sendHtmlMail") public String testHtmlMail() { String content="<html>n"   "<body>n"   " <h3>hello world ! 这是一封Html邮件!</h3>n"   "</body>n"   "</html>"; MimeMessage message = javaMailSender.createMimeMessage(); try { //true表示需要创建一个multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject("html mail"); helper.setText(content, true); javaMailSender.send; logger.info("html邮件发送成功"); } catch (MessagingException e) { logger.error("发送html邮件时发生异常!", e); } return "success"; } /* * * @Description http://localhost:8888/sendFilesMail * @author dalaoyang * @email 397600342@qq.com * @method 发送附件邮件 * @date * @param * @return */ @RequestMapping("/sendFilesMail") public String sendFilesMail() { String filePath="/Users/dalaoyang/Downloads/article_tag.sql"; MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject; helper.setText("这是一封带附件的邮件", true); FileSystemResource file = new FileSystemResource(new File); String fileName = filePath.substring(filePath.lastIndexOf(File.separator)); helper.addAttachment(fileName, file); javaMailSender.send; logger.info("带附件的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送带附件的邮件时发生异常!", e); } return "success"; } /* * * @Description http://localhost:8888/sendInlineResourceMail * @author dalaoyang * @email 397600342@qq.com * @method 发送图片邮件 * @date * @param * @return */ @RequestMapping("/sendInlineResourceMail") public String sendInlineResourceMail() { String Id = "dalaoyang12138"; String content="<html><body>这是有图片的邮件:<img src='cid:"   Id   "' ></body></html>"; String imgPath = "/Users/dalaoyang/Downloads/dalaoyang.jpeg"; MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject("这是有图片的邮件"); helper.setText(content, true); FileSystemResource res = new FileSystemResource(new File; helper.addInline; javaMailSender.send; logger.info("嵌入静态资源的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送嵌入静态资源的邮件时发生异常!", e); } return "success"; }}

3、注册Controller

注册的功能还是一样的,把实体类封装存到数据库里,只不过在controller(也就是Servlet啦,spring MVC里面要叫controller)里面需要给用户设定激活状态State和激活码code。因为我使用的ssm框架,所以user帮我自动封装了,使用Servlet的小伙伴请手动封装。

@RequestMapping("/register")
    public String register(User user, ModelMap modelMap) throws Exception {
        //封装数据,默认状态为未激活
        user.setState(0);
        //设置激活码
        user.setCode(UUID.randomUUID().toString().replaceAll("-",""));
        System.out.println(user);

        //调用业务层处理数据
        userService.register(user);

        //页面跳转
        modelMap.addAttribute("msg","激活码已发送,请去邮箱激活账户");
        return "success";
    }

昵称乱码问题解决

第一步:修改InteiiJ IDEA工具的properties文件的编码,点击File->Setting->Editor->File Encodings将下面的Default encoding设置为UTF-8,如下图16所示:

澳门新萄京 25

图16

那么我们的mail.properties内使用ASCII编码进行配置昵称就可以了,具体中文如何转换ASCII,请大家访问tool.oschina.net/encode在线转换即可。修改完成后再次测试发送邮件,你就会发现乱码问题解决了。

为了更准确的获取股票的价格,我们这里用比较有名的金融库tushare来获取,里面封装了大量的股票的数据Api,非常好用!澳门新萄京 26image

然后一点一点来,本文分4种情况:1.发送简单的文本邮件

4、Service

Service层也就是对数据库的一些操作,我们要实现邮箱激活的功能需要进行的数据库操作有:添加一个用户,查询用户,修改用户。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public void register(User user) throws Exception {
        //将数据存入数据库
         userMapper.register(user);
         //发送一封激活邮件
        EmailUtil.sendEmailByLocal(user.getEmail(),user.getCode());
    }

    //查询该激活码对应的用户,并返回该用户
    @Override
    public User activeUser(String code) {
        return userMapper.activeUser(code);
    }

    //更新用户状态
    @Override
    public int updateUser(User user) {
        return userMapper.updateUser(user);
    }
}

总结

上述内容就是本章的所有讲解,本章主要讲解了在SpringBoot项目内是如何使用JavaMail来进行发送简单邮件,简单封装了下MailSender类以及对象实体MailEntity,如果需要发送HTML内容的邮件修改contentType(MailContentTypeEnum.HTML)然后content("html代码")即可。

本章代码已经上传码云:

SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

欢迎加入QQ技术交流群,共同进步。

澳门新萄京 27

QQ技术交流群

1).首先设计一个stock类,这个类第一件大事:查询股票的实时价格和k线数据比如(5min,15min),然后把数据返回出来,为了提高效率,我们肯定是用并发出来,所以start_run函数会成为一个线程函数

 /* * * @Description http://localhost:8888/sendMail * @author dalaoyang * @email yangyang@dalaoyang.cn * @method 发送文本邮件 * @date * @param * @return */ @RequestMapping("/sendMail") public String sendMail() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom; message.setTo; message.setSubject; message.setText("你好你好你好!"); try { javaMailSender.send; logger.info("简单邮件已经发送。"); } catch (Exception e) { logger.error("发送简单邮件时发生异常!", e); } return "success"; }

澳门新萄京,5、EmailUtil

重点部分来了,前面都是在给做铺垫,这个部分才是我今天想要分享的重点,如何发送给邮件,如果你使用163或者qq邮箱,请在邮箱设置里面开启smtp哟,这个我用的163邮箱,开启会让你设置授权码,授权码一定要记住呀,因为我们后面会用到。

澳门新萄京 28

sinnamm.png

请看一下代码。

public class EmailUtil {

    /**
     * 发件人的邮箱和密码
     * 某些邮箱服务器为了增加邮箱本身密码的安全性
    * 给SMTP,客户端设置了独立密码(有的邮箱称为“授权码”) 
    * 比如163,这里我用163邮箱测试的,
    * 设置了独立密码的邮箱,所以这里的邮箱密码必需使用这个独立密码
     **/
    public static String myEmailAccount = "******";
    public static String myEmailPassword = "********";
    /**
     *  发件人邮箱的 SMTP 服务器地址必须准确, 不同邮件服务器地址不同,
     *  网易163邮箱的 SMTP 服务器地址为: smtp.163.com
     */
    public static String myEmailSMTPHost = "smtp.163.com";


    /**
     * 使用别人家的邮箱服务器,例如163邮箱,qq邮箱等
     * @param to 给谁发邮件,也就是发送邮件的地址
     * @param code 激活码
     */
    public static void sendEmailByWeb(String to,String code) throws Exception {

        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证

        //2.创建链接对象,链接到邮箱服务器
        Session session = Session.getDefaultInstance(props);
        //这里是为了在控制台可以看到详细发送的信息
        session.setDebug(true);

        //3.创建邮件对象
        Message message = createMimeMessage(session,myEmailAccount,to,code);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
        //使用邮箱账号和密码连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
        transport.connect(myEmailAccount, myEmailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());
        // 7. 关闭连接
        transport.close();

    }


    /**
     * 使用自己本地的邮箱服务器,这里我用的是易邮邮箱服务器
     * @param to
     * @param code
     * @throws Exception
     */
    public static void sendEmailByLocal(String to,String code) throws Exception {

        //1、连接配置,本地不用配置
        Properties props = new Properties();
        //2、创建连接对象
        Session session = Session.getDefaultInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //这里是本地的邮箱账户和密码,域名可以在邮箱服务器自己设定
                return new PasswordAuthentication("server@sinnamm.con","server");
            }
        });
        //获取邮件对象
        Message message = createMimeMessage(session,"server@sinnamm.com",to,code);
        //发送邮件
        Transport.send(message);
    }

    /**
     * 创建邮件
     * @param session 和服务器交互的会话
     * @param sendMail 发件人邮箱
     * @param receiveMail 收件人邮箱
     * @return
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,String code) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 2. From: 发件
        message.setFrom(new InternetAddress(sendMail, "findlover", "UTF-8"));
        // 3. To: 收件人(可以增加多个收件人、抄送、密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "用户", "UTF-8"));
        // 4. Subject: 邮件主题
        message.setSubject("激活邮件", "UTF-8");
        // 5. Content: 邮件正文(可以使用html标签)
        message.setContent("<h1>请点击以下链接激活你的账号</h1>"  
                "<h3><a href='http://localhost:8080/ActiveServlet?code=" code "'>http://localhost:8080/ActiveServlet?code=" code "</a></h3>","text/html;charset=UTF-8");
        // 6. 设置发件时间
        message.setSentDate(new Date());
        // 7. 保存设置
        message.saveChanges();
        return message;
    }
}

在工具类中我写了两种发送邮件的方法

  • 直接使用163邮箱或者qq邮箱来进行发送,这个需要在邮箱的设置里面开启smtp这个选项,不然不能发送。
  • 本地下载安装易邮邮箱服务器,然后新建几个邮箱账号就可以当我们的测试邮箱了。对了,这里还需要使用邮箱客户端,我用的是Foxmail客户端,把本地的账号添加进去就可以接收邮件了。在本地测试,写这个的原因是为了方便测试啦,总觉得本地的东西比联网方便。

2).第二件大事:我们获取的实时的数据,需要传递给外边的模块调用,子线程和主线程间通信的话,最简单的方法用queue来搞定,所以我们stock类会init里面传入一个queue

访问

6、激活controller

最后一步啦,邮箱已经成功发送了,剩下的就是激活啦。用户点击链接会将请求发送给我们的Servlet来进行处理

 @RequestMapping("/ActiveServlet")
    public String ActiveServlet(@Param("code")String code,ModelMap modelMap) throws Exception {
        //接收激活码,Spring MVC封装好了

        //根据激活码查询用户
        User user = userService.activeUser(code);
        //查询到用户,修改用户的状态
        if (user!=null){
            //查询到用户
            user.setState(1);
            user.setCode(null);
            //更新用户信息
            userService.updateUser(user);
            modelMap.addAttribute("msg","激活成功,请登录");
            return "success";
        }else {
            //激活码没有查询到该用户
            modelMap.addAttribute("msg","激活码失效,请重新获取");
            return "success";
        }

    }

这样一个简单的邮件激活就写完啦,写这么多其实重点只有发送邮件工具类的编写上,其他的都是一些注册代码和用户信息的处理。读者们测试的时候可以直接写工具类里面的内容就可以了,一样能发送成功!

是不是简单呢,是的没错,赶快动手操作一下吧。

澳门新萄京 29

sinnamm.jpg

3).控制线程:这个stock我们希望外边能控制它的运行和停止,在stock类的入口,我们加入了一个_terminal变量

澳门新萄京 30image

4).神奇的tushare库利用tushare这个神奇的API,构造两个类函数分布query_stock_real_price和get_kline_data获取数据:

2.发送html邮件

def query_stock_real_price: df = ts.get_realtime_quotes(self.stock_num) df=df[['price','time']] price=df['price'].values[0] time=df['time'].values[0] return price,time def get_kline_data(self, ktype='ma5'): today=datetime.now().strftime('%Y-%m-%d') df = ts.get_hist_data(self.stock_num, start='2018-08-08', end=today) return (df[[ktype]])
/* * * @Description http://localhost:8888/sendHtmlMail * @author dalaoyang * @email yangyang@dalaoyang.cn * @method 发送html邮件 * @date * @param * @return */ @RequestMapping("/sendHtmlMail") public String testHtmlMail() { String content="<html>n"   "<body>n"   " <h3>hello world ! 这是一封Html邮件!</h3>n"   "</body>n"   "</html>"; MimeMessage message = javaMailSender.createMimeMessage(); try { //true表示需要创建一个multipart message MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject("html mail"); helper.setText(content, true); javaMailSender.send; logger.info("html邮件发送成功"); } catch (MessagingException e) { logger.error("发送html邮件时发生异常!", e); } return "success"; }

二.邮件系统

访问

简单实时提醒系统,我们用邮件,比如你的qq邮箱,是可以实时的收到一些邮件提醒的信息,我们这里用Python自带的 SMTP和EMAIL模块处理:

澳门新萄京 31image

1). 连接邮件服务器

3.发送附件邮件

澳门新萄京 32image

/* * * @Description http://localhost:8888/sendFilesMail * @author dalaoyang * @email yangyang@dalaoyang.cn * @method 发送附件邮件 * @date * @param * @return */ @RequestMapping("/sendFilesMail") public String sendFilesMail() { String filePath="/Users/dalaoyang/Downloads/article_tag.sql"; MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject; helper.setText("这是一封带附件的邮件", true); FileSystemResource file = new FileSystemResource(new File); String fileName = filePath.substring(filePath.lastIndexOf(File.separator)); helper.addAttachment(fileName, file); javaMailSender.send; logger.info("带附件的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送带附件的邮件时发生异常!", e); } return "success"; }

为了方便扩展和复用,也用一个类来封装邮件server!构造一些邮件服务器的地址和密码,然后连接就可以了,非常简单。

访问

2).构造邮件内容

澳门新萄京 33image

服务器连接好了,之后我们需要发送邮件,需要写一个邮件标题和内容,比如 xx股票,现在价格多少之类的。澳门新萄京 34image

4.发送图片邮件

1).为了更好的封装数据,用类装饰器对titel和content进行封装,这样外边无法直接访问这两块内容。

 /* * * @Description http://localhost:8888/sendInlineResourceMail * @author dalaoyang * @email yangyang@dalaoyang.cn * @method 发送图片邮件 * @date * @param * @return */ @RequestMapping("/sendInlineResourceMail") public String sendInlineResourceMail() { String Id = "dalaoyang12138"; String content="<html><body>这是有图片的邮件:<img src='cid:"   Id   "' ></body></html>"; String imgPath = "/Users/dalaoyang/Downloads/dalaoyang.jpeg"; MimeMessage message = javaMailSender.createMimeMessage(); try { MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom; helper.setTo; helper.setSubject("这是有图片的邮件"); helper.setText(content, true); FileSystemResource res = new FileSystemResource(new File; helper.addInline; javaMailSender.send; logger.info("嵌入静态资源的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送嵌入静态资源的邮件时发生异常!", e); } return "success"; }

2).mail类会初始化一些信息,比如要发送到邮件地址,而且要把前面构造好的SMTP服务器对象传进来,方便发送邮件。澳门新萄京 35image

访问

3).初始化一个MIMEText对象,填充一些邮件的内容比如from,to,subject等等。为了有时间性,我们在邮件的开头加一个时间戳。

澳门新萄京 36image

三.预警系统我们需要有一个配置文件,里面不停的修改我们对股票的价格的设置,比如到了你的止损或者止盈的位置,或者到了你的一些量化策略的地方,需要提醒你注意等等。这里我们只是简单的说明,只写最大和最小的股价预警,示例一下:

源码下载 :大老杨码云

setting 文件:{"high_price": 15,"low_price": 10}1).死循环监控数据

我们启动一个线程,用一个死循环来不停的从队列里面获取股票的数据,然后进行一些监听的逻辑判断,先看一下核心代码:澳门新萄京 37image

因为股票有交易时间,我们这里简单粗暴的让程序只在交易时间运行,当然如果要把程序放在远端服务器上的话,需要进一步优化,不然每一天都要启动一下!

死循环里面会不停的读区预警设置里面的股价的涨到多少最高价和最低价,一旦触达这个价格,立刻发送邮件提醒!

写了这么久,看一下效果吧:澳门新萄京 38image

好了,上面是一个简单的股票实时提醒程序,利用了一些Python自带的邮件库和一个金融库,算是一个综合小练习!,完成一个量化系统,还有两个重要的功能没有完成,需要继续加油,欢迎大家留言讨论。

本文由澳门新萄京发布于www.澳门新萄京赌场,转载请注明出处:Fork项目工作流程,SpringBoot邮件发送

上一篇:澳门新萄京在线服务,SpringBoot文件上传下载 下一篇:没有了
猜你喜欢
热门排行
精彩图文