使用Java实现邮件发送功能,邮件发送API JavaMail

使用Java实现邮件发送功能,邮件发送API JavaMail

在Java中实现邮件发送功能是一项常见的任务,比如注册验证、通知提醒等。Java提供了强大的邮件发送API——JavaMail,能够方便地实现这一功能。

## JavaMail简介JavaMail是一个用于发送和接收邮件的API。它提供了一个独立于平台的、基于Java的邮件解决方案。我们可以使用JavaMail发送电子邮件,包括文本邮件、HTML邮件以及带附件的邮件。

## 配置JavaMail依赖首先,需要在项目中添加JavaMail的依赖。假设我们使用Maven进行依赖管理,只需在pom.xml中添加以下依赖:

代码语言:javascript代码运行次数:0运行复制

com.sun.mail

javax.mail

1.6.2

## 配置邮件服务器发送邮件需要一个邮件服务器(SMTP服务器)。常用的邮件服务器包括Gmail、QQ邮箱等。在这里,我们以QQ为例,展示如何配置邮件服务器。

开启服务:获取到授权码,在下面示例中使用授权码作为password。

发送示例发送简单文本邮件下面是一个发送简单文本邮件的例子:

代码语言:javascript代码运行次数:0运行复制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邮件的例子:

代码语言:javascript代码运行次数:0运行复制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 = "

This is a test HTML mail

Hello, this is an HTML mail from Java program!

";

message.setContent(htmlContent, "text/html");

// 发送邮件

Transport.send(message);

System.out.println("Mail sent successfully!");

} catch (MessagingException e) {

e.printStackTrace();

}

}

}

在这个例子中,我们将邮件内容设置为HTML格式,使用message.setContent方法指定内容类型为text/html。

发送带附件的邮件有时,我们需要发送带附件的邮件。下面是一个发送带附件邮件的例子:

代码语言:javascript代码运行次数:0运行复制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 protocoljava发送邮件时报以下错误信息:

代码语言:javascript代码运行次数:0运行复制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,保存。

代码语言:javascript代码运行次数:0运行复制# 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进行邮件发送。

相关推荐