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;
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM