发布于:2021-01-07 17:21:45
0
116
0
您是否知道您的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框架和您更喜欢的模板引擎之一。
作者介绍