邮箱授权码发送邮件Demo

发布时间 2023-04-08 22:53:25作者: 晓之羽

备注信息如下:

  1. 获取邮箱授权码,QQ邮箱获取授权码获取方式
  2. 获取 javax.mail-1.6.2.jar方式如下
    2.1、百度网盘下载
    链接:https://pan.baidu.com/s/1Bfhvk67JWAXHow01dJAN9A 提取码:mmos
    2.2、通过自身所拥有的Maven项目下载
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
<dependency>
   <groupId>javax.mail</groupId>
   <artifactId>javax.mail-api</artifactId>
   <version>1.6.2</version>
</dependency>

1、此方式参数不可以放在项目.properties配置文件中通过@PostConstruct方式获取,会导致邮件发送失败,若是有大佬知道怎么处理可以在下方留言告知,或者发送邮件至1181155871@qq.com,不胜感谢!!!

/**
 * @param targetMailAddress 目标邮箱
 * @param title             邮件标题
 * @param content           邮件内容(html)
 * @Description 发送邮件
 */
private void sendEmail(String targetMailAddress, String title, String content) throws Exception {
    //0.1 确定连接位置
    Properties props = new Properties();
    //获取邮箱smtp服务器的地址,
    props.setProperty("mail.host", srcMailHost);
    //是否进行权限验证。
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.store.protocol", "imap");
    Authenticator authenticator = new Authenticator() {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            //邮箱名称(srcUsername) : xxx@qq.com取xxx    //授权码(srcPassword)
            return new PasswordAuthentication(srcUsername, srcPassword);
        }
    };
    //1 获得连接
    /**
     * props:包含配置信息的对象,Properties类型
     *         配置邮箱服务器地址、配置是否进行权限验证(帐号密码验证)等
     *
     * authenticator:确定权限(帐号和密码)
     *
     * 所以就要在上面构建这两个对象。
     */
    Session session = Session.getDefaultInstance(props, authenticator);
    Store store = session.getStore();
    store.connect(srcUsername, srcPassword);
    //2 创建消息
    Message message = new MimeMessage(session);
    // 2.1 发件人        xxx@163.com 我们自己的邮箱地址,就是名称
    message.setFrom(new InternetAddress(srcMailAddress));
    /**
     * 2.2 收件人
     *         第一个参数:
     *             RecipientType.TO    代表收件人
     *             RecipientType.CC    抄送
     *             RecipientType.BCC    暗送
     *         比如A要给B发邮件,但是A觉得有必要给要让C也看看其内容,就在给B发邮件时,
     *         将邮件内容抄送给C,那么C也能看到其内容了,但是B也能知道A给C抄送过该封邮件
     *         而如果是暗送(密送)给C的话,那么B就不知道A给C发送过该封邮件。
     *     第二个参数
     *         收件人的地址,或者是一个Address[],用来装抄送或者暗送人的名单。或者用来群发。可以是相同邮箱服务器的,也可以是不同的
     *         这里我们发送给我们的qq邮箱
     */
     //接收邮件地址(targetMailAddress):xxxxxx126.com
    message.setRecipient(RecipientType.TO, new InternetAddress(targetMailAddress));
    // 2.3 主题(标题)
    message.setSubject(title);
    // 2.4 正文
    message.setContent(content, "text/html;charset=UTF-8");
    //3发送消息
    Transport.send(message);
}

2、此方法Demo可行,未进行读取配置信息发送邮件测试

/**
 * 使用授权码发送邮件
 *
 * @param receiveMail 收件人电子邮箱
 * @param subject     邮件标题
 * @param mailContent 邮件内容
 * @throws Exception
 */
public void sendMail(String receiveMail, String subject, String mailContent) throws Exception {
    // 发件人电子邮箱
    String sendMail = "xxxxxx@qq.com";
    String authorizationCode = "授权码";
    // 指定发送邮件的主机为 smtp.qq.com
    String host = "smtp.qq.com";  //QQ 邮件服务器
    // 获取系统属性
    Properties properties = System.getProperties();
    // 设置邮件服务器
    properties.setProperty("mail.smtp.host", host);
    properties.put("mail.smtp.auth", "true");
    MailSSLSocketFactory sf = null;
    try {
        sf = new MailSSLSocketFactory();
    } catch (GeneralSecurityException e) {
        throw new RuntimeException(e);
    }
    sf.setTrustAllHosts(true);
    properties.put("mail.smtp.ssl.enable", "true");
    properties.put("mail.smtp.ssl.socketFactory", sf);
    // 获取默认session对象
    Session session = Session.getDefaultInstance(properties, new Authenticator() {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(sendMail, authorizationCode); //发件人邮件用户名、授权码
        }
    });
    try {
        // 创建默认的 MimeMessage 对象
        MimeMessage message = new MimeMessage(session);
        // Set From: 头部头字段
        message.setFrom(new InternetAddress(sendMail));
        // Set To: 头部头字段
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail));
        // Set Subject: 邮件的标题
        message.setSubject(subject);
        // 设置消息体
        message.setText(mailContent);
        // 发送消息
        Transport.send(message);
        System.out.println("==========通过授权码发送邮件成功==========");
    } catch (MessagingException mex) {
        mex.printStackTrace();
    }
}