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

1. 电子邮件协议

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

2. JavaMail

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

JavaMail 下载地址:https://github.com/javaee/javamail/releases

特别注意:

本测试用例用的 JavaMail 版本是 1.6.0,如果下载到其他版本的 JavaMail 运行时出现问题,请使用JavaMail 1.6.0版本再进行尝试。

使用JavaMail 1.6.0要求的 JDK 版本必须是JDK 1.7 以上(建议使用最新版 JDK)。

不要直接就完完全全复制我的代码,需要修改一下发送的标题、内容、用户昵称,要不然所有人都直接复制我的代码发送,内容一致,邮箱服务器就可能会检测到这些内容是垃圾广告内容,不让你发送,会返回错误码,查询错误码也能查询到失败原因。

package com.companyserver.service.impl;
@Service
public class EmailServiceImpl implements EmailService {
@Value("${mail.username}")
private StringMAIL_USERNAME;
@Value("${mail.from}")
private StringMAIL_FROM;
@Value("${mail.password}")
private StringMAIL_PASSWORD;
@Value("${mail.host}")
private StringMAIL_HOST;
@Value("${mail.port}")
private StringMAIL_PORT;
//设置配置条件
private Properties generateProperties() {
     Properties properties = System.getProperties();//系统配置
      properties.put("mail.smtp.host",MAIL_HOST);//邮件服务器
       properties.put("mail.smtp.port",MAIL_PORT);//邮件服务器端口
       properties.put("mail.smtp.auth","true");
        properties.put("mail.transport.protocol","smtp");//发送方式
         return properties;
   }
private Session getSession() {
Properties props =this.generateProperties();
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
              return new PasswordAuthentication(MAIL_USERNAME, MAIL_PASSWORD);
          }
     });
     return session;
   }
//发送网页消息
@Override
public voidsendHtml(String to,String subject,String body)throwsMessagingException {
Session session = getSession();
Message message =newMimeMessage(session);
message.setFrom(newInternetAddress(MAIL_FROM));
message.setRecipient(Message.RecipientType.TO, newInternetAddress(to));
message.setSentDate(newDate());//设置邮件消息发送的时间
message.setSubject(subject);//设置邮件发送的端口
//发送简单的文本消息可以这样
//message.setText(body);
//Transport.send(message);
//MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart =newMimeMultipart();
MimeBodyPart messageBodyPart =newMimeBodyPart();//创建一个包含附件内容的MimeBodyPart
//设置HTML内容
messageBodyPart.setContent(body,"text/html; charset=utf-8");
mainPart.addBodyPart(messageBodyPart);
message.setContent(mainPart);
Transport.send(message);
    }
@Override
public voidsendMessage(String to,String subject,String body)throwsMessagingException{
Session session = getSession();
Message message =newMimeMessage(session);
message.setFrom(newInternetAddress(MAIL_FROM));
message.setRecipient(Message.RecipientType.TO, newInternetAddress(to));
message.setSentDate(newDate());//设置邮件消息发送的时间
message.setSubject(subject);
message.setText(body);
Transport.send(message);
     }
}