邮件管理模块

邮件管理:模块功能需求文档

一、发纯文本邮件

1.首页界面要有链接跳转到邮件管理界面,用户还可以返回首页。
2. 用户可以随意配置目标邮箱地址。
3. 用户可以随意编写文本内容,文本内容不超过200字。
4. 用户可以邮件管理页面选择任意功能进行发送邮件。
5. 点击发送按钮

二、发附件邮件(随意选本地的附件、中文名不能乱码)

  1. 用户可以随意配置目标邮箱地址。
  2. 用户可以随意选本地电脑的附件发送。
  3. 用户可以邮件管理页面选择任意功能进行发送邮件。
  4. 点击发送按钮

三、发图片邮件(随意选本地的图片、中文名不能乱码)

  1. 用户可以随意选本地的图片发送。
  2. 随意发送到指定邮箱
  3. 用户可以邮件管理页面选择任意功能进行发送邮件。
  4. 点击发送按钮

四、发模版邮件

  1. 用户可以选择一个已存在的模板发送邮件。
  2. 随意发送到指定邮箱
  3. 用户可以邮件管理页面选择任意功能进行发送邮件。
  4. 点击发送按钮

五、定时发送邮件(比如:每日中午12点调用邮件发送任务发送邮件)

  1. 用户可以设置定时发送邮件的时间。
  2. 在设定的时间到达时,自动调用邮件发送任务发送邮件。
  3. 随意发送到指定邮箱
  4. 用户可以邮件管理页面选择任意功能进行发送邮件。
  5. 点击发送按钮

邮件管理页面代码如下:

<!--邮件功能主页-->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件管理</title>
    <link href="/user/css/emailTemplate.css" rel="stylesheet">
    <script th:src="@{/assets/js/jquery.min.js}"></script>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 20px;
        }
        header {
            background-color: #333;
            color: #fff;
            padding: 10px;
            text-align: center;
        }
        h1 {
            text-align: center;
        }
        .btn-panel{
            list-style-type: none;
            padding: 0;
            margin: 0;
            text-align: center;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        button {
            display: inline-block;
            margin: 10px;
            padding: 10px;
            border-radius: 5px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }
        button.selected{
            background-color: #0066ff;
        }
    </style>
    <script>
        function show(c){
            location.href='index?page='+c;
        }

        function val(id){
            return trim($('#'+id).val());
        }


        function trim(str) {
            return str.replace(/(^\s*)|(\s*$)/g, '');
        }

        function isEmail(v){
            let reg = /^[a-zA-Z0-9]+([-_.][A-Za-zd]+)*@([a-zA-Z0-9]+[-.])+[A-Za-zd]{2,5}$/
            return reg.test(v);
        }
        window.onload=function(){
            let message='[[${message}]]';
            if(message!='')
                alert(message);
        }
    </script>
</head>
<body>
<header>
    <h1>邮箱界面</h1>
</header>
<div class="btn-panel">
    <button onclick="show(1)" th:class="${page=='1'?'selected':''}">发纯文本邮件</button>
    <button onclick="show(2)" th:class="${page=='2'?'selected':''}">发附件邮件</button>
    <button onclick="show(3)" th:class="${page=='3'?'selected':''}">发图片邮件</button>
    <button onclick="show(4)" th:class="${page=='4'?'selected':''}">发模板邮件</button>
    <button onclick="show(5)" th:class="${page=='5'?'selected':''}">发定时邮件</button>
</div>

<div class="page-content" th:switch="${page}">
    <th:block th:case="'1'" th:include="client/email/text"></th:block>
    <th:block th:case="'2'" th:include="client/email/attach"></th:block>
    <th:block th:case="'3'" th:include="client/email/image"></th:block>
    <th:block th:case="'4'" th:include="client/email/template"></th:block>
    <th:block th:case="'5'" th:include="client/email/schedule"></th:block>
    <th:block th:case="*">
        <div  style="text-align: center;padding:20px;">请选择功能</div>

    </th:block>
</div>
<a href="/"><input type="button" value="返回首页"></a>
</body>
</html>

邮件管理界面的效果图如下:

在这里插入图片描述

创建一个css文件及内容如下:

body {
    font-family: Arial, sans-serif;
    background-color: #f0f0f0;
}

h2 {
    color: #333;
    text-align: center;
}

form {
    width: 50%;
    margin: 0 auto;
    padding: 20px;
    background-color: #fff;
    border: 1px solid #ccc;
    border-radius: 5px;
}

input[type="text"], textarea {
    width: 100%;
    padding: 5px;
    border: 1px solid #ccc;
    border-radius: 3px;
}

button {
    display: block;
    width: 100%;
    margin-top: 10px;
    padding: 5px 10px;
    background-color: #4CAF50;
    color: white;
    border: none;
    border-radius: 3px;
    cursor: pointer;
}

发纯文本邮箱方法类代码如下:

 //发送纯文本
    @PostMapping("/sendText")
    private String sendTextEmail(@RequestParam("to") String to,
                                 @RequestParam("subject") String subject,
                                 @RequestParam("content") String content,
                                 HttpServletRequest request) {

        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setFrom(emailfrom);
        mailMessage.setTo(to);
        mailMessage.setSubject(subject);
        mailMessage.setText(content);

        String message=null;
        try {
            //发送邮件
            mailSender.send(mailMessage);
            message="纯文本邮件发送成功";
        } catch (MailException e) {
            message="纯文本邮件发送失败 " + e.getMessage();
            System.out.println(message);
            e.printStackTrace();
        }

        request.setAttribute("message",message);
        return index(request);
    }

标题纯文本前端代码如下:

<!--纯文本邮件-->
<script>
    function checkform(){
        let address=val('to');
        if(address==''){
            alert('请输入邮箱地址');
            return false;
        }
        if(!isEmail(address)){
            alert('邮箱格式不正确');
            return false;
        }
        if(val('subject')==''){
            alert('邮件主题不能为空');
            return false;
        }
        let content=val('content');
        if(content==''){
            alert('请输入文本内容');
            return false;
        }
        if(content.length>200){
            alert('文本内容不能超过200个字');
            return false;
        }
        return true;
    }

</script>
<form method="post" th:action="@{/email/sendText}" onsubmit="return checkform();">
    <input type="hidden" name="page" value="1"/>
    <div>
        <label for="to">邮箱地址(收件人):</label>
        <input id="to" name="to"  type="text">
    </div>

    <div>
        <label for="subject">邮件主题:</label>
        <input id="subject" name="subject"  type="text">
    </div>

    <div>
        <label for="content">邮件内容:</label>
        <textarea cols="50" name="content" id="content" rows="10"></textarea>
    </div>

    <button type="submit">发送邮件</button>
</form>

纯文本效果图如下:

在这里插入图片描述

发附件邮件方法类代码如下:

//发送上传附件
    @PostMapping("sendAttachment")
    public String sendAttachment(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws MessagingException {

        String dirName="D:\\file\\";
        String fileName = file.getOriginalFilename();
        File uploadDir = new File(dirName);
        if (!uploadDir.exists())
            uploadDir.mkdirs();
        String path = dirName + fileName;
        // 新建一个文件
        File tempFile = new File(path);
        try {
            // 将上传的文件写入新建的文件中
            file.transferTo(tempFile);
        } catch (Exception e) {
            request.setAttribute("message","上传文件存储失败 "+e.getMessage());
            e.printStackTrace();
        }

        //-------发送邮件附件
        MimeMessage message=mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true,"UTF-8");
        helper.setFrom(emailfrom);
        helper.setTo(request.getParameter("to"));
        helper.setSubject(request.getParameter("subject"));
        helper.setText("");
        helper.addAttachment(fileName,tempFile);
        String result;
        try {
            //发送邮件
            mailSender.send(message);
            result="附件邮件发送成功";
        } catch (MailException e) {
            result="附件邮件发送失败 " + e.getMessage();
            System.out.println(result);
            e.printStackTrace();
        }
        request.setAttribute("message",result);
        return index(request);
    }

附件前端代码如下:

<!--附件邮件-->
<script>
    let filesize=-1;
    let maxsize=10*1024*1024;//最大文件大小 10M
    function checkform(){
        console.log('1111');
        let address=val('to');
        if(address==''){
            alert('请输入邮箱地址');
            return false;
        }
        if(!isEmail(address)){
            alert('邮箱格式不正确');
            return false;
        }
        if(val('subject')==''){
            alert('邮件主题不能为空');
            return false;
        }
        let file=$('#file')[0];
        if(file.value==''||filesize==-1){
            alert('请选择一个附件');
            return false;
        }
        //获取文件扩展名
        let ext=file.value;
        ext=ext.lastIndexOf('.')<0?ext:(ext.substring(ext.lastIndexOf('.')+1));
        ext=ext.toLowerCase();
        if(ext!='txt' && ext!='doc' && ext!='pptx')
        {
            alert('请选择正确的附件类型,比如:.text、.doc、.pptx');
            return false;
        }
        if(filesize>maxsize){
            alert('附件大小不能超过10M');
            return false;
        }

        return true;
    }

    //获取上传文件大小
    function filechange(e){
        filesize=e.target.files[0].size;
    }

</script>
<form method="post" th:action="@{/email/sendAttachment}" onsubmit="return checkform();" enctype="multipart/form-data">
    <input type="hidden" name="page" value="2"/>
    <div>
        <label for="to">邮箱地址(收件人):</label>
        <input id="to" name="to"  type="text">
    </div>

    <div>
        <label for="subject">邮件主题:</label>
        <input id="subject" name="subject"  type="text">
    </div>

    <div>
        <label for="content">附件:</label>
        <input id="file" name="file"  type="file" onchange="filechange(event)">
    </div>

    <button type="submit">发送邮件</button>
</form>

附件前端效果图如下:

在这里插入图片描述

发图片邮件方法类代码如下:

//发送图片
    @PostMapping("sendImage")
    public String sendImage(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws MessagingException {

        String dirName="D:\\file\\tupan\\";
        String fileName = file.getOriginalFilename();
        File uploadDir = new File(dirName);
        if (!uploadDir.exists())
            uploadDir.mkdirs();
        String path = dirName + fileName;
        // 新建一个文件
        File tempFile = new File(path);
        try {
            // 将上传的文件写入新建的文件中
            file.transferTo(tempFile);
        } catch (Exception e) {
            request.setAttribute("message","图片文件存储失败 "+e.getMessage());
            e.printStackTrace();
        }
        //-------发送邮件图片
        MimeMessage message=mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(emailfrom);
        helper.setTo(request.getParameter("to"));
        helper.setSubject(request.getParameter("subject"));

        String fileKey=System.currentTimeMillis()+"";
        String html="<img src=\"cid:"+fileKey+"\"/>"; //邮件内容 为html, filekey必须跟下面的图片对应
        helper.setText(html,true);
        helper.addInline(fileKey,tempFile); //file key对应图片文件

        String result;
        try {
            //发送邮件
            mailSender.send(message);
            result="图片邮件发送成功";
        } catch (MailException e) {
            result="图片邮件发送失败 " + e.getMessage();
            System.out.println(result);
            e.printStackTrace();
        }
        request.setAttribute("message",result);
        return index(request);
    }

发图片前端代码如下:

<!--图片邮件-->
<script>
    let filesize=-1;
    let maxsize=1*1024*1024;//最大文件大小 1M
    function checkform(){
        let address=val('to');
        if(address==''){
            alert('请输入邮箱地址');
            return false;
        }
        if(!isEmail(address)){
            alert('邮箱格式不正确');
            return false;
        }
        if(val('subject')==''){
            alert('邮件主题不能为空');
            return false;
        }
        let file=$('#file')[0];
        if(file.value==''||filesize==-1){
            alert('请选择一个图片');
            return false;
        }
        //获取文件扩展名
        let ext=file.value;
        ext=ext.lastIndexOf('.')<0?ext:(ext.substring(ext.lastIndexOf('.')+1));
        ext=ext.toLowerCase();
        if(ext!='jpg' /*&& ext!='gif' && ext!='png' && ext!='bmp' && ext!='jpeg'*/)
        {
            alert('请选择正确的图片类型,如:.jpg');
            return false;
        }
        if(filesize>maxsize){
            alert('图片大小不能超过1M');
            return false;
        }
        return true;
    }

    //获取上传文件大小
    function filechange(e){
        filesize=e.target.files[0].size;
    }

</script>
<form method="post" th:action="@{/email/sendImage}" onsubmit="return checkform();" enctype="multipart/form-data">
    <input type="hidden" name="page" value="3"/>
    <div>
        <label for="to">邮箱地址(收件人):</label>
        <input id="to" name="to"  type="text">
    </div>

    <div>
        <label for="subject">邮件主题:</label>
        <input id="subject" name="subject"  type="text">
    </div>

    <div>
        <label for="content">图片:</label>
        <input id="file" name="file"  type="file" onchange="filechange(event)">
    </div>

    <button type="submit">发送邮件</button>
</form>

发图片效果图如下:

在这里插入图片描述

发模版邮件方法类代码如下:

//加载模板
    @GetMapping("/template")
    public String loadTemplate(HttpServletRequest request){
        String name=request.getParameter("name");
        return "client/email/moban/"+name;
    }
    //发送模板邮件
    @PostMapping("sendTemplate")
    public String sendImage(HttpServletRequest request) throws MessagingException {

        //-------发送模板邮件
        MimeMessage message=mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(emailfrom);
        helper.setTo(request.getParameter("to"));
        helper.setSubject(request.getParameter("subject"));
        helper.setText(request.getParameter("content"),true);

        String result;
        try {
            //发送邮件
            mailSender.send(message);
            result="模板邮件发送成功";
        } catch (MailException e) {
            result="模板邮件发送失败 " + e.getMessage();
            System.out.println(result);
            e.printStackTrace();
        }
        request.setAttribute("message",result);
        return index(request);
    }

发模版前端代码如下:

<!--模板邮件-->
<script>
    function checkform(){
        let address=val('to');
        if(address==''){
            alert('请输入邮箱地址');
            return false;
        }
        if(!isEmail(address)){
            alert('邮箱格式不正确');
            return false;
        }
        if(val('subject')==''){
            alert('邮件主题不能为空');
            return false;
        }

        let editor=$('#templateEditor');
        let empty=false;
        let value='';
        editor.find("input").each(function(){
            if($(this).val()==''){
                empty=true;
                //模板内的输入没有填写
            }else
                value=$(this).val();
        });
        if(empty){
            alert('请输入用户姓名');
            return false;
        }

        let html=editor.data('template');
        html=html.replaceAll('$input',value);
        $('#content').val(html);

        return true;
    }

    //加载模板
    function loadTemplate(name){
        if(name=='') return;
        $.get('/email/template?name='+name,function(html){
            let html2=html.replaceAll('$input',"<input type='text'/>");
            $('#templateEditor').html(html2).data('template',html)//设置编辑区的html内容
        });
    }

    $(function(){
        loadTemplate('resume');
    })

</script>
<form method="post" th:action="@{sendTemplate}" onsubmit="return checkform();">
    <input type="hidden" name="page" value="4"/>
    <input type="hidden" id="content" name="content" />
    <div>
        <label for="to">邮箱地址(收件人):</label>
        <input id="to" name="to"  type="text">
    </div>

    <div>
        <label for="subject">邮件主题:</label>
        <input id="subject" name="subject"  type="text">
    </div>

    <div style="text-align: center">模板内容编辑</div>
    <div id="templateEditor" style="border:2px solid #aaa;height: 500px;padding:30px;" contenteditable="false"><div style="height: 100%;color:#9999;display: flex;align-items: center;justify-content: center">请选择模板</div></div>
    <button type="submit">发送邮件</button>
</form>

发模版内容前端代码如下:

<!--模板-->
欢迎 加入我们公司
<table border="1" style="width:500px;">
    <tr>
        <td width="100">
            姓名
        </td>
        <td>$input</td>
    </tr>
    <tr>
        <td>
            职位
        </td>
        <td>会牌设计</td>
    </tr>
    <tr>
        <td>
            职称
        </td>
        <td>设计师</td>
    </tr>
    <tr>
        <td>
            部门
        </td>
        <td>宣传部</td>
    </tr>
</table>
<p>
    希望在未来的日子里,携手共进!
</p>

发模版邮件效果图如下:

在这里插入图片描述
在这里插入图片描述

定时邮件发送步骤

  1. 邮件发送工具类实现:创建一个用于邮件发送服务的工具类MailUtils,并编写一个发送简单邮件的方法
  2. 邮件定时发送调度实现:创建一个定时任务管理类ScheduleTask,并编写了定时调度方法sendEmail(),并通过“@Scheduled(cron = ”0 0 12 1 * ?“)”注解指定了在每月1日中午12点调用邮件发送任务发送邮件。(具体代码见“发定时邮件方法类”)
  3. 开启基于注解的定时任务:在项目启动类上使用@EnableScheduling注解开启基于注解的定时任务支持。(具体代码见“开启基于注解的定时任务”)
  4. 效果展示(详情见附件)

1.邮件发送工具类实现

@Component
public class MailUtils {
    @Autowired
    private JavaMailSenderImpl mailSender;
    @Value("${spring.mail.username}")
    private String mailfrom;

    // 发送简单邮件
    public void sendSimpleEmail(String mailto, String title, String content) {
        //  定制邮件发送内容
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(mailfrom);
        message.setTo(mailto);
        message.setSubject(title);
        message.setText(content);
        // 发送邮件
        mailSender.send(message);
    }
}

2.发定时邮件方法类代码如下:

@Component
public class ScheduleTask {
    @Autowired
    private StatisticMapper statisticMapper;
    @Autowired
    private MailUtils mailUtils;
    @Value("${spring.mail.username}")
    private String mailto;

    /**
     * 定时邮件发送任务,每月1日中午12点整发送邮件
     */
    @Scheduled(cron = "0 0 12 1 * ?")
//    @Scheduled(cron = "0 */3 * * * ? ")
    public void sendEmail(){
        //  定制邮件内容
        long totalvisit = statisticMapper.getTotalVisit();
        long totalComment = statisticMapper.getTotalComment();
        StringBuffer content = new StringBuffer();
        content.append("博客系统总访问量为:"+totalvisit+"人次").append("\n");
        content.append("博客系统总评论量为:"+totalComment+"人次").append("\n");
        mailUtils.sendSimpleEmail(mailto,"个人博客系统流量统计情况",content.toString());
    }
}

3.开启基于注解的定时任务

@EnableScheduling  
@SpringBootApplication
public class BlogSystemApplication {
	...
}

附件

定时邮件展示如下:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值