首页 > 编程语言 >java收发邮件

java收发邮件

时间:2024-01-25 19:00:14浏览次数:31  
标签:java String jakarta new 收发 private import mail 邮件

邮箱协议端口
Alt text

使用jakarta库发送邮件

示例



import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xin_admin.common.Result;
import com.xin_admin.security.AuthAnnotation;
import jakarta.activation.DataHandler;
import jakarta.activation.DataSource;
import jakarta.activation.FileDataSource;
import jakarta.mail.*;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMessage;
import jakarta.mail.internet.MimeMultipart;
import lombok.extern.slf4j.Slf4j;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.Map;
import java.util.Properties;

/**
 * @author:aloha
 * @create: 2023-08-09 09:26
 * @Description: 发邮件
 */

@AuthAnnotation(needRole = "admin")
@Slf4j
@RestController
public class MailSend {
    private static String host;
    private static String port;
    private static String username;
    private static String password;

    private String to;
    private String subject;
    private String text;
    private String filename;

    static {
        Yaml yaml = new Yaml();
        try(InputStream in = MailSend.class.getClassLoader().getResourceAsStream("config/mail-config.yml")){
            Map map =(Map<String,Object>) yaml.load(in);
            Map<String,String> config = (Map<String,String>) map.get("send");
            host=config.get("host");
            port=config.get("port");
            username=config.get("username");
            password=config.get("password");

        }catch(Exception e){
            log.warn(":{}",e);
        }
    }

    @PostMapping("/mail")
    public Result mailSend(@RequestBody String body) {
        JSONObject obj = JSON.parseObject(body);
        to = obj.getString("to");
        subject=obj.getString("subject");
        text=obj.getString("text");
        filename=obj.getString("filename");


        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);
        properties.setProperty("mail.smtp.port", port);
        properties.setProperty("mail.smtp.auth", "true");
    //  properties.setProperty("mail.smtp.starttls.enable", "true"); //公司加密端口被禁了,

        Session session = Session.getInstance(properties, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });
        Result result=new Result();
        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject);

            MimeBodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(text);

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            //如有附件地址, 发送附件
            if (filename != null) {
                messageBodyPart = new MimeBodyPart();
                DataSource source = new FileDataSource(filename);
                messageBodyPart.setDataHandler(new DataHandler(source));
                messageBodyPart.setFileName(filename);
                multipart.addBodyPart(messageBodyPart);
            }


            message.setContent(multipart);

            Transport.send(message);
            result.setCode(200);
        } catch (Exception e) {
            e.printStackTrace();
            result.setCode(500);
            result.setMsg(e.getMessage());
        }
        return result;
    }
    }

使用jakarta 接收邮件

安装依赖

前三个是接收邮件用的,其他的酌情安装
implementation 'jakarta.mail:jakarta.mail-api:2.1.2'
implementation 'jakarta.activation:jakarta.activation-api:2.1.2'
implementation 'org.eclipse.angus:jakarta.mail:1.0.0'

implementation 'org.yaml:snakeyaml:2.0'
annotationProcessor 'org.projectlombok:lombok'

配置文件

resources目录下,config/mail-config.yml

recive:
    protocol: "pop3"
    host: "pop3.163.com"
    port: "110"
    username: "[email protected]"
    password: "ASDFSFSDFSDFDSF"
    baseDir: "C:\\Users\\{user}\\Desktop"

这里用了网易邮箱,使用pop3协议, baseDir是存放附件的目录

示例代码

    import jakarta.mail.*;
    import jakarta.mail.internet.*;
    import jakarta.activation.*;
    import lombok.extern.slf4j.Slf4j;
    import org.yaml.snakeyaml.Yaml;

    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.Map;
    import java.util.Properties;

    /**
    * @param
    * @param null
    * @author aloha
    * @description TODO
    * @createTime 
    * @return
    * @return null
    */
    @Slf4j
    public class MailRecive {
    private String protocol;
    private String host;
    private String port;
    private String username;
    private String password;
    private String baseDir;  //存储附件的目录

    public void mailRecive() throws Exception {
        Yaml yaml = new Yaml();
        try (InputStream in = MailRecive.class.getClassLoader().getResourceAsStream("config/mail-config.yml")) {
            Map config = (Map<String, Object>) yaml.load(in);
            Map<String, String> recive = (Map<String, String>) config.get("recive");
            protocol = recive.get("protocol");
            host = recive.get("host");
            port = recive.get("port");
            username = recive.get("username");
            password = recive.get("password");
            baseDir = recive.get("baseDir");

        } catch (Exception e) {
            log.error("读取邮件配置文件{}", e);
        }
        // 准备连接服务器的会话信息
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", protocol);  //协议 ,如"imap"
        props.setProperty("mail.host", host);      //主机 ,如 imap.163.com
        props.setProperty("mail.port", port);    //端口 ,如 143

        // 创建Session实例对象
        Session session = Session.getInstance(props);

        // 创建IMAP协议的Store对象
        Store store = session.getStore(protocol);

        // 连接邮件服务器
        store.connect(username, password);

        // 获得收件箱
        Folder folder = store.getFolder("INBOX");

        // 打开收件箱
        folder.open(Folder.READ_ONLY);  //打开方式,只读:Folder.READ_ONLY 或1. 读写:Folder.READ_WRITE  或2
        //   folder.open(1);  //打开方式,只读: 1. 读写: 2
        //邮件数
        // folder.getMessageCount();  //邮件总数,等同于msgs.length
        // folder.getUnreadMessageCount() //未读邮件数
        // folder.getNewMessageCount()  //新邮件数
        // folder.getDeletedMessageCount()  //已删除邮件数

        // 获得收件箱的邮件列表,遍历每封邮件,并下载附件到指定目录,测试邮箱只有一封邮件
        Message[] msgs = folder.getMessages();

        for (Message msg : msgs) {
    //            log.debug("标题:{}", msg.getSubject());
    //            log.debug("内容:{}", msg.getContent()); //内容目前没拿到,官网上不去,后面需要再说jakarta.mail.internet.MimeMultipart@3bbc39f8
    //            log.debug("邮件类型:{}", msg.getContentType().toString());  //multipart/mixed
    //            log.debug("文件名:{}", msg.getFileName());  //null
    //            log.debug("对方发送时间:{}", msg.getSentDate().toString());
    ////            log.debug("接收时间:{}", msg.getReceivedDate().toString()); 可能为null
    //            log.debug("getDataHandler:{}", msg.getDataHandler());
    ////            log.debug("getFrom:{}",msg.getFrom());  //发件人,=?gb18030?B?0e6yxcvJ?= <[email protected]>
            MimeMessage message = (MimeMessage) msg;
            Multipart multipart = (Multipart) message.getContent();

            for (int j = 0; j < multipart.getCount(); j++) {
                BodyPart bodyPart = multipart.getBodyPart(j);
                //如果是附件,写入到指定位置
                if (bodyPart.isMimeType("application/octet-stream")) { //"text/plain","text/html"
                    DataSource source = bodyPart.getDataHandler().getDataSource();
                    String fileDir=baseDir+"\\" + source.getName();  //拼接附件名
                    try (InputStream in = source.getInputStream();OutputStream out = new FileOutputStream(fileDir)){
                        byte[] bytes = new byte[1024];
                        while (in.read(bytes) != -1){
                            out.write(bytes);
                        }
                    }catch (Exception e){
                        log.error("获取邮件getInputStream或 创建写入流错误,{}",e);
                    }
                }
            }
        }
        // 关闭资源
        folder.close(false);
        store.close();
    }

    // 执行
    public static void main(String[] args) {
        MailRecive server = new MailRecive();
        try {
            server.mailRecive();
        } catch (Exception e) {
            log.warn("邮件服务异常:{}", e);
        }
    }

    }

