iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >springboot(java)使用javamail实现邮件的接收、转发、发送、清除
  • 507
分享到

springboot(java)使用javamail实现邮件的接收、转发、发送、清除

javaspringboot服务器 2023-09-24 05:09:12 507人浏览 薄情痞子
摘要

前言 最近在弄邮件相关的功能,被搞的头大,很多找的方法根本不知道该怎么往下走,就目前为止, 经过各种的碰壁和失败,就整理出来如何使用javamail实现邮件的接收、转发、发送、清除 不单单是分享,也为

前言

最近在弄邮件相关的功能,被搞的头大,很多找的方法根本不知道该怎么往下走,就目前为止,
经过各种的碰壁和失败,就整理出来如何使用javamail实现邮件的接收、转发、发送、清除
不单单是分享,也为我后续查找更方便做一个记录

邮件相关概念

在正式发送邮件之前,我们应该对邮件有一个概念

第一点:
我觉得也是最重要的,接收和发送的主机host端口port不一样的;我一开始的时候,并不懂;直接就不管是发送还是接收都用的一个主机host端口port

第二点:
接收邮件和发送邮件的协议不一样
发送邮件用的是SMTP,SMTP 即简单邮件传输协议,用于邮件发送。SMTP 认证,简单地说就是要求必须提供账户名和密码之后才可以登录 SMTP 服务器
接收邮件用的是POP3,
POP3协议允许电子邮件客户端下载服务器上的邮件,但是这个下载不会影响服务器本身的邮件

至于另外还有一个是IMAP 的协议,因为我这边并没有用到就不多说,感兴趣百度即可

导入依赖

用的是javamail,因此是需要导入javamail的Maven依赖包

        <dependency>            <groupId>javax.mailgroupId>            <artifactId>javax.mail-apiartifactId>            <version>1.5.5version>        dependency>        <dependency>            <groupId>com.sun.mailgroupId>            <artifactId>javax.mailartifactId>            <version>1.5.5version>        dependency>

