前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用Java实现邮件发送功能,邮件发送API JavaMail

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

作者头像
Harry技术
发布2025-01-13 16:27:21
发布2025-01-13 16:27:21
14200
代码可运行
举报
运行总次数:0
代码可运行
在Java中实现邮件发送功能是一项常见的任务,比如注册验证、通知提醒等。Java提供了强大的邮件发送API——JavaMail,能够方便地实现这一功能。

## JavaMail简介

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

## 配置JavaMail依赖

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

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
## 配置邮件服务器

发送邮件需要一个邮件服务器(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 = "<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

发送带附件的邮件

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

代码语言: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 protocol

java发送邮件时报以下错误信息:

代码语言: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进行邮件发送。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Harry技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在Java中实现邮件发送功能是一项常见的任务,比如注册验证、通知提醒等。Java提供了强大的邮件发送API——JavaMail,能够方便地实现这一功能。
  • ## JavaMail简介
  • ## 配置JavaMail依赖
  • ## 配置邮件服务器
  • 发送示例
    • 发送简单文本邮件
    • 发送HTML邮件
    • 发送带附件的邮件
  • 问题解决
    • 错误javax.net.ssl.SSLHandshakeException: No appropriate protocol
      • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档