标签:java,String,jakarta,new,收发,private,import,mail,邮件
From: https://www.cnblogs.com/wakevol/p/17617597.html

相关文章

  • 2024年1月Java项目开发指南8:统一数据返回格式
    有时候返回一个字符串,有时候返回一串数字代码,有时候返回一个对象……不过怎么说,我们返回的内容往往具有三个1.消息代码code2.消息内容msg3.数据内容data接下来,我们要编写一个类,通过这个类,实现对所有返回内容进行格式化。先去添加个依赖 <dependency> <groupId>org.p......
  • 笨办法学 Java(四)
    原文:LearnJavaTheHardWay译者:飞龙协议:CCBY-NC-SA4.0练习55:记录数组记录很棒,数组更好,但是当你把记录放入数组时,这个生活中几乎没有你不能编码的东西。1classStudent2{3Stringname;4intcredits;5doublegpa;6}78publicclass......
  • 2024年1月Java项目开发指南7:增删改查与接口测试
    我们之前,是从Controller层写到Service层,然后mapper层。接下来我们反过来,从mapper层写到Controller层两种方式都可以,你喜欢就行,甚至你先写service层也可以,全凭个人喜欢。在本文中,就不解释太多了,直接给出代码,对于关键地方,我会圈出来。如果有问题,可以直接在本文首发地址(博客园......
  • JAVA调用Python脚本执行
    SpringBoot-web环境<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>springboot--启动类@SpringBootApplication(ex......
  • java aspect 切面怎么获取 POST 数据
    javaaspect切面怎么获取POST数据/***切面*/@Aspect@ComponentpublicclassPostRequestBodyAspect{@Pointcut("execution(*com.example.controller.*.*(..))")publicvoidcontrollerMethods(){}......
  • html 中javascript 如何被调用
    在HTML中,JavaScript可以通过多种方式进行调用。1.内联脚本(InlineScript):直接将JavaScript代码写入到HTML文件的<script>标签中。示例代码如下所示:<!DOCTYPEhtml><html><head><title>使用内联脚本</title></head><body><!--HTML页面内容--><scripttyp......
  • JAVA学习笔记--使用Inte IDEA
    使用IntellijIDEA编写代码新建项目创建新项目选择创建一个空项目并输入项目名弹出ProjecStructure窗口先关闭新建一个模板(Module)并输入模板名打开前面关闭的ProjecStructure窗口修改以下信息(注意:安装的是JDK8则按照以下信息修改,若安装的是JDK其他版本则......
  • JAVA学习笔记--数据类型及注意事项
    Java的数据类型(笔试考题)Java是强类型语言:要求变量使用要严格符合规定,所有变量都必须先定义后才能使用基本类型(primitivetype)数据类型整数类型byte(1字节):-128~127short(2字节):-32768~32767int(4字节):-2147483648~2147483647(最常用)long(8字节):-9223372036854775808~922......
  • JAVA学习笔记--变量与常量
    变量局部变量注意:必须声明并且必须初始化值publicclassHello{//main方法publicstaticvoidmain(String[]args){//局部变量,只在{}内使用inti=10;System.out.print(i);}//其他方法publicvoidadd(){......
  • 2024年1月Java项目开发指南6:接口测试
    我们使用APIFox这款工具对接口进行测试。(你要是会其他的例如postman进行测试也行)https://apifox.com/新建一个项目,新增一个接口因为这个接口没有参数,所以无需填写参数,保存然后点击运行没有设置环境记得先去设置环境我们配置开发环境保存然后选择开发环境进行使用......