java实现邮件发送

介绍

发送邮件是一个很常见的需求,如用户注册,用户密码修改,密码找回等。今天我们看一下使用JavaSE和Spring实现发送邮件的功能。

邮件协议

SMTP协议是基于TCP/IP的一个应用层协议,类似于HTTP,全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。我们通过邮件客户端或程序发送邮件时就用到了该协议。
而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3服务器之间的通信规则。我们通过邮件客户端查看邮件时就用到了该协议。
IMAP(Internet Message Access Protocol)协议是对POP3协议的一种扩展,功能更强,作用类似。

发送前准备

发送前需要获取邮箱的授权码,以网易126邮箱为例

使用JavaSE发送简单邮件

添加maven依赖

<dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
</dependency>

发送邮件

public class Client {

  public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    //设置邮件地址
    props.put("mail.smtp.host", "smtp.126.com");
    //开启认证
    props.put("mail.smtp.auth", "true");
    Session session = Session.getDefaultInstance(props, null);
    Transport transport = session.getTransport();
    //用户名
    String user = "xxx@126.com";
    //授权码
    String password = "xxx";
    transport.connect(user, password);
    //创建邮件消息
    MimeMessage msg = new MimeMessage(session);
    msg.setSentDate(new Date());
    //邮件发送人
    InternetAddress fromAddress = new InternetAddress(user, "邮件服务");
    msg.setFrom(fromAddress);
    //邮件接收人
    String to = "xxx@163.com";
    InternetAddress[] toAddress = new InternetAddress[]{new InternetAddress(to)};
    msg.setRecipients(Message.RecipientType.TO, toAddress);
    //邮件主题
    msg.setSubject("测试邮件发送", "UTF-8");
    //邮件内容和格式
    msg.setContent("this is a test mail", "text/html;charset=UTF-8");
    msg.saveChanges();
    //发送
    transport.sendMessage(msg, msg.getAllRecipients());
  }

}

发送带附件的邮件

public class Client {

  public static void main(String[] args) throws Exception {
    Properties props = new Properties();
    //设置邮件地址
    props.put("mail.smtp.host", "smtp.126.com");
    //开启认证
    props.put("mail.smtp.auth", "true");
    Session session = Session.getDefaultInstance(props, null);
    Transport transport = session.getTransport();
    //用户名
    String user = "xxx@126.com";
    //授权码
    String password = "xxx";
    transport.connect(user, password);
    //创建邮件消息
    MimeMessage msg = new MimeMessage(session);
    msg.setSentDate(new Date());
    //邮件发送人
    InternetAddress fromAddress = new InternetAddress(user, "邮件服务");
    msg.setFrom(fromAddress);
    //邮件接收人
    String to = "xxx@163.com";
    InternetAddress[] toAddress = new InternetAddress[]{new InternetAddress(to)};
    msg.setRecipients(Message.RecipientType.TO, toAddress);
    //邮件主题
    msg.setSubject("测试邮件发送", "UTF-8");
    //内容和附件
    Multipart multipart = new MimeMultipart();
    //内容
    BodyPart contentBodyPart = new MimeBodyPart();
    contentBodyPart.setContent("this also is a test mail", "text/html;charset=UTF-8");
    multipart.addBodyPart(contentBodyPart);
    //附件
    BodyPart fileBody = new MimeBodyPart();
    DataSource source = new FileDataSource("D:/a.png");
    fileBody.setDataHandler(new DataHandler(source));
    fileBody.setFileName("测试附件.png");
    multipart.addBodyPart(fileBody);
    //邮件内容
    msg.setContent(multipart);
    msg.saveChanges();
    //发送
    transport.sendMessage(msg, msg.getAllRecipients());
  }

}

使用Spring发送简单邮件

spring在原有的基础上又封装了一层,简化了开发。

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>5.1.2.RELEASE</version>
</dependency>
<dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
</dependency>
public class Client {

  public static void main(String[] args) throws Exception {
    JavaMailSender mailSender = createJavaMailSender();
    //创建邮件消息
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
    //发送人
    messageHelper.setFrom("xxx@126.com", "邮件服务");
    //收件人
    messageHelper.setTo("xxx@163.com");
    //主题
    messageHelper.setSubject("测试邮件发送");
    //发送时间
    messageHelper.setSentDate(new Date());
    //发送内容
    messageHelper.setText("this is a test mail by spring");
    mailSender.send(mimeMessage);
  }

  private static JavaMailSender createJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setDefaultEncoding(StandardCharsets.UTF_8.name());
    String username = "xxx@126.com";
    //设置用户名
    mailSender.setUsername(username);
    //设置授权码
    mailSender.setPassword("xxx");
    Properties props = new Properties();
    //设置邮件地址
    props.put("mail.smtp.host", "smtp.126.com");
    //开启认证
    props.put("mail.smtp.auth", "true");
    mailSender.setJavaMailProperties(props);
    return mailSender;
  }
}

使用Spring发送带附件的邮件

public class Client {

  public static void main(String[] args) throws Exception {
    JavaMailSender mailSender = createJavaMailSender();
    //创建邮件消息
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    //multipart为true表示可以带附件
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
    //发送人
    messageHelper.setFrom("xxx@126.com", "邮件服务");
    //收件人
    messageHelper.setTo("xxx@163.com");
    //主题
    messageHelper.setSubject("测试邮件发送");
    //发送时间
    messageHelper.setSentDate(new Date());
    //发送内容
    messageHelper.setText("this is a test mail by spring");
    //添加附件
    messageHelper.addAttachment("测试附件.png", new FileDataSource("D:/a.png"));
    mailSender.send(mimeMessage);
  }

  private static JavaMailSender createJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setDefaultEncoding(StandardCharsets.UTF_8.name());
    String username = "xxx@126.com";
    //设置用户名
    mailSender.setUsername(username);
    //设置授权码
    mailSender.setPassword("xxx");
    Properties props = new Properties();
    //设置邮件地址
    props.put("mail.smtp.host", "smtp.126.com");
    //开启认证
    props.put("mail.smtp.auth", "true");
    mailSender.setJavaMailProperties(props);
    return mailSender;
  }
}
posted @ 2020-10-25 23:58  strongmore  阅读(1405)  评论(0编辑  收藏  举报