前言

这个前台用的框架比较小众,是H-ui,参考的时候可以适当忽略页面,重点放在js上就行了

框架用的是springboot

导入相关依赖

<!--邮件发送-->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.5</version>
</dependency>

在springboot中配置MultipartResolver

注:这里是因为我使用了Spring的MultipartFile来接受文件上传才要配置的

//配置文件上传
@Bean(name = "multipartResolver")
public MultipartResolver multipartResolver() {
    CommonsMultipartResolver resolver = new CommonsMultipartResolver();
    resolver.setDefaultEncoding("UTF-8");
    // resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常
    resolver.setResolveLazily(true);
    resolver.setMaxInMemorySize(40960);
    // 上传文件大小 5G
    resolver.setMaxUploadSize(5 * 1024 * 1024 * 1024);
    return resolver;
}

前台和js

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>邮件发送</title>

        <link rel="stylesheet" type="text/css" href="../static/h-ui/css/H-ui.min.css" />
        <link rel="stylesheet" type="text/css" href="../static/lib/Hui-iconfont/1.0.9/iconfont.css" />

        <style>
            body{
                background-color: #F0F2F5;
            }
            .container{
                padding: 20px;
            }
            .panel{
                background-color: white;
            }
            .panel-body div{
                //border:1px dashed #000;
            }
            textarea{
                overflow: hidden;
                resize: none;
            }
        </style>

    </head>
    <body>

        <div class="container">

            <div class="panel mt-20">
                <div class="panel-body">

                    <legend>收件人列表</legend>

                    <div class="mt-20 clearfix">
                        <table class="table table-border table-bordered table-bg table-sort">
                            <thead>
                                <tr class="text-c">
                                    <th width="70">供应商编号</th>
                                    <th width="80">供应商名称</th>
                                    <th width="150">公司地址</th>
                                    <th width="120">业务范围</th>
                                    <th width="120">负责人</th>
                                    <th width="120">负责人联系方式</th>
                                    <th width="100">邮箱</th>
                                </tr>
                            </thead>
                            <tbody>

                                <tr class="text-c">
                                    <td>1</td>
                                    <td>金坷垃化肥有限公司</td>
                                    <td>圣地亚哥</td>
                                    <td>金坷垃化肥及相关农业产品生经营生产</td>
                                    <td>王二狗</td>
                                    <td>12345678901</td>
                                    <td class="sup-email">[email protected]</td>
                                </tr>

                                <tr class="text-c">
                                    <td>2</td>
                                    <td>金坷垃化肥有限公司</td>
                                    <td>圣地亚哥</td>
                                    <td>金坷垃化肥及相关农业产品生经营生产</td>
                                    <td>王二狗</td>
                                    <td>12345678901</td>
                                    <td class="sup-email">[email protected]</td>
                                </tr>
                            </tbody>
                        </table>

                    </div>
                </div>
            </div>

            <div class="panel mt-20">
                <div class="panel-body">

                    <legend>填写邮件</legend>

                    <div class="form form-horizontal" id="form-article-add">

                        <div class="row clearfix">
                            <label class="form-label col-sm-2"><span class="c-red">*</span>邮件标题:</label>
                            <div class=" col-sm-7">
                                <input type="text" class="input-text radius size-M" id="mailtitle" name="mailtitle" placeholder="请输入邮件标题">
                            </div>
                        </div>

                        <div class="row clearfix">
                            <label class="form-label col-sm-2"><span class="c-red">*</span>文件上传:</label>

                            <div class="col-sm-7">
                                <input type="text" class="input-text radius" id="fileurl" readonly="readonly" placeholder="请上传附件">
                            </div>

                            <div class="col-sm-2">
                                <span class="btn-upload">
                                    <a href="javascript:void();" class="btn btn-primary radius btn-upload"><i class="Hui-iconfont">&#xe642;</i> 浏览文件</a>
                                    <input type="file" multiple name="file_0" id="input-file" class="input-file" onchange="getFileUrl()">
                                </span>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <label class="form-label col-sm-2">邮件内容:</label>
                            <div class="form-controls col-sm-7">
                                <textarea class="textarea textarea-article radius" id="content" placeholder="请输入邮件内容"></textarea>
                            </div>
                        </div>

                        <div class="row clearfix">
                            <div class="col-md-3 col-offset-2">
                                <button class="btn btn-block btn-primary radius" onclick="uplaodFile()">上传</button>
                            </div>

                            <div class="col-md-3 col-offset-1">
                                <button class="btn btn-block btn-danger radius" onclick="closeLoadtip()">取消</button>
                            </div>
                        </div>

                    </div>

                </div>
            </div>

        </div>

    </body>

