使用Java发送邮件(JavaMail的使用)

邮箱相关的概念

邮件收发协议

发送邮件协议:SMTP(简单邮件传输协议)
接收邮件协议:①IMAP(Internet邮件访问协议)②POP3 (邮局协议版本3)

接收邮件协议IMAP和POP有什么区别?
POP协议允许电子邮件客户端下载服务器上的邮件,但是在电子邮件客户端的操作(如:移动邮件、标记已读等),不会反馈到服务器上。
IMAP协议允许电子邮件客户端下载服务器上的邮件,电子邮件客户端的操作都会反馈到服务器上,也就是说,IMAP是“双向”的。

邮件客户端

网页版:使用浏览器登录邮件进行邮件收发
软件版(邮箱可以长时间保持在线状态,随时收发邮件):QQ邮箱,outlook等。

邮件服务器

邮件服务器:提供邮件收发服务的服务器,包括邮件发送服务器和邮件接收服务器。
邮箱服务器的域名:163邮箱的后缀为163.com,QQ的为qq.com,这个就是域名

网易邮箱(163邮箱)发送/接收邮件服务器地址:

  • SMTP服务器: smtp.163.com
  • POP3服务器: pop.163.com
  • IMAP服务器: imap.163.com

QQ邮箱发送/接收邮件服务器地址:

  • SMTP服务器(端口465或587):smtp.qq.com
  • POP3服务器(端口995):pop.qq.com

邮件收发简要过程

image

有的邮箱客户端,可能要我们自己去收信,请求收件服务器得到邮件。


image
image

使用Java发送邮件(JavaMail的使用)

1.jar包相关

Oracle技术网/Java/ javamail

JavaMail参考实现及jar包下载

image

2.使用案例

这里使用一个找的封装了发送邮件的工具类MailUtils测试,使用第三方邮件客户端,即写的java程序,以QQ邮箱账号发送邮件,在网易的网页版客户端接收这封邮件。

image

  • 发送邮件工具类MailUtils
/**
 * 发送邮件工具类
 */
public final class MailUtils {
    private MailUtils(){}
    /**
     * 发送邮件
     * @param email 收件人的邮箱地址
     * @param subject 邮件主题
     * @param emailMsg 邮件内容
     */
    public static void sendMail(String email, String subject, String emailMsg)
            throws AddressException, MessagingException {
        // 1.[连接发件服务器]创建一个程序与发件人的 发送邮件服务器会话对象 Session
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "SMTP");//邮件发送协议
        props.setProperty("mail.host", "smtp.qq.com");//邮件发送服务器的地址(如QQ邮箱的发件服务器地址SMTP服务器: smtp.qq.com)
        props.setProperty("mail.smtp.auth", "true");//指定验证为true

        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人的用户名(不带后缀的,如QQ邮箱的@qq.com不用写)和授权码(这里一般不使用密码,为避免密码泄露,用授权码代替密码登录第三方邮件客户端)
                //授权码:用于登录第三方邮件客户端的专用密码。  第三方邮件客户端:如这个java程序。
                return new PasswordAuthentication("QQ邮箱地址不带@qq.com", "开启POP3/SMTP服务得到的授权码");
            }
        };

        Session session = Session.getInstance(props, auth);

        
        // 2.[创建一封邮件]创建一个Message,它相当于是邮件内容
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("创建验证器时你用的用户名@qq.com")); // 设置发送者的邮箱地址
        message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者
        message.setSubject(subject);//邮件主题
        message.setContent(emailMsg, "text/html;charset=utf-8");//设置邮件的内容

        // 3.[发送邮件]创建 Transport用于将邮件发送
        Transport.send(message);
    }
}
  • 测试类MailTest
public class MailTest {
   @Test
    public void test1(){
       try {
       /**
         * @param email 收件人的邮箱地址
         * @param subject 邮件主题
         * @param emailMsg 邮件内容
        */
           MailUtils.sendMail("网易邮箱地址@163.com","欢迎回来","哈喽");
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

运行后在网易的网页版客户端接收的邮件:


image

3.使用案例中相关说明

授权码说明:

QQ邮箱获取授权码

网易邮箱获取授权码:


image
image

案例:简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)

你可能感兴趣的:(使用Java发送邮件(JavaMail的使用))