JavaMail API库为开发电子邮件应用程序提供了必要的支持。Spring改进了这个构思,并提供了一个极好的支持。通过移除Java应用程序中支持电子邮件的许多冗余属性,简化了该技术。本文深入研究了API、JavaMail和Spring,并用一个简单的电子邮件应用程序展示了它们的独特性。
编者注:在此文本中统一使用术语“e-mail”,但在后面的代码中使用术语“e mail”。这不应该引起任何混淆。
概述
E-mail有很多用途,特别是在这个时时交流及通信和全球网络时代。例如,通过订阅网站的特定特性,我们可以通过E-mails接收更新的订阅主题。E-mails允许我们发送通知,业务订单,定期报告,以及一些垃圾邮件。它们无疑是有用的,但也有许多误用的例子。在一个典型的e-mail应用程序中,e-mail由客户端组成,发送到服务器,传递到目的地,然后由客户端发回响应。Java消息传递系统可使这种通信异步进行。
JavaMail API是Oracle阿森纳的电子邮件支持库。它非常强大,但是使用起来很简单。这组类和接口使我们能够发送和接收e-mail,其可以扩展到与邮件系统相关的不同协议。
Spring简化了全栈e-mail支持的API,并最小化了底层邮件系统规范的影响。也许JavaMail API和Spring e-mail支持之间最显著的区别在于其后对构思的简化,而没有其他的。事实上,JavaMail API没有任何问题。如果前者简单,Spring使其更简单。这就是全部。
经由JavaMail API的E-mail
JavaMail不仅具有平台独立性,而且也是一种与协议无关的API。
这意味着,无论邮件系统使用的底层协议是什么,都可以相应地设置它来与系统一起工作。特别是,编写e-mail应用程序时要遵循的一组步骤大致相同:
提供连接电子邮件服务器的用户名和密码。
创建消息,提供收件人地址。
添加附件,如果有的话。
将消息发送到电子邮件服务器。
在JavaX.mail和JavaX.Mel.Internet包中找到所需的类和接口。一些关键类如下:
验证器:这是一个可在JavaX.mail包中找到的抽象类。此类的对象负责e-mail提供者的身份验证。这个类的实例是通过调用getPasswordAuthentication()方法创建的。
密码验证:可在javax.mail包中找到。它是验证者的用户名和密码持有者类。
网络地址:可在javax.mail.internet包中找到。该类的一个实例表示根据RFC822的语法规范的Internet电子邮件地址。
消息:可在javax.mail包中找到。这是电子邮件的模型抽象类。是通过对其进行子类化来实现的。
MimeMessage:可在javax.mail.internet中找到。此类的一个实例表示MIME样式的电子邮件消息。负责发送电子邮件的协议称为SMTP(简单邮件传输协议)。
会话:这是javax.mail包中的最后一个类。该类不能被子类化并表示邮件会话。
传输:这是在javax.mail包中可找到的一个抽象类,它可为消息传输进行建模。
一个简单举例
邮件主机提供程序的特定属性是通过使用称为属性的实用程序类的实例来设置的。这些属性使我们能够连接到主机SMTP服务器,在我们的例子中是Gmail。使用用户名和密码证书创建会话对象。使用MimeMessage对象设置发送方的电子邮件地址、接收方的电子邮件地址、消息的主题和消息的内容。最后,使用传输类提供的称为send()的静态方法发送消息。
package org.mailerapp.demo;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SimpleMailer {
public static void sendMailUsingTLS(String host,
String username, String password, String from,
String to, String subject, String text) {
Properties properties = new Properties();
properties.put("mail.smtp.host", host);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.port", "587");
sendMail(properties, username, password, from, to,
subject, text);
}
public static void sendMailUsingSSL(String host,
String username, String password, String from,
String to, String subject, String text) {
Properties properties = new Properties();
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.socketFactory.port", "465");
properties.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.port", "465");
sendMail(properties, username, password, from, to,
subject, text);
}
public static void sendMail(Properties properties,
String username, String password,
String fromEmailAddress, String toEmailAddress,,
String subject String messageText) {
Session session = Session.getInstance(properties,
new Authenticator() {
@Override
protected PasswordAuthentication
getPasswordAuthentication() {
return new PasswordAuthentication(username,
password);
}
});
try {
Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(fromEmailAddress));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(toEmailAddress));
msg.setSubject(subject);
msg.setText(messageText);
Transport.send(msg);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
String host = "smtp.gmail.com";
String username = "from-myemail1@gmail.com";
String password = "******";
String fromAddress = "from-myemail1@gmail.com";
String toAddress = "to-myemail2@gmail.com";
String subject = "Test mail";
String text = "This is a sample message. Thank you.";
SimpleMailer.sendMailUsingTLS(host, username, password,
fromAddress, toAddress, subject, text);
SimpleMailer.sendMailUsingSSL(host, username, password,
fromAddress, toAddress, subject, text);
}
}
列表1:使用JavaMail API支持的电子邮件
通过JavaMail的Spring API实现电子邮件功能
电子邮件支持的Spring类分为两个包:org.springframework.mail和org.springframework.mail.javamail. API提供了清理操作、初始化和异常的支持。
org.springframework.mailis是Spring电子邮件支持的根级包,发送电子邮件最重要的接口是MailSender。该包包含检查异常的类层次结构。
org.springframework.mail.javamail包包含具有MIME消息支持的JavaMaMeServer接口。
这些软件包的一些关键类和接口如下:
MailSender:这是一个接口,它定义了发送简单e-mails的方法,例如简单的文本e-mails。为了整合MIME消息,提供了另一个接口,称为JavaMailSender,它是这个接口的扩展。
MailMessage:这是所有e-mail消息的一个通用接口,不管消息的类型如何,如简单的测试消息或更复杂的MIME消息。
邮件异常:基础异常类处理所有邮件引发的异常。
SimpleMailMessage:这个类表示一个简单的消息,包括数据,比如from、to、cc、subject和文本消息内容。
JavaMailSenderImpl:这是发送简单邮件以及MIME消息的核心类。它是MailSender接口的一种实现方式。
MimeMailMessage:这是JavaMail MIME消息的MailMessage接口的实现。
MimeMessageHelper:这是一个用于填充MIME消息的助手类。例如,它支持HTML文本内容、内联内容(如图像)、典型邮件附件等。
一个简单例子
这与前一个程序几乎相同,只是我们使用Spring邮件API来说明这个构思。这里,e-mail主机的属性在application.properties文件中提供。其可以在XML文件或数据库中提供,而无需任何修改。有关API的更多细节描述,请参阅Spring API API JavaDoc。
org.springframework.boot
spring-boot-starter-mail
列表2:pom.xml Spring 引导的依赖关系
package org.mailerapp.demo;
public class Email {
private String from;
private String to;
private String subject;
private String messageText;
public Email() {
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMessageText() {
return messageText;
}
public void setMessageText(String messageText) {
this.messageText = messageText;
}
}
列表3:一个简单的POJO来承载电子邮件内容和属性
package org.mailerapp.demo;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Service
public class EmailService {
private JavaMailSender javaMailSender;
public void sendMail(final Email email){
SimpleMailMessage simpleMailMessage=new SimpleMailMessage();
simpleMailMessage.setSubject(email.getSubject());
simpleMailMessage.setFrom(email.getFrom());
simpleMailMessage.setTo(email.getTo());
simpleMailMessage.setText(email.getMessageText());
javaMailSender.send(simpleMailMessage);
}
public void sendMailWithAttachment(final Email email,
String filePath) throws Exception{
MimeMessage mimeMessage=javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper=new
MimeMessageHelper(mimeMessage,true);
mimeMessageHelper.setSubject(email.getSubject());
mimeMessageHelper.setFrom(email.getFrom());
mimeMessageHelper.setTo(email.getTo());
mimeMessageHelper.setText(email.getMessageText());
FileSystemResource file=new FileSystemResource(new
File(filePath));
mimeMessageHelper.addAttachment("Sample File",file);
javaMailSender.send(mimeMessage);
}
}
列表4:提供e-mail服务的服务类
package org.mailerapp.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure
.SpringBootApplication;
@SpringBootApplication
public class SimpleMailerWithSpring {
@Autowired
private static EmailService emailService;
public static void main(String[] args) throws Exception {
SpringApplication.run(SimpleMailerWithSpring.class, args);
Email email = new Email();
email.setFrom("from-mail1@gmail.com");
email.setTo("to-mail2@mgmail.com");
email.setSubject("This is a test mail");
email.setMessageText("This is a sample text message.");
emailService.sendMailWithAttachment(email,
"./samplepic.jpg");
}
}
Listing 5: Initiating Spring boot application
清单5:启动Spring引导应用程序
spring.mail.host=smtp.gmail.com
spring.mail.username=username@gmail.com
spring.mail.password=******
spring.mail.port=587
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
Listing 6: application.properties
结论
Spring框架提供了一个可以集成到任何Java应用程序中的邮件支持实用工具。它帮助程序员非常有效地处理底层资源,并且避免了在后台使用的邮件系统类型的许多复杂操作。有很多可以用Spring和JavaMail API来完成的。在这里,我们只进行了最简单的介绍。