springboot javamail_spring boot入门

springboot javamail_spring boot入门一、导入相关依赖在springboot中配置MultipartResolver注:使用了Spring的MultipartFile来接受文件上传才要配置的二、controller(service)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、导入相关依赖

<!--邮件发送-->
<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;
}

二、controller(service)

这里的接口接收的字符串格式为[xxxxx@qq.com;xxxxx@163.com]这样的,入参的形式随意,最后调用工具类传入数组即可

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 {
            //调用javaMail邮件发送工具类
            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 = "xxxx@163.com";
    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();
    }

}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170833.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 报SQL异常Parameter index out of range (1 > number of parameters, which is 0).「建议收藏」

    报SQL异常Parameter index out of range (1 > number of parameters, which is 0).「建议收藏」数据库错误:Parameterindexoutofrange(1>numberofparameters,whichis0).错误发生原因其实很简单,就是当设置参数时,没有相应的问号与之匹配(或者根本就没有?号).如果是:Parameterindexoutofrange(26>numberofparamet…

    2022年8月21日
    3
  • 分享一份适合练手的软件测试实战项目[通俗易懂]

    分享一份适合练手的软件测试实战项目[通俗易懂]最近,不少读者托我找一个能实际练手的测试项目。开始,我觉得这是很简单的一件事,但当我付诸行动时,却发现,要找到一个对新手友好的练手项目,着实困难。我翻了不下一百个web网页,包括之前推荐练手的政府网站(普遍会有bug),但依旧没能找到合适的。最后,在我苦苦的搜寻过程中,突然蹦跶出来一条引流广告,我随手点进去,误打误撞,发现了一个适合练手的web网页,因此推荐给还是测试新手的你。项目实战网站:吉屋网模块:房价链接:http://cd.jiwu.com/fangjia/项目简介:一个提供地区房价信

    2022年6月14日
    43
  • 网管员常用工具(二)「建议收藏」

    网管员常用工具(二)「建议收藏」EVERESTeverest中文版是一款系统硬件检测工具。everest中文版可以对上千种主板和硬件进行检测,可以有效地检测出用户电脑硬件的所有信息,尤其可以对各种型号处理器进行检测,让用户对自己电脑总体性能有个直观了解。HDTuneHDTunePro是一款小巧易用的硬盘工具软件,其主要功能有硬盘传输速率检测,健康状态检测,温度检测及磁盘表面扫描等。另外,还能检测出硬盘的固件版本、…

    2022年9月1日
    2
  • 用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!

    用Python做一个“以图搜番“的应用程序,再也不用愁动漫图片的出处了!文章目录前言PyQt5界面设计使用QtDesigner绘制界面视频部件插入小技巧解码器下载功能实现trace.moeAPI介绍与视频使用Nuitka打包成exe文件前言喜欢看动漫的朋友们大概都能体会到一个难受的事情,就是在论坛或者群聊里面看到一张动漫截图,很想知道它的出处,但百度搜了一圈却也没有一个可靠结果,就很郁闷。今天就来带大家用Python做一个简单的“以图搜番”小应用。应用本身的实现不是很难的事情,其实就是调用别人的API接口来实现,主要目的还是通过这个案例来学习以下内容:学习如何用Py

    2022年10月9日
    0
  • JMeter4.0的界面汉化

    JMeter4.0的界面汉化JMeter4.0的界面汉化

    2022年4月20日
    34
  • 如何盗微信号 除了验证码_微信2个好友验证码破解

    如何盗微信号 除了验证码_微信2个好友验证码破解光凭验证码就可以盗号!微信盗号新手段揭秘91.com移动互联网第一平台时间:2014-06-30[网站合作]快速评论分享到QQ好友新浪微博91娱乐目前有一种新型盗号方式即骗取用户手机验证码来盗取用户微信QQ等帐号,从而进一步盗取其中的微信银行账户、密码以及账单明细,所以平时疏忽大意的童鞋一定要小心谨慎噢。话说有一天,小编的微信忽然就收到了朋

    2022年4月19日
    102

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号