Smtp邮件发送功能

天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。


一、前言

邮件发送功能
此文为smtp邮件发送的工具类总结,其中包含两种方法

1. 未开启安全机制

未开启安全机制的默认端口发送邮件,单个邮箱发送、多个邮箱发送(包含两种传参形式)。

2. 开启安全机制

开启ssl安全机制更改端口的邮件发送。

3. 总结

这两种方式第一种适用于没有端口限制的环境,第二种适用于像阿里云服务器等限制端口的环境。

二、授权码获取

这里以126邮箱为例

1. 登陆

登录邮箱

2. 设置

在设置界面找到POP3/SMTP/IMAP
在这里插入图片描述
在这里插入图片描述

3. 获取授权码

在POP3/SMTP/IMAP的界面可开启/关闭smtp服务以及获取授权码
选择新增授权密码,通过验证即可获取授权码
后面代码中配置需要用到授权码
在这里插入图片描述

三、代码实现

1. 依赖引入

在pom中添加邮箱的Maven依赖依赖
如下

        <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>

2. 邮箱工具代码

SmtpEmailUtils.java

package com.smtp.email;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.List;
import java.util.Properties;

/**
 * @Author:李白
 * @Date:2023/1/8 12:57
 */
public class SmtpEmailUtils {



    /**
     * 1发送邮件(单条发送纯文本邮件)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceive 收件人
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMail(String mailSend, String mailSendAuthCode, String mailReceive, String subject, String content) throws MessagingException {
        //配置发送邮件的属性
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人
        InternetAddress to = new InternetAddress(mailReceive);
        mimeMessage.setRecipient(Message.RecipientType.TO,to);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }


    /**
     * 2发送邮件(群发1)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceiveList 收件人列表(多个邮箱)
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMails(String mailSend, String mailSendAuthCode, List mailReceiveList, String subject, String content) throws MessagingException {
        //配置发送邮件的属性
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人(多人收--群发)
//        InternetAddress to = new InternetAddress(mailReceive);
//        mimeMessage.setRecipient(Message.RecipientType.TO,to);
        InternetAddress[] tos = new InternetAddress[mailReceiveList.size()];
        for (int i = 0; i < mailReceiveList.size(); i++) {
            tos[i] = new InternetAddress(mailReceiveList.get(i).toString());
        }
        mimeMessage.setRecipients(Message.RecipientType.TO,tos);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }



    /**
     * 3发送邮件(群发2)
     * @param mailSend 发件人
     * @param mailSendAuthCode 发件人邮箱授权码
     * @param mailReceives 收件人(群发,多个邮箱以逗号隔开)
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws AddressException
     */
    public static void sendMails(String mailSend, String mailSendAuthCode, String mailReceives, String subject, String content) throws MessagingException {
        //配置发送邮件的属性环境
        Properties properties = new Properties();
        //是否需要身份验证
        properties.put("mail.smtp.auth","true");
        //服务器地址
//        properties.put("mail.smtp.host","smtp.qq.com");
        properties.put("mail.smtp.host","smtp.126.com");
//        properties.put("mail.smtp.port",465);
        //登陆账号密码,需开启smtp
//        properties.put("mail.user","发件人邮箱");
        properties.put("mail.user",mailSend);
        //smtp提供的授权码(非密码)
//        properties.put("mail.password","发件人邮箱授权码");//qq
//        properties.put("mail.password","发件人邮箱授权码");//126
        properties.put("mail.password",mailSendAuthCode);

        //构建授权信息,用于进行SMTP身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //用户名,密码
                String userName = properties.getProperty("mail.user");
                String password = properties.getProperty("mail.password");
                return new PasswordAuthentication(userName, password);
            }
        };

        //使用环境属性和授权信息,创建邮件会话
        Session session = Session.getInstance(properties, authenticator);
        //创建邮件消息
        MimeMessage mimeMessage = new MimeMessage(session);
        //设置发件人
        InternetAddress from = new InternetAddress(properties.getProperty("mail.user"));
        mimeMessage.setFrom(from);

        //设置收件人(多个收件人,群发,收件人之间以逗号隔开)
//        InternetAddress tos = new InternetAddress(mailReceives);
        mimeMessage.setRecipients(Message.RecipientType.TO,mailReceives);

        //设置抄送
//        InternetAddress cc = new InternetAddress("ssss@yahoo.com");
//        mimeMessage.setRecipient(Message.RecipientType.CC,cc);

        //设置秘密抄送,其他收件人不能看到密送的邮件地址
