如何从Java应用程序发送电子邮件

发布于:2021-01-07 17:21:45

0

116

0

Java smtp 电子邮件

您是否知道您的Java应用程序可以与任何可用的SMTP服务器集成以发送电子邮件?本教程介绍了如何通过Java应用程序发送电子邮件,从设置到生成邮件,再到通过Gmail SMTP发送邮件。Jakarta Mail(以前称为Java Mail)可以发送和接收HTML电子邮件,甚至带有附件和图像。

本教程将帮助您掌握使用本地Java库通过SMTP从Java应用程序发送电子邮件的过程。尽管它很简单,但是Jakarta Mail(以前称为JavaMail)使您可以使用SMTP,POP3或IMAP协议发送和接收HTML电子邮件,包括图像和附件。

从设置到生成邮件,再通过Gmail SMTP发送邮件,我们将进行整个过程。

雅加达邮件设置

如果您在2019年7月之前开始使用Java,那么Jakarta Mail名称可能听起来有点陌生。但是从那时起,Java软件已成为Jakarta品牌的一部分。

要安装邮件包,应将jakarta.mail.jar文件添加到CLASSPATH环境中。如果使用Java EE或Jakarta EE,则此文件已包含在软件包中。否则,您可以从Jakarta Mail API官方页面下载它。

另外,您可以使用Maven依赖项来实现它,如下所示:

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

如何使用Gmail配置电子邮件发送

您的Java应用程序可以与任何可用的SMTP服务器集成以发送电子邮件。在这里,我们将演示如何配置Gmail(常用选项之一)。

您应该做的唯一技巧就是允许您的Gmail帐户访问。最简单的方法是在此处启用“允许安全性较低的应用程序”选项。推荐的安全选项是使用oAuth2身份验证。但是,这是一种更高级的方法,需要其他配置。首先,您需要从Google Developers Console获取访问令牌。有关详细说明和说明,请参阅Google文档。

然后,要通过Jakarta Mail访问Gmail服务器,您需要满足以下参数:

import java.util.*;  import javax.mail.*;  import javax.mail.internet.*;  import javax.activation.*;

本文稍后将介绍访问Gmail SMTP的简单方法。

要继续,我们需要导入相关的类并添加属性,尤其是:

  • SendEmail公共类,用于指定电子邮件头

  • javax.mail.PasswordAuthentication类,用于正确的身份验证

  • javax.mail.Transport用于发送消息

  • javax.mail.internet.MimeMessage

  • SMTP设置(主机,端口,用户名和密码),它们定义为props.put

  • message.setText用于简单的纯文本消息

这是完整的代码示例:

package com.example.smtp; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; 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) {  // Add recipient  String to = "test@example.com"; // Add sender  String from = "myusername@gmail.com";  final String username = "myusername@gmail.com";//your Gmail username   final String password = "mypassword";//your Gmail password String host = "smtp.gmail.com"; Properties props = new Properties();  props.put("mail.smtp.auth", "true");  props.put("mail.smtp.starttls.enable", "true");   props.put("mail.smtp.host", host);  props.put("mail.smtp.port", "587"); // Get the Session object  Session session = Session.getInstance(props,  new javax.mail.Authenticator() {  protected PasswordAuthentication getPasswordAuthentication() {  return new PasswordAuthentication(username, password);  }  }); try {  // Create a default MimeMessage object  Message message = new MimeMessage(session);    message.setFrom(new InternetAddress(from));    message.setRecipients(Message.RecipientType.TO,  InternetAddress.parse(to));    // Set Subject  message.setSubject("Hi JAXenter");    // Put the content of your message  message.setText("Hi there,we are just experimenting with JavaMail here"); // Send message  Transport.send(message); System.out.println("Sent message successfully...."); } catch (MessagingException e) {  throw new RuntimeException(e);  }  } }

带有图片和附件的HTML电子邮件

在大多数情况下,电子邮件通知包含格式,文件附件或图像。为此,您必须添加HTML内容。在Jakarta Mail中,您应该使用SendHTMLEmail类MimeMessage.setContent,并指出text / html类型。最好在MimeMultipart(“ alternative”)对象中同时包含HTML和纯文本。

在电子邮件中嵌入图像的最简单方法(例如,公司徽标)是将其上传到可靠的外部服务器,并在HTML代码中引用它,如下所示:

package com.example.smtp;package com.example.smtp;import java.util.Properties; import javax.mail.Message;import javax.mail.MessagingException; import javax.mail.PasswordAuthentication;import javax.mail.Session; import javax.mail.Transport;import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendHTMLEmail {    public static void main(String[ ] args) {       String to = "johndoe@gmail.com";       String from = "yourmail@example.com";       final String username = "yourlogin";       final String password = "yourpassword";       String host = "smtp.example.com";       Properties props = new Properties();       props.put("mail.smtp.auth", "true");       props.put("mail.smtp.starttls.enable", "true");       props.put("mail.smtp.host", host);       props.put("mail.smtp.port", "2525");       // Get the Session object       Session session = Session.getInstance(props,          new javax.mail.Authenticator() {             protected PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication(username, password);             }  });       try {             // Create a default MimeMessage object             Message message = new MimeMessage(session);     message.setFrom(new InternetAddress(from));  message.setRecipients(Message.RecipientType.TO,               InternetAddress.parse(to));  message.setSubject("HTML message with an image and attachment");     // Put your HTML content here as well as refer to the hosted image     message.setContent(               "<p><img src="https://yourserver.com/yourlogo.png" alt="img" /></p> +      <p>Hey, do you like our logo?</p>",              "text/html");     // Send message     Transport.send(message);     System.out.println("Sent message successfully....");       } catch (MessagingException e) {     e.printStackTrace();    throw new RuntimeException(e);       }    } }

另一种方法是使用CID附件。这有点复杂,因为您应该创建MIME多部分/相关消息,然后引用HTML正文中的图像。如果图像不是存储在图像文件中,而是存储在内存中的字节数组中,则也可以使用此方法。

Multipart multipart = new MimeMultipart("related"); MimeBodyPart htmlPart = new MimeBodyPart();  //reference to your image to the HTML body <img src="cid:some-image-cid" alt="img" />  htmlPart.setText(messageBody, "utf-8", "html");  multipart.addBodyPart(htmlPart); MimeBodyPart imgPart = new MimeBodyPart();  // for the image stored in the file  imgPart.attachFile(imageFile);  //for the image stored in a byte array in memory  // imgPart.setDataHandler(new DataHandler(  // new ByteArrayDataSource(bytes, "image/whatever"))); imgPart.setContentID("<some-image-cid">");  multipart.addBodyPart(imgPart); message.setContent(multipart);

最后,让我们在邮件中附加一个文件。不管使用哪种文件类型,都可以通过如下方式将attachFile方法放入MimeBodyPart中来完成:

public static void setAttachment(Message message, String filename) throws MessagingException {  // create a multipart message  Multipart multipart = new MimeMultipart();  BodyPart messageBodyPart = new MimeBodyPart(); // specify your file  DataSource source = new FileDataSource(filename);  messageBodyPart.setDataHandler(new DataHandler(source));  messageBodyPart.setFileName(filename); //Add the file part  multipart.addBodyPart(messageBodyPart);   message.setContent(multipart);

进一步的步骤

在此简短指南中,我们解释了使用Jakarta Mail发送电子邮件的工作方式,并演示了最常见的示例。如果您想深入了解,我们建议您遵循Jakarta Mail FAQ。

如果您需要制作更复杂的HTML电子邮件模板,那么最好使用Spring框架和您更喜欢的模板引擎之一。