使用javax.mail发送邮件

文章目录
一、发邮件流程
二、关于邮件协议和端口
三、开启邮件协议和端口
3.1. QQ邮箱
3.2. 163邮箱
四、实战发送邮件
4.1. 引入依赖
4.2. 方法重写
4.3. 发送邮件核心类工具类EmailUtils
五、QQ邮件发送测试
5.1. QQ发送测试
5.2. 查看QQ发送邮箱
5.3. 查看收件人收件箱
六、163邮件发送测试
6.1. 163发送测试
6.2. 查看163发送邮箱
6.3. 查看收件人收件箱

发邮件流程
使用javax.mail包中的api发送邮件,大致有5个步骤

1、继承Authenticator类,重写getPasswordAuthentication方法。用于登录校验。
2、创建一个Properties对象,用于存放SMTP服务器地址、端口号
3、用步骤1和2得到的对象创建一个Session对象,相当于邮箱登录
4、创建一个MimeMessage,设置发件人、收件人、抄送人、主题、内容,添加附件
5、Transport发送邮件
二、关于邮件协议和端口
常用的电子协议协议有SMTP、POP3、IMAP4,它们都隶属于TCP/IP簇,默认状态下,分别通过TCP端口25、110和143建立连接。

发送邮件基于SMTP协议。下面列出了常用的邮件服务器地址和端口。

sina.com:
POP3服务器地址:pop3.sina.com.cn(端口:110)
SMTP服务器地址:smtp.sina.com.cn(端口:25) 
 
sinaVIP:
POP3服务器:pop3.vip.sina.com (端口:110)
SMTP服务器:smtp.vip.sina.com (端口:25)
 
sohu.com:
POP3服务器地址:pop3.sohu.com(端口:110)
SMTP服务器地址:smtp.sohu.com(端口:25)
 
126邮箱:
POP3服务器地址:pop.126.com(端口:110)
SMTP服务器地址:smtp.126.com(端口:25)
 
139邮箱:
POP3服务器地址:POP.139.com(端口:110)
SMTP服务器地址:SMTP.139.com(端口:25)
 
163.com:
POP3服务器地址:pop.163.com(端口:110)
SMTP服务器地址:smtp.163.com(端口:25)
 
QQ邮箱 
POP3服务器地址:pop.qq.com(端口:110)
SMTP服务器地址:smtp.qq.com (端口:25)
 
QQ企业邮箱
POP3服务器地址:pop.exmail.qq.com (SSL启用 端口:995)
SMTP服务器地址:smtp.exmail.qq.com(SSL启用 端口:587/465)
 
yahoo.com:
POP3服务器地址:pop.mail.yahoo.com
SMTP服务器地址:smtp.mail.yahoo.com
 
