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

本教程将帮助您掌握使用本地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用于简单的纯文本消息

还请参见: 2019年八月世界现状:Python首次超过Java

这是完整的代码示例:

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中,您应该使用SendHTMLEmailMimeMessage.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

还请参见: 2019年的Java状态:“变化率比以往任何时候都高”

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

有关使用Java发送电子邮件的完整文章最初发布在Mailtrap博客上。

翻译自: https://jaxenter.com/java-app-emails-smtp-server-164144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值