JavaMail邮件管理

RFC882文档说明

RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔。

邮件头包含的内容有:

  • from字段   --用于指明发件人
  • to字段    --用于指明收件人
  • subject字段 --用于说明邮件主题
  • cc字段    -- 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁
  • bcc字段    -- 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁

邮件体指的就是邮件的具体内容。

MIME协议

在我们的实际开发当中,一封邮件既可能包含图片,又可能包含有附件,在这样的情况下,RFC882文档规定的邮件格式就无法满足要求了。

MIME协议是对RFC822文档的升级和补充,它描述了如何生产一封复杂的邮件。通常我们把MIME协议描述的邮件称之为MIME邮件。MIME协议描述的数据称之为MIME消息。

对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。

TLS和SSL协议

SSL协议

SSL(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。

SSL协议提供的服务主要有:

  1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;

  2. 加密数据以防止数据中途被窃取;

  3. 维护数据的完整性,确保数据在传输过程中不被改变。

TLS协议

TLS(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

SSL协议和TLS协议的关系

最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。

TLS与SSL的差异,简单的理解就是并列关系,其主要的差异体现在一下几个方面:

1)版本号:TLS记录格式与SSL记录格式相同,但版本号的值不同,TLS的版本1.0使用的版本号为SSLv3.1。

2)报文鉴别码:SSLv3.0和TLS的MAC算法及MAC计算的范围不同。TLS使用了RFC-2104定义的HMAC算法。SSLv3.0使用了相似的算法,两者差别在于SSLv3.0中,填充字节与密钥之间采用的是连接运算,而HMAC算法采用的是异或运算。但是两者的安全程度是相同的。

3)伪随机函数:TLS使用了称为PRF的伪随机函数来将密钥扩展成数据块,是更安全的方式。

4)报警代码:TLS支持几乎所有的SSLv3.0报警代码,而且TLS还补充定义了很多报警代码,如解密失败(decryption_failed)、记录溢出(record_overflow)、未知CA(unknown_ca)、拒绝访问(access_denied)等。

5)密文族和客户证书:SSLv3.0和TLS存在少量差别,即TLS不支持Fortezza密钥交换、加密算法和客户证书。

6)certificate_verify和finished消息:SSLv3.0和TLS在用certificate_verify和finished消息计算MD5和SHA-1散列码时,计算的输入有少许差别,但安全性相当。

7)加密计算:TLS与SSLv3.0在计算主密值(master secret)时采用的方式不同。

8)填充:用户数据加密之前需要增加的填充字节。在SSL中,填充后的数据长度要达到密文块长度的最小整数倍。而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),这种方式可以防止基于对报文长度进行分析的攻击。

公共邮箱安全参数

我们在客户端设置邮箱或者JavaMail编程的时候,我们都会去查找这些公网邮箱的 IMAP/SMTP/POP3 地址,这里总结了主流的邮件服务商关于IMAP/SMTP/POP3 地址和端口的参数设置。

Gmail的IMAP/SMTP/POP3 地址

QQMail的IMAP/SMTP/POP3地址

QQMail 的 IMAP/SMTP/POP3 协议默认是不开启的,你需要登陆到 QQ邮箱,然后到“设置” > “账户” 将其开启。

163邮箱的IMAP/SMTP/POP3地址

阿里云邮箱的IMAP/SMTP/POP3地址

获取邮箱授权码

以QQ邮箱为例。

进入【QQ邮箱】,点击上面【设置】,如下图所示。

在【邮件设置】页面,点击【账户】,如下图所示。

鼠标往下拉,找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】,点击【生成授权码】,如下图所示。

根据页面弹框提示,使用手机编辑短信,发送【配置邮件客户端】至1069070069,然后回到电脑页面,点击【我已发送】,如下图所示。

最后生成授权码成功,如下图所示。

使用JavaMail创建邮件和发送邮件

JavaMail创建的邮件是基于MIME协议的。因此可以使用JavaMail创建出包含图片,包含附件的复杂邮件。

<!--java mail-->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

JavaMail API

JavaMail API 按照功能可以划分为如下三大类:

①、创建和解析邮件的API

②、发送邮件的API

③、接收邮件的API

以上三种类型的API在JavaMail 中由多个类组成,但是主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。 

①、Message 类:javax.mail.Message 类是创建和解析邮件的核心 API,这是一个抽象类,通常使用它的子类javax.mail.internet.MimeMessage 类。它的实例对象表示一份电子邮件。客户端程序发送邮件时,首先使用创建邮件的 JavaMail API 创建出封装了邮件数据的 Message 对象,然后把这个对象传递给邮件发送API(Transport 类) 发送。客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message 类的实例中,客户端程序在使用邮件解析API从这个对象中解析收到的邮件数据。

②、Transport 类:javax.mail.Transport 类是发送邮件的核心API 类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如 SMTP 协议,客户端程序创建好 Message 对象后,只需要使用邮件发送API 得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调用它的发送方法,就可以把邮件发送给指定的 SMTP 服务器。

③、Store 类:javax.mail.Store 类是接收邮件的核心 API 类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如 POP3 协议,客户端程序接收邮件时,只需要使用邮件接收 API 得到 Store 对象,然后调用 Store 对象的接收方法,就可以从指定的 POP3 服务器获得邮件数据,并把这些邮件数据封装到表示邮件的 Message 对象中。

④、Session 类:javax.mail.Session 类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,例如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session 对象根据这些信息构建用于邮件收发的 Transport 和 Store 对象,以及为客户端创建 Message 对象时提供信息支持。

发送一封只包含文本的简单邮件

/**
 * @ClassName: Sendmail
 * @Description: 发送Email
 */
public class Sendmail {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        prop.setProperty("mail.smtp.port", "25");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
        ts.connect("smtp.qq.com", "9938860@qq.com", "jjphsbdiiqsabfdc");
        //4、创建邮件
        Message message = createSimpleMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createSimpleMail
     * @Description: 创建一封只包含文本的邮件
     */
    public static MimeMessage createSimpleMail(Session session)
            throws Exception {
        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("9938860@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("9938860@qq.com"));
        //邮件的标题
        message.setSubject("只包含文本的简单邮件");
        //邮件的文本内容
        message.setContent("你好啊!", "text/html;charset=UTF-8");
        //返回创建好的邮件对象
        return message;
    }
}

如何想开启ssl协议: 

/**
 * @ClassName: Sendmail
 * @Description: 发送Email
 */
public class Sendmail {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");

        //开启ssl协议
        prop.setProperty("mail.smtp.ssl.enable", "true");
        prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        prop.setProperty("mail.smtp.socketFactory.fallback", "false");
        prop.setProperty("mail.smtp.port", "25");
        prop.setProperty("mail.smtp.socketFactory.port", "465");

