欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaMail(一)——发送纯文本内容邮件

程序员文章站 2022-06-16 08:38:20
...

基础概念

  • SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议
    定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器之间的通信规则;SMTP协议是一个基于TCP/IP的应用层协议,SMTP服务器默认使用的网络监听端口号为25。
  • POP3 (Post Office Protocol) 邮局协议
    使用本地电子邮件客户端可以检索电子邮件从远程服务器通过TCP/ IP连接的应用层网络标准协议。 POP支持访问远程邮箱简单的下载和 - 删除要求。它采用的监听端口号为110。
  • IMAP (Internet Message Access Protocol) Internet消息访问协议
    这是一个应用层互联网协议,它允许电子邮件客户端来访问邮件的远程服务器上的邮件;也是对POP3协议的一种扩展。 IMAP服务器采用的监听端口号为143。

环境配置

要使用Java应用程序发送邮件是很简单的,但首先应该有安装 以下两个Jar包:
JavaMail API 和 JAF(JavaBeans Activation Framework,JavaBeans**框架)

注:Java SE6或更高版本提供了javax.activation,也可以单独下载
下载流程可参考百度经验:下载流程
也可以在CSDN中直接下载JavaMail相关Jar包

下载并解压缩这些文件,需要添加 mail.jar 和 activation.jar 到项目中。

注:IDEA添加Jar包流程请参考:详述 IntelliJ IDEA 之 添加 jar 包

本人使用的是网易163邮箱,所以需要开启授权码;请参考:163邮箱如何开始POP3协议,获取授权码

发送纯文本邮件

首先创建邮件实体Email,这个实体在后面的各类邮件发送中都会用到

package com.company;

import java.io.File;
import java.util.Map;

/**
 * Created by lining on 2018/5/31.
 */
public class Email {

    // 收件人
    private String[] toEmails;

    // 抄送人
    private String[] ccEmails;

    // 密送人
    private String[] bccEmails;

    // 邮件主题
    private String subject;

    // 邮件内容
    private String content;

    // 附件
    private String[] attachments;

    // 内嵌图片
    private Map<String, String> imagesMap;

    // ----------- getter/setter -----------
    public String[] getToEmails() {
        return toEmails;
    }

    public void setToEmails(String[] toEmails) {
        this.toEmails = toEmails;
    }

    public String[] getCcEmails() {
        return ccEmails;
    }

    public void setCcEmails(String[] ccEmails) {
        this.ccEmails = ccEmails;
    }

    public String[] getBccEmails() {
        return bccEmails;
    }

    public void setBccEmails(String[] bccEmails) {
        this.bccEmails = bccEmails;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String[] getAttachments() {
        return attachments;
    }

    public void setAttachments(String[] attachments) {
        this.attachments = attachments;
    }

    public Map<String, String> getImagesMap() {
        return imagesMap;
    }

    public void setImagesMap(Map<String, String> imagesMap) {
        this.imagesMap = imagesMap;
    }
}

发送邮件的流程:
1.获取与邮件服务器交互的会话对象Session实例
2.通过MimeMessage创建邮件内容,主要涉及收件人、发送时间、邮件主题、邮件内容
3.调用Transport的静态方法send,发送邮件

package com.company;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.Date;
import java.util.Properties;

/**
 * Created by lining on 2018/5/26.
 */
public class TextMessageSender {

    // 发件人的中文昵称
    private static final String nickname = "李宁";

    // 发件人在邮箱服务器中的用户名
    private static final String username = "152****aaa@qq.com";

    // 发件人在邮箱服务器中的授权码
    private static final String password = "******";

    // 邮件的发送协议
    private static final String protocol = "smtp";

    // 邮件发送的服务器
    private static final String host = "smtp.163.com";

    // 邮件的监听端口号
    private static final String port = "25";

    public static void main(String[] args) {
        // 收件人邮箱地址
        String to = "******@qq.com";

        // 抄送人邮箱地址
        String cc = "******@qq.com";

        // 密送人邮箱地址
        String bcc = "******@163.com";

        // 邮件的主题
        String subject = "文本邮件主题";

        // 邮件正文的文本内容
        String body = "文本邮件内容";

        // 封装邮件实体
        Email email = new Email();
        email.setToEmails(to.split(";"));
        email.setCcEmails(cc.split(";"));
        email.setBccEmails(bcc.split(";"));
        email.setSubject(subject);
        email.setContent(body);

        // 发送邮件
        if (sendEmail(email)) {
            System.out.println("邮件发送成功!");
        } else {
            System.out.println("邮件发送失败!请及时解决!");
        }
    }