</html>
<script type="text/javascript" src="../static/lib/jquery/1.9.1/jquery.js"></script>
<script type="text/javascript" src="../static/h-ui/js/H-ui.js"></script>
<script type="text/javascript" src="../static/lib/layer/3.1.1/layer.js"></script>
<script type="text/javascript">

    /*获取文件上传路径并放入文本框*/
function getFileUrl() {
    var FileInput = document.getElementById("input-file");
    var FileUrlInput = document.getElementById("fileurl");
    FileUrlInput.value = FileInput.value;
}

/*文件上传*/
function uplaodFile() {

    //获取商家的email列表
    var mailList = ";";
    $(".sup-email").each(function(){
        mailList=mailList+ $(this).text()+";";
    });

    //将上传组件添加进临时表单
    var form = new FormData();
    form.append("title",document.getElementById("mailtitle").value);
    if (document.getElementById("input-file").value != ""){
        form.append("file", document.getElementById("input-file").files[0]);
    }
    form.append("content",document.getElementById("content").value);
    form.append("email",mailList);
    //弹出加载提示
    loadtip();
    //提交表单
    $.ajax({
        url: "http://localhost:8080/mail_send",
        data: form,
        cache: false,
        async: false,
        type: "POST",
        dataType: 'json',
        processData: false,
        contentType: false,
        success: function (data) {
            //关闭加载提示
            closeLoadtip();
            var status = data["status"]
            if(status == "success"){
                layer.msg('邮件发送成功!');
            }else {
                layer.msg('"邮件发送失败!"');
            }
        },
        error: function (err) {
            console.log(err);
            layer.msg('"网络连接异常!"');
        }
    });
}

/*弹出加载提示层*/
var loadTipIndex;
function loadtip() {
    loadTipIndex = layer.load(1, {
        shade: [0.1,'#fff'] //0.1透明度的白色背景
    });
}

/*关闭加载提示层*/
function closeLoadtip() {
    layer.close(loadTipIndex);
}

</script>

controller(service)

注:嫌麻烦没写service,自己用的话最好老老实实写接口再实现

import com.sanyu.tender.util.mailSend.MailSend;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author:huang
 * @Date:2019-09-18 18:55
 * @Description:<描述>
 */
@Controller
public class sendMailController {

    @Autowired
    private MailSend mailSend;

    @RequestMapping("/mail_send_show")
    public String showSendMail(){
        return "mail-send";
    }

    //接受文件上传
    @RequestMapping("/mail_send")
    @ResponseBody
    public Map sendMail(String title,String content,String email,MultipartFile file){
        Map<String,Object> map = new HashMap<>(16);

        //获取地址字符串并截取放入集合
        ArrayList<String> list = new ArrayList<>();
        String[] emailArr = email.split(";");
        for (int i = 1;i<emailArr.length;i++){
            list.add(emailArr[i]);
        }

        map.put("status","success");
        try {
            mailSend.send(list,title,content,file);
        }catch (Exception e){
            e.getStackTrace();
            map.put("status","false");
        }
        return map;
    }

}

javaMail邮件发送工具类代码

/**
 * @Author:huang
 * @Date:2019-09-17 20:29
 * @Description:邮件发送工具类
 */
@Component
public final class MailSend {

    //发件人账号和授权码
    private static final String MY_EMAIL_ACCOUNT = "[email protected]";
    private static final String MY_EMAIL_PASSWORD = "xxxx";

    //SMTP服务器(这里用的163 SMTP服务器)
    private static final String MEAIL_163_SMTP_HOST = "smtp.163.com";

    //端口号
    private static final String SMTP_163_PORT = "25";

    //message对象
    private MimeMessage message;

    {
        //创建发件邮箱对象
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.host", MEAIL_163_SMTP_HOST);
        properties.setProperty("mail.smtp.port", SMTP_163_PORT);
        properties.setProperty("mail.smtp.socketFactory.port", SMTP_163_PORT);
        properties.setProperty("mail.smtp.auth", "true");
        properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
        //登录
        Session session = Session.getInstance(properties, new Authenticator() {
            // 设置认证账户信息
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(MY_EMAIL_ACCOUNT, MY_EMAIL_PASSWORD);
            }
        });
        session.setDebug(false);