yahoo.com.cn:
POP3服务器地址:pop.mail.yahoo.com.cn(端口:995)
SMTP服务器地址:smtp.mail.yahoo.com.cn(端口:587
 
HotMail
POP3服务器地址:pop3.live.com (端口:995)
SMTP服务器地址:smtp.live.com (端口:587)
 
gmail(google.com)
POP3服务器地址:pop.gmail.com(SSL启用 端口:995)
SMTP服务器地址:smtp.gmail.com(SSL启用 端口:587263.net:
POP3服务器地址:pop3.263.net(端口:110)
SMTP服务器地址:smtp.263.net(端口:25263.net.cn:
POP3服务器地址:pop.263.net.cn(端口:110)
SMTP服务器地址:smtp.263.net.cn(端口:25)
 
x263.net:
POP3服务器地址:pop.x263.net(端口:110)
SMTP服务器地址:smtp.x263.net(端口:25)
 
21cn.com:
POP3服务器地址:pop.21cn.com(端口:110)
SMTP服务器地址:smtp.21cn.com(端口:25)
 
Foxmail:
POP3服务器地址:POP.foxmail.com(端口:110)
SMTP服务器地址:SMTP.foxmail.com(端口:25)
 
china.com:
POP3服务器地址:pop.china.com(端口:110)
SMTP服务器地址:smtp.china.com(端口:25)
 
tom.com:
POP3服务器地址:pop.tom.com(端口:110)
SMTP服务器地址:smtp.tom.com(端口:25)
 
etang.com:
POP3服务器地址:pop.etang.com
SMTP服务器地址:smtp.etang.com
三、开启邮件协议和端口
3.1. QQ邮箱

 

 

 3.2. 163邮箱

 

 

 

四、实战
发送邮件
4.1. 引入依赖
 <dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
 </dependency>
 <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.9</version>
    <scope>test</scope>
 </dependency>

4.2. 方法重写

继承Authenticator并重写getPasswordAuthentication方法

package com.gblfy.mail;


import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MyAuthenticator extends Authenticator {

    String userName = null;

    String password = null;

    public MyAuthenticator() {
    }

    public MyAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
}

4.3. 发送邮件核心类工具类EmailUtils

package com.gblfy.mail.util;

import com.gblfy.mail.MyAuthenticator;

import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.List;
import java.util.Properties;

/**
 * 使用javax.mail发送邮件
 *
 * @author: gblfy
 * @date 2021-06-22
 *
 * <p>
 * 参数列表:
 * 1.邮件服务器
 * 2.发件人邮箱
 * 3.发件人的授权密码
 * 4.邮件主题
 * 5.收件人,多个收件人以半角逗号分隔
 * 6.抄送,多个抄送以半角逗号分隔
 * 7.正文,可以用html格式的哟
 * </p>
 */
public class EmailUtils {

    private String smtpHost; // 邮件服务器地址
    private String sendUserName; // 发件人的用户名
    private String sendUserPass; // 发件人密码

    private MimeMessage mimeMsg; // 邮件对象
    private Multipart mp;// 附件添加的组件

    private void init() {
        // 创建一个密码验证器
        MyAuthenticator authenticator = null;
        authenticator = new MyAuthenticator(sendUserName, sendUserPass);

        // 实例化Properties对象
        Properties props = System.getProperties();
        props.put("mail.smtp.host", smtpHost);
        props.put("mail.smtp.auth", "true"); // 需要身份验证
        props.put("mail.smtp.starttls.enable", "true");

        // 建立会话
        Session session = Session.getDefaultInstance(props, authenticator);
        // 置true可以在控制台(console)上看到发送邮件的过程
        session.setDebug(true);
        // 用session对象来创建并初始化邮件对象
        mimeMsg = new MimeMessage(session);
        // 生成附件组件的实例
        mp = new MimeMultipart();
    }

    private EmailUtils(String smtpHost, String sendUserName, String sendUserPass, String to, String cc, String mailSubject,
                       String mailBody, List<String> attachments) {
        this.smtpHost = smtpHost;
        this.sendUserName = sendUserName;
        this.sendUserPass = sendUserPass;

        init();
        setFrom(sendUserName);
        setTo(to);
        setCC(cc);
        setBody(mailBody);
        setSubject(mailSubject);
        if (attachments != null) {
            for (String attachment : attachments) {
                addFileAffix(attachment);
            }
        }

    }

    /**
     * 邮件实体
     *
     * @param smtpHost     邮件服务器地址
     * @param sendUserName 发件邮件地址
     * @param sendUserPass 发件邮箱密码
     * @param to           收件人,多个邮箱地址以半角逗号分隔
     * @param cc           抄送,多个邮箱地址以半角逗号分隔
     * @param mailSubject  邮件主题
     * @param mailBody     邮件正文
     * @param attachments  附件路径
     * @return
     */
    public static EmailUtils entity(String smtpHost, String sendUserName, String sendUserPass, String to, String cc,
                                    String mailSubject, String mailBody, List<String> attachments) {
        return new EmailUtils(smtpHost, sendUserName, sendUserPass, to, cc, mailSubject, mailBody, attachments);
    }

    /**
     * 设置邮件主题
     *
     * @param mailSubject
     * @return
     */
    private boolean setSubject(String mailSubject) {
        try {
            mimeMsg.setSubject(mailSubject);
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 设置邮件内容,并设置其为文本格式或HTML文件格式,编码方式为UTF-8
     *
     * @param mailBody
     * @return
     */
    private boolean setBody(String mailBody) {
        try {
            BodyPart bp = new MimeBodyPart();
            bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=UTF-8>" + mailBody,
                    "text/html;charset=UTF-8");
            // 在组件上添加邮件文本
            mp.addBodyPart(bp);
        } catch (Exception e) {
            System.err.println("设置邮件正文时发生错误!" + e);
            return false;
        }
        return true;
    }

    /**
     * 添加一个附件
     *
     * @param filename 邮件附件的地址,只能是本机地址而不能是网络地址,否则抛出异常
     * @return
     */
    public boolean addFileAffix(String filename) {
        try {
            if (filename != null && filename.length() > 0) {
                BodyPart bp = new MimeBodyPart();
                FileDataSource fileds = new FileDataSource(filename);
                bp.setDataHandler(new DataHandler(fileds));
                bp.setFileName(MimeUtility.encodeText(fileds.getName(), "utf-8", null)); // 解决附件名称乱码
                mp.addBodyPart(bp);// 添加附件
            }
        } catch (Exception e) {
            System.err.println("增加邮件附件:" + filename + "发生错误!" + e);
            return false;
        }
        return true;
    }

    /**
     * 设置发件人地址
     *
     * @param from 发件人地址
     * @return
     */
    private boolean setFrom(String from) {
        try {
            mimeMsg.setFrom(new InternetAddress(from));
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 设置收件人地址
     *
     * @param to 收件人的地址
     * @return
     */
    private boolean setTo(String to) {
        if (to == null)
            return false;
        try {
            mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * 设置抄送
     *
     * @param cc
     * @return
     */
    private boolean setCC(String cc) {
        if (cc == null) {
            return false;
        }
        try {
            mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc));
        } catch (Exception e) {
            return false;
        }
        return true;
    }

    /**
     * no object DCH for MIME type multipart/mixed报错解决
     */
    private void solveError() {
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap(
                "multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
        Thread.currentThread().setContextClassLoader(EmailUtils.class.getClassLoader());
    }

    /**
     * 发送邮件
     *
     * @return
     */
    public boolean send() throws Exception {
        mimeMsg.setContent(mp);
        mimeMsg.saveChanges();
        System.out.println("正在发送邮件....");
        solveError();
        Transport.send(mimeMsg);
        System.out.println("发送邮件成功!");
        return true;
    }
}
五、QQ邮件发送测试

5.1. QQ发送测试

package com.gblfy.mail;

import com.gblfy.mail.util.EmailUtils;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class MailApplicationTests {

    @Test
    public void sendEmail() throws Exception {
        //QQ邮箱测试
        String userName = "754263923@qq.com"; // 发件人邮箱
        String password = "wzxsscqpvrikbbfa"; // 发件人密码,其实不一定是邮箱的登录密码,对于QQ邮箱来说是SMTP服务的授权文本
        String smtpHost = "smtp.qq.com"; // 邮件服务器

        //163邮箱测试
        // String userName = "gblfy02@163.com"; // 发件人邮箱
        // String password = "TBFJUSKCUOPEYOYU"; // 发件人密码,其实不一定是邮箱的登录密码,对于QQ邮箱来说是SMTP服务的授权文本
        // String smtpHost = "smtp.163.com"; // 邮件服务器

        String to = "guo_bin@sinosoft.com.cn"; // 收件人,多个收件人以半角逗号分隔
        String cc = "songzihao@sinosoft.com.cn"; // 抄送,多个抄送以半角逗号分隔
        String subject = "这是邮件的主题 163"; // 主题
        String body = "这是邮件的正文163"; // 正文,可以用html格式的哟
        List<String> attachments = Arrays.asList("D:\安装包\【繁星课堂】DataX3.0离线同步课件.pdf", "D:\安装包\权限控制优化需求.docx"); // 附件的路径,多个附件也不怕

        EmailUtils emailUtils = EmailUtils.entity(smtpHost, userName, password, to, cc, subject, body, attachments);

        emailUtils.send(); // 发送!
    }

}
六、163邮件发送测试

6.1. 163发送测试

package com.gblfy.mail;

import com.gblfy.mail.util.EmailUtils;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;

public class MailApplicationTests {

    @Test
    public void sendEmail() throws Exception {
        //QQ邮箱测试
        // String userName = "754263923@qq.com"; // 发件人邮箱
        // String password = "wzxsscqpvrikbbfa"; // 发件人密码,其实不一定是邮箱的登录密码,对于QQ邮箱来说是SMTP服务的授权文本
        // String smtpHost = "smtp.qq.com"; // 邮件服务器

        //163邮箱测试
        String userName = "gblfy02@163.com"; // 发件人邮箱
        String password = "TBFJUSKCUOPEYOYU"; // 发件人密码,其实不一定是邮箱的登录密码,对于QQ邮箱来说是SMTP服务的授权文本
        String smtpHost = "smtp.163.com"; // 邮件服务器

        String to = "guo_bin@sinosoft.com.cn"; // 收件人,多个收件人以半角逗号分隔
        String cc = "songzihao@sinosoft.com.cn"; // 抄送,多个抄送以半角逗号分隔
        String subject = "这是邮件的主题 163"; // 主题
        String body = "这是邮件的正文163"; // 正文,可以用html格式的哟
        List<String> attachments = Arrays.asList("D:\安装包\【繁星课堂】DataX3.0离线同步课件.pdf", "D:\安装包\权限控制优化需求.docx"); // 附件的路径,多个附件也不怕

        EmailUtils emailUtils = EmailUtils.entity(smtpHost, userName, password, to, cc, subject, body, attachments);

        emailUtils.send(); // 发送!
    }

}

版权声明:本文为CSDN博主「gblfy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40816738/article/details/118104749

原文地址:https://www.cnblogs.com/yonggang/p/15079468.html