        //1、创建session
        MailAuthenticator authenticator = new MailAuthenticator("9938860@qq.com", "jjphsbdiiqsabfdc"); //验证
        Session session = Session.getInstance(prop, authenticator);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。
        ts.connect("smtp.qq.com", "9938860@qq.com", "jjphsbdiiqsabfdc");
        //4、创建邮件
        Message message = createSimpleMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createSimpleMail
     * @Description: 创建一封只包含文本的邮件
     */
    public static MimeMessage createSimpleMail(Session session)
            throws Exception {
        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("9938860@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("9938860@qq.com"));
        //邮件的标题
        message.setSubject("只包含文本的简单邮件");
        //邮件的文本内容
        message.setContent("你好啊!", "text/html;charset=UTF-8");
        //返回创建好的邮件对象
        return message;
    }

    /**
     * 邮箱登录验证
     *
     */
    private static class MailAuthenticator extends Authenticator {

        /**
         * 用户名(登录邮箱)
         */
        private String username;

        /**
         * 密码
         */
        private String password;

        /**
         * 初始化邮箱和密码
         * @param username 邮箱
         * @param password 密码
         */
        public MailAuthenticator(String username, String password) {
            this.username = username;
            this.password = password;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
        }
    }
}

发送包含内嵌图片的邮件

 

public class SendImageMail {
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证
        ts.connect("smtp.qq.com", "9938860@qq.com", "jjphsbdiiqsabfdc");
        //4、创建邮件
        Message message = createImageMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @Method: createImageMail
     * @Description: 生成一封邮件正文带图片的邮件
     * @Anthor:孤傲苍狼
     *
     * @param session
     * @return
     * @throws Exception
     */
    public static MimeMessage createImageMail(Session session) throws Exception {
        //创建邮件
        MimeMessage message = new MimeMessage(session);
        // 设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("9938860@qq.com"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("9938860@qq.com"));
        //邮件标题
        message.setSubject("带图片的邮件");

        // 准备邮件数据
        // 准备邮件正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件", "text/html;charset=UTF-8");
        // 准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("mail/src/qq.png"));
        image.setDataHandler(dh);
        image.setContentID("xxx.jpg");
        // 描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();
        //将创建好的邮件写入到E盘以文件的形式进行保存
        message.writeTo(new FileOutputStream("E:\\ImageMail.eml"));
        //返回创建好的邮件
        return message;
    }
}

发送包含附件的邮件

public class SendAttachmentMail {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、连上邮件服务器
        ts.connect("smtp.qq.com", "9938860@qq.com", "jjphsbdiiqsabfdc");
        //4、创建邮件
        Message message = createAttachMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createAttachMail
     * @Description: 创建一封带附件的邮件
     * @Anthor:孤傲苍狼
     */
    public static MimeMessage createAttachMail(Session session) throws Exception {
        MimeMessage message = new MimeMessage(session);

        //设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("9938860@qq.com"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("9938860@qq.com"));
        //邮件标题
        message.setSubject("JavaMail邮件发送测试");

        //创建邮件正文,为了避免邮件正文中文乱码问题,需要使用charset=UTF-8指明字符编码
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("使用JavaMail创建的带附件的邮件", "text/html;charset=UTF-8");

        //创建邮件附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("mail/src/qq.png"));
        attach.setDataHandler(dh);
        attach.setFileName(dh.getName());  //

        //创建容器描述数据关系
        MimeMultipart mp = new MimeMultipart();
        mp.addBodyPart(text);
        mp.addBodyPart(attach);
        mp.setSubType("mixed");

        message.setContent(mp);
        message.saveChanges();
        //将创建的Email写入到E盘存储
        message.writeTo(new FileOutputStream("E:\\attachMail.eml"));
        //返回生成的邮件
        return message;
    }
}

发送包含内嵌图片和附件的复杂邮件

 

public class SendComplexMail {
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、连上邮件服务器
        ts.connect("smtp.qq.com", "9938860@qq.com", "jjphsbdiiqsabfdc");
        //4、创建邮件
        Message message = createMixedMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createMixedMail
     * @Description: 生成一封带附件和带图片的邮件
     * @Anthor:孤傲苍狼
     */
    public static MimeMessage createMixedMail(Session session) throws Exception {
        //创建邮件
        MimeMessage message = new MimeMessage(session);

        //设置邮件的基本信息
        message.setFrom(new InternetAddress("9938860@qq.com"));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("9938860@qq.com"));
        message.setSubject("带附件和带图片的的邮件");

        //正文
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("xxx这是女的xxxx<br/><img src='cid:aaa.jpg'>", "text/html;charset=UTF-8");

        //图片
        MimeBodyPart image = new MimeBodyPart();
        image.setDataHandler(new DataHandler(new FileDataSource("mail/src/qq.png")));
        image.setContentID("aaa.jpg");

        //附件1
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource("mail/src/qq.png"));
        attach.setDataHandler(dh);
        attach.setFileName(dh.getName());

        //附件2
        MimeBodyPart attach2 = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource("mail/src/qq.png"));
        attach2.setDataHandler(dh2);
        attach2.setFileName(MimeUtility.encodeText(dh2.getName()));

        //描述关系:正文和图片
        MimeMultipart mp1 = new MimeMultipart();
        mp1.addBodyPart(text);
        mp1.addBodyPart(image);
        mp1.setSubType("related");

        //描述关系:正文和附件
        MimeMultipart mp2 = new MimeMultipart();
        mp2.addBodyPart(attach);
        mp2.addBodyPart(attach2);

        //代表正文的bodypart
        MimeBodyPart content = new MimeBodyPart();
        content.setContent(mp1);
        mp2.addBodyPart(content);
        mp2.setSubType("mixed");

        message.setContent(mp2);
        message.saveChanges();

        message.writeTo(new FileOutputStream("E:\\MixedMail.eml"));
        //返回创建好的的邮件
        return message;
    }
} 

Apache Commons Email

Email类图:

示例:

public class CommonEmailTest {

