JavaMail

依赖

      <!--JavaMail基本包-->
      <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
      </dependency>
      <!--邮件发送的扩展包-->
      <dependency>
        <groupId>javax.activation</groupId>
        <artifactId>activation</artifactId>
        <version>1.1.1</version>
      </dependency>

收发代码

  • 邮件消息构建器
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import org.apache.commons.lang3.StringUtils;

// 邮件消息构建器
public class MessageBuilder {

  // 发送者昵称
  private String nick;
  // 接收列表
  private List<String> toList = new ArrayList<>();
  // 抄送列表
  private List<String> ccList = new ArrayList<>();
  // 主题
  private String subject;
  // 邮件内容类型
  private String type;
  // 邮件内容
  private Object content;

  public MessageBuilder nick(String nick) {
    this.nick = nick;
    return this;
  }

  public MessageBuilder to(String to) {
    this.toList.add(to);
    return this;
  }

  public MessageBuilder cc(String cc) {
    this.ccList.add(cc);
    return this;
  }

  public MessageBuilder subject(String subject) {
    this.subject = subject;
    return this;
  }

  public MessageBuilder type(String type) {
    this.type = type;
    return this;
  }

  public MessageBuilder content(String type, Object content) {
    this.type = type;
    this.content = content;
    return this;
  }

  public MessageBuilder content(Object content) {
    this.content = content;
    return this;
  }

  private void check() {
    if (toList == null || toList.isEmpty()) {
      throw new RuntimeException("接收人列表不可为空");
    } else if (subject == null) {
      throw new RuntimeException("邮件主题不可为空");
    }
  }

  public MimeMessage build(Email email) throws MessagingException {
    check();
    MimeMessage message = new MimeMessage(email.getSession());
    String account = email.getAccount();
    if (nick != null) {
      try {
        account = MimeUtility.encodeText(nick) + "<" + account + ">";
      } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
      }
    }
    message.setFrom(new InternetAddress(account));

    String to = StringUtils.join(toList, ",");
    message.setRecipients(Message.RecipientType.TO, to);
    String cc = null;
    if (ccList != null && !ccList.isEmpty()) {
      message.setRecipients(Message.RecipientType.CC, cc = StringUtils.join(ccList, ","));
    }
    message.setSubject(subject);
    if (type == null || type.isEmpty()) {
      message.setText(String.valueOf(content));
    } else {
      message.setContent(content, type);
    }
    message.setSentDate(new Date());
    message.saveChanges();
    System.out.println(String.format("%s 发送邮件给 %s, 主题 %s, 内容 %s", account, to, subject, content));
    return message;
  }

}
  • 邮箱收发器
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.MimeMessage;
import lombok.Getter;

public class Email {

  @Getter
  private final String account;
  @Getter
  protected Session session;
  @Getter
  protected Store store;

  public Email(String account) {
    this.account = account;
  }

  public boolean sendHtmlMessage(MessageBuilder mb) {
    return sendMessage(mb.type("text/html;charset=UTF-8"));
  }

  public boolean sendTextMessage(MessageBuilder mb) {
    return sendMessage(mb.type(null));
  }

  public boolean sendMessage(MessageBuilder mb) {
    long begin = System.currentTimeMillis();
    try {
      MimeMessage message = mb.build(this);
      Transport.send(message);
      System.out.println("发送成功, 耗时 " + (System.currentTimeMillis() - begin) + "ms");
      return true;
    } catch (AddressException e) {
      e.printStackTrace();
    } catch (MessagingException e) {
      e.printStackTrace();
    }
    System.out.println("发送失败, 耗时 " + (System.currentTimeMillis() - begin) + "ms");
    return false;
  }

  public static class Email163 extends Email {

