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

基础概念

  • 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 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 getImagesMap() {
        return imagesMap;
    }

    public void setImagesMap(Map 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****[email protected]";

    // 发件人在邮箱服务器中的授权码
    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(一)——发送纯文本内容邮件_第1张图片

密送人邮箱:
JavaMail(一)——发送纯文本内容邮件_第2张图片

抄送人邮箱:
JavaMail(一)——发送纯文本内容邮件_第3张图片

你可能感兴趣的:(Java,JavaMail,JavaMail,发邮件,纯文本)