    /**
     * 简单文本邮件
     *
     * @throws EmailException
     */
    @Test
    public void testSimpleEmail() throws EmailException {
        Email email = new SimpleEmail();
        email.setHostName("smtp.qq.com");
        email.setSmtpPort(465);
        email.setAuthenticator(new DefaultAuthenticator("993884811@qq.com", "kjphsbdiiqsabfdc"));
        email.setSSLOnConnect(true);
        email.setCharset("UTF-8");
        email.setSubject("TestMail");
        email.setFrom("993884811@qq.com");
        email.setMsg("你好,This is a test mail ... :-)");
        email.addTo("993884811@qq.com");
        email.setDebug(true);
        email.send();
        System.out.println("Success!");
    }

    /**
     * 带附件的电子邮件
     *
     * @throws EmailException
     */
    @Test
    public void testAttachmentsEmail() throws EmailException {
        // Create the attachment
        EmailAttachment attachment = new EmailAttachment();
        attachment.setPath("D:\\IdSpace\\alldemo\\mail\\src\\test\\resources\\qq.png");
        attachment.setDisposition(EmailAttachment.ATTACHMENT);
        attachment.setDescription("Picture of Yves"); // 附件描述,无实际意义
        attachment.setName("qq.jpg"); // 设置附件名称
        // attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif")); //附件可以是网络资源

        // Create the email message
        MultiPartEmail email = new MultiPartEmail();
        email.setHostName("smtp.qq.com");
        email.addTo("993884811@qq.com", " harvey");
        email.setFrom("993884811@qq.com", " harvey");
        email.setSubject("The picture");
        email.setMsg("Here is the picture you wanted");

        // Authenticator
        email.setSSLOnConnect(true);
        email.setSmtpPort(465);
        email.setAuthenticator(new DefaultAuthenticator("993884811@qq.com", "kjphsbdiiqsabfdc"));

        // add the attachment
        email.attach(attachment);

        email.setDebug(true);
        email.send();

        System.out.println("Success!");
    }

    /**
     * HTML格式的邮件
     * @throws MalformedURLException
     * @throws EmailException
     */
    @Test
    public void testHtmlEmail() throws MalformedURLException, EmailException {
        // Create the email message
        HtmlEmail email = new HtmlEmail();
        email.setHostName("smtp.qq.com");
        email.addTo("993884811@qq.com", "harvey");
        email.setFrom("993884811@qq.com", "993884811");
        email.setSubject("Test email with inline image");
        email.setAuthenticator(new DefaultAuthenticator("993884811@qq.com", "kjphsbdiiqsabfdc"));

        // embed the image and get the content id
        URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
        String cid = email.embed(url, "Apache logo"); // 该字符串是随机生成的标识符,必须用于引用图像标签中的图像。
        System.out.println(cid);

        // set the html message
        email.setHtmlMsg("<html>The apache logo - <img src=\"cid:" + cid + "\"></html>");

        // set the alternative message
        email.setTextMsg("Your email client does not support HTML messages");// 注意:setHtmlMsg或者setTextMsg
        // 而不是setMsg方法

        // send the email
        email.send();
        email.setDebug(true);

        System.out.println("Success!");
    }
}

说明:

  • JavaMail API支持一个调试选项,如果遇到问题可能会非常有用。您可以通过调用setDebug(true)来激活任何邮件类的调试。
  • 如果您需要向SMTP服务器进行身份验证,则可以在发送电子邮件之前调用 setAuthentication(userName,password)方法。这将创建一个DefaultAuthenticator的实例,在邮件发送时这个实例 将被JavaMail API使用。您的服务器必须支持RFC2554才能正常工作。如果需要更复杂的身份验证方法,例如通过创建javax.mail.Authenticator对象的子类来向用户显示对话框 。需要重写getPasswordAuthentication()方法,将在其中处理收集用户的信息。要使用自定义的认证类,需要使用 Email.setAuthenticator(final Authenticator newAuthenticator)方法进行设置。

  • 在使用公共SMTP服务器时,不应使用普通的SMTP协议,而应该使用加密协议。通常在默认情况下会是不进行安全检查的()默认情况下是禁用),在编写程序时,我们可以通过代码设置来强制执行以下安全检查:
    • 使用安全传输(STARTTLS或SSL)时,可以通过调用Email.setSSLCheckServerIdentity(true)强制验证服务器的证书。或者Email实例对象的setSSLOnConnect(true)方法来设置。

    • 通过调用Email.setStartTLSRequired(true)来强制使用STARTTLS。或者Email实例对象的setStartTLSEnabled (true)方法来设置。

 

posted @ 2022-09-30 08:42  残城碎梦  阅读(199)  评论(0编辑  收藏  举报