如何在Java中实现邮件发送功能?
在Java中实现邮件发送功能是一项常见的任务,比如注册验证、通知提醒等。Java提供了强大的邮件发送API------JavaMail,能够方便地实现这一功能。
## JavaMail简介
JavaMail是一个用于发送和接收邮件的API。它提供了一个独立于平台的、基于Java的邮件解决方案。我们可以使用JavaMail发送电子邮件,包括文本邮件、HTML邮件以及带附件的邮件。
## 配置JavaMail依赖
首先,需要在项目中添加JavaMail的依赖。假设我们使用Maven进行依赖管理,只需在pom.xml
中添加以下依赖:
xml
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
## 配置邮件服务器
发送邮件需要一个邮件服务器(SMTP服务器)。常用的邮件服务器包括Gmail、QQ邮箱等。在这里,我们以QQ为例,展示如何配置邮件服务器。
开启服务:获取到授权码,在下面示例中使用授权码作为password。
发送示例
发送简单文本邮件
下面是一个发送简单文本邮件的例子:
java
package cn.harry.utils;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* @author harry
* @公众号 Harry技术
*/
public class SimpleEmailSender {
public static void main(String[] args) {
System.setProperty("javax.net.debug", "ssl,handshake");
// 邮件服务器配置
String host = "smtp.qq.com";
final String user = "xxxx@qq.com"; // 发件人邮箱
final String password = "xxxxx"; // 发件人密码
// 收件人邮箱
String to = "xxx@qq.com";
// 配置属性
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
// 获取默认session对象
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
try {
// 创建邮件对象
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject("Test Mail from Java");
message.setText("Hello, word!");
// 发送邮件
Transport.send(message);
System.out.println("Mail sent successfully!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们配置了邮件服务器的属性,使用Session
对象获取邮件会话,并创建了一个简单的文本邮件。最后,使用Transport.send
方法发送邮件。
发送HTML邮件
有时,我们需要发送包含HTML内容的邮件。下面是一个发送HTML邮件的例子:
java
package cn.harry.utils;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
/**
* @author harry
* @公众号 Harry技术
*/
public class HtmlEmailSender {
public static void main(String[] args) {
System.setProperty("javax.net.debug", "ssl,handshake");
// 邮件服务器配置
String host = "smtp.qq.com";
final String user = "XXXX@qq.com"; // 发件人邮箱
final String password = "XXXXX"; // 发件人密码
// 收件人邮箱
String to = "XXXXX@qq.com";
// 配置属性
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
// 获取默认session对象
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
try {
// 创建邮件对象
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject("HTML Mail from Java");
// 设置HTML内容
String htmlContent = "<h1>This is a test HTML mail</h1><p>Hello, this is an HTML mail from Java program!</p>";
message.setContent(htmlContent, "text/html");
// 发送邮件
Transport.send(message);
System.out.println("Mail sent successfully!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们将邮件内容设置为HTML格式,使用message.setContent
方法指定内容类型为text/html
。
发送带附件的邮件
有时,我们需要发送带附件的邮件。下面是一个发送带附件邮件的例子:
java
package cn.harry.utils;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;
/**
* @author harry
* @公众号 Harry技术
*/
public class AttachmentEmailSender {
public static void main(String[] args) {
System.setProperty("javax.net.debug", "ssl,handshake");
// 邮件服务器配置
String host = "smtp.qq.com";
final String user = "XXXX@qq.com"; // 发件人邮箱
final String password = "XXXXX"; // 发件人密码
// 收件人邮箱
String to = "XXXXX@qq.com";
// 配置属性
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
// 获取默认session对象
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
try {
// 创建邮件对象
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject("Mail with Attachment from Java");
// 创建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("This is message body");
// 创建多部分
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// 第二部分是附件
messageBodyPart = new MimeBodyPart();
// 附件路径
String filename = "path-to-file";
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// 设置完整消息
message.setContent(multipart);
// 发送邮件
Transport.send(message);
System.out.println("Mail sent successfully!");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们创建了一个多部分邮件,将邮件内容和附件分别作为消息部分添加到多部分对象中,然后设置邮件内容为这个多部分对象。
问题解决
错误javax.net.ssl.SSLHandshakeException: No appropriate protocol
java发送邮件时报以下错误信息:
yaml
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher
解决办法 修改JDK配置,将TLSv1和TLSv1.1从配置项里去除。配置文件路径在 $JAVA_HOME/jre/lib/security/java.security
,定位到配置文件的
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA 所在行,注释掉原来那行,复制到下方,去掉TLSv1和TLSv1.1,保存。
ini
# Note: This property is currently used by the JDK Reference implementation.
# It is not guaranteed to be examined and used by other implementations.
#
# Example:
# jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048, \
# rsa_pkcs1_sha1
#jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
重新运行java服务进程即可。
结论
通过上述例子,我们展示了如何在Java中实现邮件发送功能,包括发送简单文本邮件、HTML邮件和带附件的邮件,以及使用过程中会出现的问题解决方案。希望这些示例能帮助大家更好地理解和使用JavaMail进行邮件发送。
公众号搜"Harry技术",关注我,带你看不一样的人间烟火!