    /**
     * 发送邮件
     * @param email 邮件信息实体
     * @return 是否发送成功 TRUE 发送成功 FALSE 发送失败
     */
    public static boolean sendEmail(Email email) {
        try {

            // 创建Session实例对象
            /*
             * Session类用于定义整个JavaMail应用程序所需要的环境信息,
             * 以及收集客户端与邮件服务器建立网络连接会话信息,如邮件
             * 服务器的主机号、端口号、采用的邮件发送和接收的协议等。
             */
            Session session = createSession();

            // 创建MimeMessage实例对象
            MimeMessage message =createMessage(session, email);

            // 发送邮件
            /*
             * send方法执行邮件发送任务时,它首先从参数Message对象中获得Session对象,
             * 然后调用Session.getTransport方法获得用于发送邮件邮件的Transport实例对象,
             * 接着使用保存在Session对象中的与网络链接相关的JavaMail属性,调用Transport
             * 对象的connect方法连接邮件服务器,然后调用Transport对象的sendMessage方法
             * 发送邮件,最后调用close方法断开与邮件服务器的连接。
             */
            Transport.send(message);

            return true;
        } catch (Exception e) {
            System.out.println("发送邮件异常==》");
            e.printStackTrace();
            return false;
        } finally {
            System.out.println("邮件发送结束...");
        }
    }

    /**
     * 创建与邮件服务器的会话对象
     * @return 服务器的会话对象
     */
    public static Session createSession() {
        // 封装属性参数
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", protocol); // 邮件传输的协议
        props.setProperty("mail.smtp.host", host); // 邮件的服务器
        props.setProperty("mail.smtp.port", port); // 邮件的监听端口
        props.setProperty("mail.smtp.auth", "true"); // 是否需要验证设置为TRUE,使用授权码发送邮件需要验证

        // 获取与服务器的会话Session对象
        /*
         * getInstance和getDefaultInstance是Session的静态方法,都可以用来获取Session类的实例对象。
         * 两个方法的区别在于:
         * getDefaultInstance方法返回一个Session对象后,将把这个Session对象设置为默认的Session对象,
         * 以后每一次调用getDefaultInstance方法都会返回这个默认Session对象;
         * 而getInstance方法则是每次调用都会返回一个新的Session对象。
         */
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 登陆账号及密码,密码需要是第三方授权码
                /*
                 * 调用Session对象中注册的Authenticator对象,从中获取的用户认证信息后传递给邮件服务器
                 * PasswordAuthentication根据指定的用户名和密码创建实例对象
                 */
                return new PasswordAuthentication(username, password);
            }
        });

        return session;
    }

    /**
     * 创建邮件的核心内容
     * @param session 与服务器交互的会话对象
     * @param email 邮件实体
     * @return 生成的MimeMessage实例对象
     * @throws Exception
     */
    public static MimeMessage createMessage(Session session, Email email) throws Exception{
        // 创建MimeMessage实例对象:表示整封邮件
        MimeMessage message = new MimeMessage(session);

        // 设置发件人
        if (!nickname.isEmpty()) {
            // 自定义发件人昵称
            message.setFrom(new InternetAddress(MimeUtility.encodeText(nickname) + " <" + username + ">"));
        } else {
            message.setFrom(new InternetAddress(username));
        }

        // 设置收件人
        String[] toEmails = email.getToEmails();
        if (toEmails != null && toEmails.length != 0) {
            // InternetAddress类表示电子邮件的地址
            InternetAddress[] internetAddressTO = new InternetAddress[toEmails.length];
            for (int i = 0; i < toEmails.length; i++) {
                internetAddressTO[i] = new InternetAddress(toEmails[i]);
            }
            // Message.RecipientType表示收件人的类型,它是Message类中的一个静态内部类
            // TO 收件人 CC 抄送人 BCC 密送人
            message.setRecipients(Message.RecipientType.TO, internetAddressTO);
        }

        // 设置密送人
        String[] bccEmails = email.getBccEmails();
        if (bccEmails != null && bccEmails.length != 0) {
            InternetAddress[] internetAddressBCC = new InternetAddress[bccEmails.length];
            for (int i = 0; i < bccEmails.length; i++) {
                internetAddressBCC[i] = new InternetAddress(bccEmails[i]);
            }
            message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);
        }

        // 设置抄送人
        String[] ccEmails = email.getCcEmails();
        if (ccEmails != null && ccEmails.length != 0) {
            InternetAddress[] internetAddressCC = new InternetAddress[ccEmails.length];
            for (int i = 0; i < ccEmails.length; i++) {
                internetAddressCC[i] = new InternetAddress(ccEmails[i]);
            }
            message.setRecipients(Message.RecipientType.CC, internetAddressCC);
        }

        // 设置发生日期
        message.setSentDate(new Date());

        // 设置邮件主题
        message.setSubject(email.getSubject());

        // 设置纯文本的邮件内容
        message.setText(email.getContent());

        // 保存并生成最终的邮件内容
        message.saveChanges();

        return message;
    }
}

发送结果

收件人邮箱:
JavaMail(一)——发送纯文本内容邮件

密送人邮箱:
JavaMail(一)——发送纯文本内容邮件

抄送人邮箱:
JavaMail(一)——发送纯文本内容邮件