//        InternetAddress bcc = new InternetAddress("yyyy@163.com");
//        mimeMessage.setRecipient(Message.RecipientType.BCC,bcc);

        //设置邮件标题
        mimeMessage.setSubject(subject);
        //邮件内容
        mimeMessage.setContent(content,"text/html;charset = UTF-8");
        //发送邮件
        Transport.send(mimeMessage);

    }


    /**
     * 适配服务器
     * 开启ssl安全机制,全局打印邮件发送者和内容相关信息
     * 该方法开启ssl并改端口为465后,解决了阿里云服务器中运行发送邮件报错问题(连接超时)
     * @param sender 发件人
     * @param senderAuthCode 发件人授权码
     * @param receivers 收件人(单个收件人或多个收件人,多个邮箱则用逗号隔开)
     * @param emailSubject 邮件主题
     * @param emailContent 邮件内容
     * @throws MessagingException
     */
    public static void sendSslEmail(String sender, String senderAuthCode, String receivers, String emailSubject, String emailContent) throws MessagingException {
        //配置发送邮件配置的属性环境
        Properties properties = new Properties();
        //配置邮件服务器地址
        properties.setProperty("mail.smtp.host", "smtp.126.com");
        //开启授权
        properties.setProperty("mail.smtp.auth","true");
        //配置端口号
        properties.setProperty("mail.smtp.port","465");
//        properties.setProperty("mail.smtp.starttls.enable","true");
        //开启ssl安全机制
        properties.setProperty("mail.smtp.ssl.enable","true");

        //构建授权信息,用于smtp身份验证
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(sender,senderAuthCode);
            }
        };

        //使用邮件属性和授权信息,创建会话
        Session session = Session.getDefaultInstance(properties, authenticator);
        //开启debug模式,将信息打印控制台
        session.setDebug(true);
        //构建邮件消息体
        Message message = new MimeMessage(session);
        //设置发件人
        message.setFrom(new InternetAddress(sender));
        //发送邮件的方式(直发,抄送,秘密抄送等)收件人如果为多个,可在收件人邮箱与邮箱之间用逗号隔开
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(receivers));
        //设置邮件主题
        message.setSubject(emailSubject);
        //设置邮件内容
        message.setContent(emailContent,"text/html;charset=UTF-8");
        //发送邮件
        Transport.send(message);

    }

}

注意1:代码中的一些函数导包必须是引入依赖中的包,如果用内置包可能会报错
注意2:功能放在阿里云服务器上使用报错(连接超时)原因是阿里云服务器出于安全问题(避免垃圾邮件)关闭了smtp默认使用的25端口,所以才有了开启ssl更改端口为465的这个方法,可以在阿里云服务器上使用

3. 测试代码

编写main方法,调用工具类中的方法进行邮箱功能测试
SmtpEmailTestController.java

package com.smtp.email;

import javax.mail.MessagingException;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:寒山李白
 * @Date:2023/1/8 13:02
 */
public class SmtpEmailTestController {

    public static void main(String[] args) throws MessagingException {
    
        //1 单一邮箱发送----126发给qq
        SmtpEmailUtils.sendMail("发件人邮箱", "发件人邮箱的授权码", "收件人邮箱","邮件主题名称","邮件内容");

        //2 多邮箱发送,名单列表传参
        List tosList = new ArrayList();
        tosList.add("收件人邮箱1");
        tosList.add("收件人邮箱2");
        //SmtpEmailUtils.sendMails("发件人邮箱", "发件人邮箱的授权码", tosList,"邮件主题名称","邮件内容");

        //3 多邮箱发送,字符串传参,每个邮箱之间用逗号隔开
        String tosList2 = "收件人邮箱1,收件人邮箱2";
//        SmtpEmailUtils.sendMails("发件人邮箱", "发件人邮箱的授权码", tosList2,"邮件主题名称","邮件内容");

        //4 开启ssl,单个邮箱或多个邮箱发送
//        SmtpEmailUtils.sendSslEmail("发件人邮箱","发件人邮箱的授权码","收件人邮箱","邮件主题名称","邮件内容");
        //开启ssl,单个邮箱或多个邮箱发送
//        SmtpEmailUtils.sendSslEmail("发件人邮箱","发件人邮箱的授权码","收件人邮箱1,收件人邮箱2","邮件主题名称","邮件内容");

    }

}

4. 执行代码

执行代码,然后到邮箱查看是否收到邮件即可


感谢阅读,祝君暴富!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值