        //创建邮件对象
        System.out.println("创建发件人邮箱");
        message = new MimeMessage(session);
    }

    /**
     * 发送邮件
     * @param to 收件人邮箱的集合
     * @param title 邮件标题
     * @param content 邮件内容
     * @param file 通过表单上传的MultipartFile文件
     * @return 根据方法执行情况返回一个Boolean类型的值
     */
    public boolean send(ArrayList<String> to, String title, String content,MultipartFile file){
        File tempFile = null;

        try {
            //发件人
            message.setFrom(new InternetAddress(MY_EMAIL_ACCOUNT));
            //收件人
            setAccepter(to);
            //标题
            message.setSubject(title);

            //当存在附件的情况下,内容将和附件一起上传
            if (file != null){
                //添加附件和内容
                tempFile = getFile(file);
                setMultipartAndContent(tempFile,content);
            }else {
                //内容
                message.setContent(content, "text/html;charset=UTF-8");
            }

            //发送时间
            message.setSentDate(new Date());
            message.saveChanges();
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }

        //发送邮件
        System.out.println("准备发送");
        try {
            Transport.send(message);

            //当存在附件的情况下发送完邮件以后删除上传到服务器的文件
            if (file != null){
                deleteServerFile(tempFile);
            }

        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("发送失败");
            return false;
        }
        System.out.println("发送完成");
        return true;
    }

    /**
     * 添加收件人
     * @param list 存放收件人邮箱的集合
     */
    private void setAccepter(ArrayList<String> list){
        //创建收件人地址数组
        InternetAddress[] sendTo = new InternetAddress[list.size()];
        //把list中的数据转至数组
        for (int i = 0; i < list.size(); i++) {
            //System.out.println("发送到:" + list.get(i));
            try {
                sendTo[i] = new InternetAddress(list.get(i));
            } catch (AddressException e) {
                e.printStackTrace();
                return;
            }
        }
        //填入message对象
        try {
            message.setRecipients(MimeMessage.RecipientType.TO,sendTo);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置附件和内容(当存在附件的情况下,必须通过此方法以发送内容,否则只显示附件而不显示内容)
     * @param file 要添加到message对象的文件
     * @param content 要添加到message对象的内容
     */
    private void setMultipartAndContent(File file,String content) {
        // 一个Multipart对象包含一个或多个BodyPart对象,来组成邮件的正文部分(包括附件)。
        MimeMultipart multiPart = new MimeMultipart();

        //内容模块
        MimeBodyPart partText = new MimeBodyPart();
        // 文件模块
        MimeBodyPart partFile = new MimeBodyPart();
        try {
            //添加内容
            partText.setContent(content,"text/html;charset=UTF-8");
            //添加文件
            partFile.attachFile(file);
            // 设置在收件箱中和附件名 并进行编码以防止中文乱码
            partFile.setFileName(MimeUtility.encodeText(file.getName()));

            multiPart.addBodyPart(partText);
            multiPart.addBodyPart(partFile);
            message.setContent(multiPart);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

    /**
     * 将通过表单上传的MultipartFile文件上传到服务器并转换为File
     * @param file 通过表单上传的MultipartFile文件
     * @return 返回上传到服务器并转换完成的文件
     */
    private File getFile(MultipartFile file){
        //得到MultipartFile文件
        MultipartFile multipartFile = file;
        File f = null;

        //创建文件
        System.out.println("上传文件:"+multipartFile.getOriginalFilename());
        f = new File(multipartFile.getOriginalFilename());

        //得到文件流。以文件流的方式输出到新文件
        try (InputStream in  = multipartFile.getInputStream(); OutputStream os = new FileOutputStream(f)){
            // 可以使用byte[] ss = multipartFile.getBytes();代替while
            int n;
            byte[] buffer = new byte[4096];
            while ((n = in.read(buffer,0,4096)) != -1){
                os.write(buffer,0,n);
            }
            BufferedReader bufferedReader = new BufferedReader(new FileReader(f));
            bufferedReader.close();
        }catch (IOException e){
            e.printStackTrace();
        }

        //输出file的URL
        try {
            System.out.println(f.toURI().toURL().toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        //输出文件的绝对路径
        System.out.println(f.getAbsolutePath());

        return new File(f.toURI());
    }

    /**
     * 删除文件
     * @param file 要删除的文件
     * @return 根据方法执行情况返回一个Boolean类型的值
     */
    private boolean deleteServerFile(File file){
        return file.delete();
    }

}
01-19 00:53