使用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
相关产品推荐
相关产品推荐