    public Email163(final String account, final String code) {
      super(account);
      String host = "smtp.163.com";
      String port = "25";
      // 获取系统属性
      Properties properties = System.getProperties();
      // 设置邮件服务器
      properties.setProperty("mail.smtp.host", host);
      properties.setProperty("mail.smtp.port", port);
      properties.setProperty("mail.smtp.socketFactory.port", port);
      properties.setProperty("mail.smtp.auth", "true");
      properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
      // 获取默认session对象
      session = Session.getInstance(properties, new Authenticator() {
        // 设置认证账户信息
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(account, code);
        }
      });
      // session.setDebug(true);
      try {
        store = session.getStore("pop3");
        store.connect("pop3.163.com", account, code);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  public static class EmailQQ extends Email {

    public EmailQQ(final String account, final String code) {
      super(account);
      String host = "smtp.qq.com";
      String port = "587";
      // 获取系统属性
      Properties properties = System.getProperties();
      // 设置邮件服务器
      properties.setProperty("mail.smtp.host", host);
      properties.setProperty("mail.smtp.port", port);
      properties.setProperty("mail.smtp.socketFactory.port", port);
      properties.setProperty("mail.smtp.auth", "true");
      properties.setProperty("mail.smtp.socketFactory.class", "SSL_FACTORY");
      // 获取默认session对象
      session = Session.getInstance(properties, new Authenticator() {
        // 设置认证账户信息
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(account, code);
        }
      });
      // session.setDebug(true);
      try {
        store = session.getStore("pop3");
        store.connect("pop.qq.com", account, code);
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  public static void main(String[] args) throws AddressException, MessagingException, IOException {
    Email email;
    email = new Email163("163邮箱", "163授权码");
    email = new EmailQQ("QQ邮箱", "QQ授权码");
    MessageBuilder mb = new MessageBuilder()
        .nick("呵呵")
        .to("906669319@qq.com")
        .subject("test")
        .content("<h1>测试1</h1>");
    email.sendHtmlMessage(mb);

    Folder folder = email.store.getFolder("INBOX"); // 收件箱
    folder.open(Folder.READ_ONLY);
    Message[] messages = folder.getMessages();
    for (Message message : messages) {
      System.out.println("发件人地址: " + Arrays.toString(message.getFrom()));
      System.out.println("收件人地址: " + Arrays.toString(message.getRecipients(RecipientType.TO)));
      System.out.println("抄送人地址: " + Arrays.toString(message.getRecipients(RecipientType.CC)));
      System.out.println("主题: " + message.getSubject());
      System.out.println("发送时间: " + message.getSentDate());
      System.out.println("接收时间: " + message.getReceivedDate());

      Object content = message.getContent();
      System.out.println("邮件内容: " + content);
      System.out.println("邮件大小: " + message.getSize());
    }

  }
}

image-1654704531892

简单连接

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {


  public static void main(String[] args) {
    if (args.length < 2) {
      System.err.println("<标题> <内容>");
      return;
    }
    long beginTime = System.currentTimeMillis();
    String subject = args[0];
    String text = args[1];

    // 发件人电子邮箱
    String from = "aa@bb.cc";
    // 收件人电子邮箱
    String to = "to@bb.cc";
    String username = "aa@bb.cc";
    String password = "aabbcc";
    // 获取系统属性
    Properties props = new Properties();
    // 设置邮件服务器
    props.setProperty("mail.transport.protocol", "smtp");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.host", "smtp.cc.com");
    props.setProperty("mail.smtp.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.socketFactory.fallback", "false");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    // 获取默认session对象
    Session session = Session.getDefaultInstance(props);
    session.setDebug(false);
    try {
      // 创建默认的 MimeMessage 对象
      MimeMessage message = new MimeMessage(session);
      // Set From: 头部头字段
      message.setFrom(new InternetAddress(from));
      // Set To: 头部头字段
      message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
      // Set Subject: 头部头字段
      System.out.println("标题: " + subject);
      message.setSubject(subject);
      // 设置消息体
      System.out.println("内容: " + text);
      message.setText(text);
      Transport transport = session.getTransport();
      transport.connect(username, password);
      // 发送消息
      transport.sendMessage(message, message.getAllRecipients());
      transport.close();
      System.out.println("发送成功, 耗时: " + (System.currentTimeMillis() - beginTime) + " ms");
    } catch (MessagingException mex) {
      mex.printStackTrace();
    }
  }
}