使用JavaMail发送邮件

电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送。本文将简单介绍如果通过 Java 代码来创建电子邮件,并连接邮件服务器发送邮件。

1. 电子邮件协议

  电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。其中邮件的创建和发送只需要用到 SMTP协议,所有本文也只会涉及到SMTP协议。SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件传输协议。

2. JavaMail

  我们平时通过 Java 代码打开一个 http 网页链接时,通常可以使用已经对 http 协议封装好的 HttpURLConnection 类来快速地实现。Java 官方也提供了对电子邮件协议封装的 Java 类库,就是JavaMail,但并没有包含到标准的 JDK 中,需要我们自己去 Java 或 Oracle 官网下载。

  下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.5-oth-JPR

  下载完毕后,解压下载文件,在根目录下找到mail.jar

 

   现在打开Java编辑软件(Eclipse或者MyEclipse),首先建立一个Java项目,把刚才下载好的mail.jar包导入到工程,最好建立一个lib文件夹,然后把jar包Build Path-->Add to Build Path加入环境变量中。

3. 创建一封一个简单的电子邮件

  邮件创建步骤:

  1. 创建一个邮件对象(Mimemessage);
  2. 设置发件人,收件人,可选增加多个收件人,抄送人,密送人;
  3. 设置邮件的主题(标题);
  4. 设置邮件的正文(内容);
  5. 设置显示的发送时间;
  6. 保存到本地。

  代码实现:

import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.Properties;

public class SimpleSendEmail {

    public static void main(String[] args) throws Exception {
        // 1. 创建一封邮件
        Properties props = new Properties();//用于连接邮件服务器的参数配置(发送邮件时才需要用到)
        Session session = Session.getDefaultInstance(props);//根据参数配置,创建会话对象(为了发送邮件准备的)
        MimeMessage message = new MimeMessage(session);//创建邮件对象

        /*
         * 也可以根据已有的eml邮件文件创建 MimeMessage 对象
         * MimeMessage message = new MimeMessage(session, new FileInputStream("MyEmail.eml"));
         */

        // 2. From: 发件人
        //    其中 InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
        //    真正要发送时, 邮箱必须是真实有效的邮箱。
        message.setFrom(new InternetAddress("aa@send.com", "USER_AA", "UTF-8"));

        // 3. To: 收件人
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("cc@receive.com", "USER_CC", "UTF-8"));
        //    To: 增加收件人(可选)
        message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("dd@receive.com", "USER_DD", "UTF-8"));
        //    Cc: 抄送(可选)
        message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("ee@receive.com", "USER_EE", "UTF-8"));
        //    Bcc: 密送(可选)
        message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("ff@receive.com", "USER_FF", "UTF-8"));
        // 4. Subject: 邮件标题
        message.setSubject("邮件标题", "UTF-8");
        // 5. Content: 邮件正文(可以使用html标签)
        message.setContent("这是邮件正文。。。", "text/html;charset=UTF-8");
        // 6. 设置显示的发件时间
        message.setSentDate(new Date());
        // 7. 保存前面的设置
        message.saveChanges();
        // 8. 将该邮件保存到本地
        OutputStream out = new FileOutputStream("MyEmail.eml");
        message.writeTo(out);
        out.flush();
        out.close();
    }
}

  然后在你的项目路径下,产生了一个MyEmail.eml文件,打开文件如图显示:

4. 使用QQ发送电子邮件

  发送邮件首先需要有一个邮箱账号和密码,本文以腾讯QQ邮箱为例,邮箱账号必须要开启 SMTP 服务,在浏览器网页登录邮箱后一般在邮箱的“设置”选项中可以开启,并记下邮箱的 SMTP 服务器地址,如下所示(其他邮箱大同小异):

点击邮箱首页设置

  代码实现:

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;

/**
 * 实现QQ邮箱发送的Demo
 */
public class SendMail {

    public static void main(String[] args) throws GeneralSecurityException {
        final String from = "xxxxxxx@qq.com";//发送方邮箱,填写自己的真实邮箱
        final String password = "这里填写刚才QQ邮箱拿到的授权码";

        String host = "smtp.qq.com";//邮件服务器地址
        Properties properties = new Properties();//参数键值对实例对象
        properties.setProperty("mail.debug", "true");//设置开启debug模式
        properties.setProperty("mail.smtp.host", host);//设置邮件服务器
        properties.put("mail.smtp.ssl.enable", "true");//设置激活SSL验证
        properties.put("mail.smtp.auth", true);//设置用户身份验证
        properties.put("mail.transport.protocol", "smtp");//设置邮件协议
        //得到默认的Session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //通过发送方邮箱号和邮箱授权码创建用户登录验证
                return new PasswordAuthentication(from, password);
            }
        });
//        session.setDebug(true);//设置开启dubug模式,和上面设置一样,会覆盖上面设置
        MimeMessage mimeMessage = new MimeMessage(session);
        try {
            //InternetAddress 的三个参数分别为: 邮箱, 显示的昵称(只用于显示, 没有特别的要求), 昵称的字符集编码
            mimeMessage.setFrom(new InternetAddress(from, "张三", "UTF-8"));//设置发送方邮件地址,必须真实有效
            //设置收件人邮箱号,必须真实有效,不然报错
            mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxx@outlook.com", "收件人", "UTF-8"));
            //设置收件人,必须真实有效,不然报错
            mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxx@139.com", "收件人1", "UTF-8"));
            //增加设置收件人,必须真实有效,不然报错
            mimeMessage.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("xxxxxx@qq.com", "收件人2", "UTF-8"));
            //设置抄送人,必须真实有效,不然报错
            mimeMessage.addRecipient(MimeMessage.RecipientType.CC, new InternetAddress("xxxxxx@163.com", "抄送人", "UTF-8"));
            //设置密送人,必须真实有效,不然报错
            mimeMessage.addRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("xxxxxx@foxmail.com", "密送人", "UTF-8"));

            mimeMessage.setSentDate(new Date());//设置发送邮件时间
            mimeMessage.setSubject("邮件标题", "UTF-8");//设置邮件标题和编码集
            mimeMessage.setContent("邮件正文内容", "text/html;charset=UTF-8");//设置邮件正文内容和内容类型
            Transport.send(mimeMessage);
            System.out.println("邮件发送成功...");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("邮件发送失败...");
        }
    }
}

现在查看收件人的邮箱,发现收到了邮件内容啦,恭喜你成功完成邮箱发送的功能。

posted @ 2017-06-09 10:49  追寻拉夫特尔  阅读(334)  评论(0编辑  收藏  举报