You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java发送邮件时出现NoClassDefFoundError错误求助

Java邮件发送异常问题解决

一、错误原因分析

你遇到的java.lang.NoClassDefFoundError: javax/activation/DataSource,是因为Java 9及以后的版本移除了javax.activation相关的JavaEE模块,而旧版JavaMail(javax.mail)依赖该模块才能运行。同时你的代码存在多处拼写和语法错误,也会导致运行异常。

二、代码修正

先修正代码中的拼写、语法问题,可运行的修正后代码如下:

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Properties;

public class Hw1 {
    // 修正方法名拼写:SendingMal -> SendingMail
    public static void SendingMail(String recipient) throws Exception {
        System.out.println("preparing to send");
        Properties pro = new Properties();
        
        // 修正配置项拼写:mail.stmp -> mail.smtp
        pro.put("mail.smtp.auth", "true");
        pro.put("mail.smtp.starttls.enable", "true");
        pro.put("mail.smtp.host", "smtp.gmail.com");
        pro.put("mail.smtp.port", "587");
        
        String myemail = "from@gmail.com";
        // 注意:Gmail开启2FA后需使用应用专用密码,而非原账号密码
        String pass = "your-app-specific-password";
        
        Session sess = Session.getInstance(pro, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(myemail, pass);
            }
        });
        
        Message mess = prepareMessage(sess, myemail, recipient);
        
        Transport.send(mess);
        System.out.println("Message sent successfully");
    }

    // 修正方法名拼写:preporeMessage -> prepareMessage
    private static Message prepareMessage(Session sess, String myemail, String recipient) {
        try {
            Message mess = new MimeMessage(sess);
            mess.setFrom(new InternetAddress(myemail));
            mess.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            
            mess.setSubject("Hi there");
            // 修正字符串换行语法:Java中不能直接换行,用\n或多行字符串(Java13+)
            mess.setText("Hey there,\nMy first email sending through Java");

            return mess;
        } catch (Exception e) {
            Logger.getLogger(Hw1.class.getName()).log(Level.SEVERE, null, e);
        }
        return null;
    }
}

// 修正类结构,移除无效占位内容,补全main方法
public class SendMail {
    public static void main(String[] args) throws Exception {
        Hw1.SendingMail("to@gmail.com");
    }
}

代码修正点:

  • 修正多处拼写错误:SendingMal→SendingMail、preporeMessage→prepareMessage、mail.stmp→mail.smtp
  • 修复字符串换行的语法错误:用\n替代直接换行,Java13+可使用"""包裹多行字符串
  • 移除代码中无效的*enter code here*占位内容
  • 补全SendMail类的main方法结构,确保代码可正常编译
  • 补充Gmail密码使用注意事项:开启两步验证后需使用应用专用密码

三、解决依赖缺失问题

针对javax.activation.DataSource缺失问题,有两种解决方式:

方式1:添加javax.activation依赖

如果使用Maven,在pom.xml中添加:

<dependency>
    <groupId>com.sun.activation</groupId>
    <artifactId>javax.activation</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

如果使用Gradle,添加:

implementation 'com.sun.activation:javax.activation:1.2.0'
implementation 'javax.mail:javax.mail-api:1.6.2'
implementation 'com.sun.mail:javax.mail:1.6.2'

方式2:迁移到Jakarta Mail(Java11+推荐)

由于JavaEE已迁移至Jakarta EE,推荐使用最新的Jakarta Mail替代旧版javax.mail:

Maven依赖:

<dependency>
    <groupId>jakarta.mail</groupId>
    <artifactId>jakarta.mail-api</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.1.2</version>
</dependency>

同时需将代码中所有javax.mail包路径替换为jakarta.mail,例如:

import jakarta.mail.Authenticator;
import jakarta.mail.Message;
// 其他相关包同理替换

四、Gmail额外配置注意事项

  • 若使用Gmail发送邮件,开启两步验证后必须使用应用专用密码,不能使用原账号密码
  • 若未开启两步验证,需在Gmail设置中开启「低安全性应用访问」(不推荐,存在安全风险)
  • 确保网络环境可正常访问smtp.gmail.com

内容的提问来源于stack exchange,提问作者Faiza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:25:23