邮件发送

    public void sendMail(String toEmail, String ccEmail, String bccEmail, String subject, String text, List<File> files) {        try {            System.setProperty("mail.mime.splitlongparameters", "false");            final JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();            javaMailSender.setUsername(username);            javaMailSender.setPassWord(password);            javaMailSender.setHost(host);            javaMailSender.setPort(port);            javaMailSender.setProtocol(protocol);            javaMailSender.setDefaultEncoding(defaultEncoding);            final Properties mailProperties = new Properties();            mailProperties.put("mail.smtp.auth", true);            mailProperties.put("mail.smtp.starttls.enable", true);            javaMailSender.setJavaMailProperties(mailProperties);            final MimeMessage mimeMessage = getMimeMessage(toEmail, ccEmail, bccEmail, subject, text, javaMailSender, files,senderName);            javaMailSender.send(mimeMessage);        } catch (MessagingException e) {            System.out.println("发送邮件失败:"+e.getMessage());        }    }    private MimeMessage getMimeMessage(String toEmail, String ccEmail, String bccEmail, String subject, String text,           JavaMailSenderImpl javaMailSender, List<File> files,String senderName) throws javax.mail.MessagingException {        MimeMessage mimeMessage = javaMailSender.createMimeMessage();        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");        mimeMessageHelper.setFrom(senderName);        mimeMessageHelper.setTo(toEmail.split(","));        if (!Strings.isNullOrEmpty(ccEmail)) {            mimeMessageHelper.setCc(ccEmail.split(","));        }        if (!Strings.isNullOrEmpty(bccEmail)) {            mimeMessageHelper.setBcc(bccEmail.split(","));        }        mimeMessageHelper.setSubject(subject);        mimeMessageHelper.setText(text, true);        try {            if (!CollectionUtils.isEmpty(files)) {                for (File file : files) {                    mimeMessageHelper.addAttachment(MimeUtility.encodeText(file.getName(), "GBK", "B"), file);                }            }        } catch (Exception e) {            System.out.println(e.getMessage());        }        return mimeMessage;    }

sendMail方法
我们在使用的时候直接调用sendMail方法即可
其中,各个参数含义如下:
toEmail: 发送到对应的邮箱
ccEmail:抄送到对应的邮箱
bccEmail:秘密抄送到对应邮箱
subject:邮件主题
text: 字符文本,可以是html元素文本
files:附件
在这个基础上,其实我们还是有额外的参数需要设置的,可以定义成全局
username: 用于发送邮件的邮箱账号
password: 用于发送邮件的邮箱密码
host:发送邮件的主机
port:发送邮件的端口
protocol:发送邮件的协议,默认值是:smtp
defaultEncoding:发送邮件的字符集,默认使用UTF-8

在这里,host和port是根据你需要连的邮箱进行设置的,比如连qq邮箱,网易邮箱。
百度能知道他们具体的协议和主机、端口

getMimeMessage方法
该方法其实主要就是将接收到的参数进行赋值发送邮箱,不需要多余讲解

邮件接收

    public static Message[] receiveMail(String receiveHost,String receivePort,String receiveProtocol,String username,String password) throws Exception {        Properties props = new Properties();        props.put("mail.pop3.host", receiveHost);        props.put("mail.pop3.port", receivePort);        Session session = Session.getInstance(props, new Authenticator() {            @Override            protected PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication(username, password);            }        });        store =  session.getStore(receiveProtocol);//        storeLocal.set(store);        store.connect();        folder = store.getFolder("INBOX");//        folderLocal.set(folder);        folder.open(Folder.READ_WRITE);        Calendar calendar = Calendar.getInstance();        // 搜索1天前到今天收到的的所有邮件,根据时间筛选邮件        calendar.add(Calendar.DAY_OF_MONTH, -1);        // 创建ReceivedDateTerm对象,ComparisonTerm.GE(大于等于),Date类型的时间 new Date(calendar.getTimeInMillis())----(表示1天前)        SentDateTerm term = new SentDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));        Message[] messages = folder.search(term);        return messages;    }

receiveMail方法
以下为各个参数说明
receiveHost:接收邮件的主机
receivePort:接收邮件的端口
receiveProtocol:接收邮件的协议,默认值:pop3
username: 需要接收邮件的账号
password:需要接收邮件的密码
这里也是需要账号密码的,区别在于你需要查找接收对应邮箱有收到什么邮件,你就需要对应账号和密码才能接收到

其中,注释已经标注接收什么时间范围内的邮件

邮件转发

转发就有点意思,我找这个找遍了都没有对应的方法能够实现,现在我来说一下我是怎么样的一个思路
要想转发,第一步,你就得先接收邮件
但是接收完邮件,你不能把FolderStore关闭掉
否则你是没有办法转发的
那什么是Folder和Store?

接收邮件和发送邮件很类似的都有用到Session,但是获取到Session后,我们需要从Session获取到特定类型的Store,然后连接到Store。

这里的Store代表了存储邮件的邮件服务器,在连接Store的过程中,我们是既有可能需要用到用户名和密码或者Authenticator,也就是验证的。

在连接到Store后,一个Folder对象,也叫目录对象,会通过Store的getFolder方法获取到邮件,也就能够从中读取到邮件。

这也是我们为什么想转发不能关闭他们的原因。
第二步,开始接收到需要转发的邮件,然后将对应邮件转发。
第三步,在转发完成之后我们才能够将其完成转发
也就是,我们必须接收邮件和转发邮件是同一个方法内进行的,没办法通过保存一个邮件类型的对象,额外做操作对其进行转发。

我也是卡死在了这一步上。

于是转发的方法如下:

  public void forwardMail(String receiveHost,String receivePort,String username,String password,String sendHost,String sendPort,String SendFrom,String SendTo) {    //设置接收邮件    final Properties receiveProps = new Properties();    receiveProps.put("mail.pop3.host", receiveHost);    receiveProps.put("mail.pop3.port", receivePort);    final Session receiveSession = Session.getInstance(receiveProps, new Authenticator() {      @Override      protected PasswordAuthentication getPasswordAuthentication() {        return new PasswordAuthentication(username, password);      }    });    final ThreadLocal<Store> storeLocal = new ThreadLocal<>();    final Store store = receiveSession.getStore("pop3");    storeLocal.set(store);    store.connect();    final ThreadLocal<Folder> folderLocal = new ThreadLocal<>();    final Folder folder = store.getFolder("INBOX");    folderLocal.set(folder);    folder.open(Folder.READ_WRITE);    final Calendar calendar = Calendar.getInstance();    // 搜索所有邮件,根据时间筛选    calendar.add(Calendar.DAY_OF_MONTH, -10);//n天之内    // 创建ReceivedDateTerm对象,ComparisonTerm.GE(大于等于)    final SentDateTerm term = new SentDateTerm(ComparisonTerm.GE, new Date(calendar.getTimeInMillis()));    final Message[] messages = folder.search(term);    for (Message mail : messages) {      //String header = ((MimeMessage)mail).getHeader("SUBJECT")[0];      //log.info("Header:{}", header);      System.out.println("收到邮件的主题:", mail.getSubject());      if (mail.isMimeType("multipart/related")) {        final MimeMultipart mimeMultipart = (MimeMultipart) mail.getContent();        for (int i = 0; i < mimeMultipart.getCount(); i++) {          System.out.println("收到邮件的正文:", mimeMultipart.getBodyPart(i).getContent().toString().length());        }      }      System.out.println("--------------------------------分割线----------------------------------------");      //设置转发邮件      final Properties forwardProps = new Properties();      forwardProps.put("mail.smtp.host", sendHost);      forwardProps.put("mail.smtp.port", sendPort);      final Session forwardSession = Session.getInstance(forwardProps, new Authenticator() {        @Override        protected PasswordAuthentication getPasswordAuthentication() {          return new PasswordAuthentication(username, password);        }      });      // 创建转发邮件信息      final Message forwardMail = new MimeMessage(forwardSession);      // 设置主题      forwardMail.setSubject("转发: " + mail.getSubject());      forwardMail.setFrom(new InternetAddress(SendFrom));      forwardMail.addRecipient(Message.RecipientType.TO, new InternetAddress(SendTo));      //创建Multipart的容器      final Multipart multipart = new MimeMultipart();      //被转发的邮件体部分      final BodyPart messageBodyPart = new MimeBodyPart();      messageBodyPart.setDataHandler(mail.getDataHandler());      //添加到Multipart容器      multipart.addBodyPart(messageBodyPart);      forwardMail.setContent(multipart);      //发送      Transport.send(forwardMail);    }    folder.close(false);//false标识不删除读取的邮件    store.close();  }

receiveMail方法
以下为参数说明
receiveHost:接收邮件的主机
receivePort:接收邮件的端口
username:接收邮件的账号
password:接收邮件的密码
这里可以看到,我接收和转发用的都是一个username和password,表示我从接收的邮件的这个账号,用这个账号转发给别的邮箱
sendHost:发送邮件的主机
sendPort:发送邮件的端口
SendFrom:从哪个邮箱进行转发
SendTo:将邮件转发给该邮箱

清除邮箱

以时间为限制,删除一定时间内的邮件

    public static void clearMail(String receiveHost,String receivePort,String receiveProtocol,String username,String password) throws Exception {        Properties props = new Properties();        props.put("mail.pop3.host", receiveHost);        props.put("mail.pop3.port", receivePort);        Session session = Session.getInstance(props, new Authenticator() {            @Override            protected PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication(username, password);            }        });        Store store = session.getStore(receiveProtocol);//        removeStoreLocal.set(store);        store.connect();        Folder folder = store.getFolder("INBOX");//        removeFolderLocal.set(folder);        folder.open(Folder.READ_WRITE);        Calendar calendar = Calendar.getInstance();        // 搜索7天前收到的的所有邮件,根据时间筛选邮件        calendar.add(Calendar.DAY_OF_MONTH, -7);        SentDateTerm term = new SentDateTerm(ComparisonTerm.LE, new Date(calendar.getTimeInMillis()));        Message[] messages = folder.search(term);        for (int i = 0; i < messages.length; i++) {//            if(!messages[i].getFolder().isOpen()) //判断是否open//                messages[i].getFolder().open(Folder.READ_WRITE);            messages[i].setFlag(Flags.Flag.DELETED, true);        }        folder.close(false);        store.close();    }

clearMail方法
以下为对应参数说明
receiveHost:接收邮件的主机
receivePort:接收邮件的端口
receiveProtocol:接收邮件的协议
username:接收该邮箱的邮件的账号
password:接收该邮箱的邮件的密码

结语

以上,就是我通过SpringBoot(java)使用javamail实现邮件的接收、转发、发送的具体过程,如后续有新内容将在本文章更新

来源地址:https://blog.csdn.net/xc9711/article/details/127787964

--结束END--

本文标题: springboot(java)使用javamail实现邮件的接收、转发、发送、清除

本文链接: https://www.lsjlt.com/news/416734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot(java)使用javamail实现邮件的接收、转发、发送、清除
    前言 最近在弄邮件相关的功能,被搞的头大,很多找的方法根本不知道该怎么往下走,就目前为止, 经过各种的碰壁和失败,就整理出来如何使用javamail实现邮件的接收、转发、发送、清除 不单单是分享,也为...
    99+
    2023-09-24
    java spring boot 服务器
  • SpringBoot整合Javamail实现邮件发送
    博客主页:踏风彡的博客 博主介绍:一枚在学习的大学生,希望在这里和各位一起学习。 所属专栏:SpringBoot学习笔记 文章创作不易,期待各位朋友的互动,有什么学习问题都可在评论区留言或者私信我...
    99+
    2023-08-31
    spring boot java spring
  • 利用JavaMail怎么实现一个邮件发送与接收功能
    利用JavaMail怎么实现一个邮件发送与接收功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、JavaMail 介绍  JavaMail 是sun公司(现以被甲骨文收...
    99+
    2023-05-31
    javamail ava
  • SpringBoot整合Javamail实现邮件发送的详细过程
    目录序言简单邮件多组件邮件(带附件,图片,超链接的邮件)发送带超链接的邮件发送带图片的邮件总结序言 ​ 发邮件对于咱们的Java来说是一个基本的功能,因此这里SpringBoot整合...
    99+
    2022-11-13
    springboot整合javamail springboot 邮件发送
  • 基于JavaMail的Java实现复杂邮件发送功能
    上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发送 讲解了邮件的基本协议,JavaMail组件,创建并发送一封简单邮件的详细步骤。本文将介绍如何创建并发送一封包含图片和附件的复杂邮件。一封复杂的邮件内容可以看做是由很多...
    99+
    2023-05-31
    javamail java 邮件发送
  • 利用JavaMail怎么实现一个邮件发送功能
    这篇文章将为大家详细讲解有关利用JavaMail怎么实现一个邮件发送功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用java发邮件,必须要导入新的包   &...
    99+
    2023-05-31
    javamail ava
  • 怎么在Java中利用JavaMail实现一个邮件发送功能
    这期内容当中小编将会给大家带来有关怎么在Java中利用JavaMail实现一个邮件发送功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 电子邮件协议电子邮件的在网络中传输和网页一样需要遵从特定的协议...
    99+
    2023-05-31
    java javamail ava
  • 用JavaMail API编写可带附件的邮件发送程序(转)
    利用Sun公司提供的JavaMail API可以很方便的开发邮件发送程序。也许你已经可以利用它来发送一段简单的文本了,但想不想使你的程序像OUTLOOK一样也能发送附件呢?本文在简单介绍了JavaMail之后,详细讲解了一段完整的送信的Ja...
    99+
    2023-06-03
  • 怎么用SpringBoot实现QQ邮箱发送邮件
    本篇内容主要讲解“怎么用SpringBoot实现QQ邮箱发送邮件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用SpringBoot实现QQ邮箱发送邮件”吧!1.获取QQ邮箱授权码2.导入邮...
    99+
    2023-06-22
  • SpringBoot2 高级应用(02):集成 JavaMail ,实现异步发送邮件
    本文源码:GitHub·点这里 || GitEE·点这里一、JavaMail的核心API1、API功能图解2、API说明(1)、Message 类:javax.mail.Message 类是创建和解析邮件的一个抽象类子类javax.mai...
    99+
    2023-06-02
  • java发送邮件的具体实现
    首先是继承自javax.mail.Authenticator的一个具体类。getPasswordAuthentication()方法也就是构建一个PasswordAuthentica...
    99+
    2022-11-15
    java 发送邮件
  • 如何用springboot实现发送邮件功能
    本篇内容介绍了“如何用springboot实现发送邮件功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   ...
    99+
    2023-06-20
  • SpringBoot实现邮件发送的示例代码
    工具类: package com.lhh.utils; import com.lhh.bean.EmailEntity; import javax.mail.*; import...
    99+
    2024-04-02
  • springboot发送邮件功能的实现代码
           发邮件是一个很常见的功能,在java中实现需要依靠JavaMailSender这个接口。在spri...
    99+
    2024-04-02
  • Springboot发送邮件功能的实现详解
    目录前言成果展示表设计引入依赖邮箱工具类mapperXmlServiceimplEmailServiceImpl写完后要去进行配置获取授权码总结前言 大多数小伙伴在练习与学习的过程中...
    99+
    2024-04-02
  • 如何使用Python脚本在Linux中实现邮件发送与接收
    如何使用Python脚本在Linux中实现邮件发送与接收在Linux系统中,我们可以使用Python脚本来实现邮件的发送与接收功能。Python的smtplib和imaplib模块提供了相应的功能。一、邮件发送要实现邮件发送功能,首先需要准...
    99+
    2023-10-22
    Python Linux 邮件
  • 使用SpringBoot发送邮件的方法详解
    目录第一步,导jar包第二步,申请email授权密码第三步,编写yml文件第四步,编写工具类第五步,编写controller类第六步,测试第一步,导jar包 <!--E...
    99+
    2023-05-19
    SpringBoot发送邮件 SpringBoot邮件
  • C#使用System.Net.Mail类实现邮件发送
    有些 SMTP 服务器要求在代表客户端发送电子邮件前验证客户端的身份。当此 SmtpClient 对象应该使用当前登录用户的默认凭据进行身份验证(如果服务器要求)...
    99+
    2024-04-02
  • 利用PHP邮件函数实现邮件发送和接收功能的方法总结
    利用PHP邮件函数实现邮件发送和接收功能的方法总结随着互联网的普及,电子邮件成为了人们日常生活中必不可少的沟通工具之一。而在网站开发中,也常常需要实现邮件发送和接收的功能。PHP作为一种常用的服务器端脚本语言,提供了一系列强大的邮件函数,可...
    99+
    2023-11-20
    邮件发送 PHP邮件函数 接收 方法总结
  • SpringBoot实现发送QQ邮件的示例代码
    目录配置发送邮件1、引入SpringBoot的Mail依赖2、配置邮箱发送的Bean3、发送测试邮件4、查看效果应用启动&停止邮件通知总结在跑个人应用的时候,想引入一个通知机...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作