本教程将帮助您掌握使用本地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依赖项来实现它,如下所示:
<依赖项>
<依赖性>
<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服务器,您需要满足以下参数:
导入java.util。*;
导入javax.mail。*;
导入javax.mail.internet。*;
导入javax.activation。*;
在本文的后面,我们将介绍访问Gmail SMTP的简单方法。
要继续,我们需要导入相关的类并添加属性,尤其是:
§ SendEmail公共类,用于指定电子邮件头
§ javax.mail.PasswordAuthentication类,用于正确的身份验证
§ javax.mail.Transport用于发送消息
§ javax.mail.internet.Mimemessage
§ SMTP设置(主机,端口,用户名和密码),它们定义为props.put
§ message.setText用于简单的纯文本消息
这是完整的代码示例:
包com.example.smtp;
导入java.util.Properties;
导入javax.mail.Message;
导入javax.mail.MessagingException;
导入javax.mail.PasswordAuthentication;
导入javax.mail.Session;
导入javax.mail.Transport;
导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.MimeMessage;
公共类SendEmail {
公共静态void main(String [] args){
// 添加收件人
字符串=“ test@example.com”;
//添加发件人
来自=“ myusername@gmail.com”的字符串;
final String用户名=“ myusername@gmail.com”; //您的Gmail用户名
最终的字符串密码=“ mypassword”; //您的Gmail密码
字符串主机=“ smtp.gmail.com”;
属性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”);
//获取会话对象
会话会话= Session.getInstance(props,
新的javax.mail.Authenticator(){
受保护的PasswordAuthentication getPasswordAuthentication(){
返回新的PasswordAuthentication(用户名,密码);
}
});
尝试{
//创建一个默认的MimeMessage对象
消息消息=新的MimeMessage(会话);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
//设置主题
message.setSubject(“ Hi JAXenter”);
//放入您的消息内容
message.setText(“嗨,我们只是在这里尝试JavaMail”);
// 发信息
Transport.send(message);
System.out.println(“已成功发送消息。...”);
} catch(MessagingException e){
抛出新的RuntimeException(e);
}
}
}
带有图片和附件的HTML电子邮件
在大多数情况下,电子邮件通知包含格式,文件附件或图像。为此,您必须添加HTML内容。在Jakarta Mail中,您应该使用SendHTMLEmail类MimeMessage.setContent,并指出text / html类型。最好在MimeMultipart(“ alternative”)对象中同时包含HTML和纯文本。
将图像嵌入到电子邮件中的最简单方法(例如,公司徽标)是将其上传到可靠的外部服务器,并在HTML代码中引用它,如下所示:
包com.example.smtp;包com.example.smtp;导入java.util.Properties;
导入javax.mail.Message;导入javax.mail.MessagingException;
导入javax.mail.PasswordAuthentication;导入javax.mail.Session;
导入javax.mail.Transport;导入javax.mail.internet.InternetAddress;
导入javax.mail.internet.MimeMessage;
公共类SendHTMLEmail {
公共静态void main(String [] args){
字符串为=“ johndoe@gmail.com”;
字符串来自=“ yourmail@example.com”;
final String用户名=“ yourlogin”;
final String password =“您的密码”;
字符串主机=“ smtp.example.com”;
属性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”);
//获取会话对象
会话会话= Session.getInstance(props,
新的javax.mail.Authenticator(){
受保护的PasswordAuthentication getPasswordAuthentication(){
返回新的PasswordAuthentication(用户名,密码);
}
});
尝试{
//创建一个默认的MimeMessage对象
消息消息=新的MimeMessage(会话);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(“带有图片和附件的HTML消息”);
//将HTML内容放在此处,并引用托管图片
message.setContent(
“ <p> <img src =” https://yourserver.com/yourlogo.png“ alt =” img“ /> </ p>
<p>嘿,您喜欢我们的徽标吗?</ p>”,
“文本/ html”);
// 发信息
Transport.send(message);
System.out.println(“已成功发送消息。...”);
} catch(MessagingException e){
e.printStackTrace(); 抛出新的RuntimeException(e);
}
}
}
另一种方法是使用CID附件。这有点复杂,因为您应该创建MIME多部分/相关消息,然后引用HTML正文中的图像。如果图像不是存储在图像文件中,而是存储在内存中的字节数组中,则也可以使用此方法。
Multipart multipart =新的MimeMultipart(“ related”);
MimeBodyPart htmlPart =新的MimeBodyPart();
//将图片引用到HTML正文<img src =“ cid:some-image-cid” alt =“ img” />
htmlPart.setText(messageBody,“ utf-8”,“ html”);
multipart.addBodyPart(htmlPart);
MimeBodyPart imgPart =新的MimeBodyPart();
//用于存储在文件中的图像
imgPart.attachFile(imageFile);
//对于存储在内存中的字节数组中的图像
// imgPart.setDataHandler(new DataHandler(
// new ByteArrayDataSource(bytes,“ image / whatever”)));
imgPart.setContentID(“ <some-image-cid”>“);
multipart.addBodyPart(imgPart);
message.setContent(multipart);
最后,让我们在邮件中附加一个文件。不管使用哪种文件类型,都可以通过如下方式将attachFile方法放入MimeBodyPart中来完成:
公共静态无效setAttachment(消息消息,字符串文件名)抛出MessagingException {
//创建多部分消息
Multipart multipart = new MimeMultipart();
BodyPart messageBodyPart =新的MimeBodyPart();
//指定您的文件
DataSource源=新的FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
//添加文件部分
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。
,