Java邮件发送报ClassFormatError及Yahoo邮箱配置问题求助
解决Hibernate关联邮件发送的ClassFormatError及Yahoo邮箱配置问题
一、搞定java.lang.ClassFormatError: Absent Code attribute错误
这个报错的核心坑点你大概率踩在了依赖冲突上:你引入的javaee-api-6.0.jar里的javax.mail相关类是仅用于编译的“空架子类”——只有类和方法的定义,完全没有可执行的代码逻辑,而你同时又加了包含完整实现的mail.jar,类加载器优先加载了javaee-api里的空类,自然就炸了。
给你两个解决方案,二选一就行:
- 直接从项目依赖里删掉
javaee-api-6.0.jar,mail.jar已经能提供javax.mail的全部功能,这个仅用于编译的API包完全没必要留; - 如果你的项目确实需要javaee-api里的其他内容,就调整依赖加载顺序,让
mail.jar在类加载路径里排在javaee-api-6.0.jar前面,确保类加载器先读有完整代码的mail.jar。
二、Yahoo邮箱SMTP配置指南
针对yahoo.com和yahoo.co.in两类邮箱,配置规则其实没那么复杂:
通用配置要点
- 不管是
yahoo.com还是yahoo.co.in,官方统一推荐的SMTP服务器地址都是smtp.mail.yahoo.com,不用分开设置不同的主机地址; - 端口选这两个里的一个就行:
- TLS模式:端口填
587,记得开启mail.smtp.starttls.enable=true; - SSL模式:端口填
465,开启mail.smtp.ssl.enable=true;
- TLS模式:端口填
- 重点注意:Yahoo现在不让直接用邮箱登录密码发邮件了,必须先在Yahoo账户设置里开启
POP/SMTP权限,然后创建应用专用密码,用这个专用密码代替登录密码进行认证。
修改后的Yahoo发送示例代码
import java.util.Properties; 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; public class YahooEmailSender { public static void main(String[] args) { try { final String fromEmail = "your-yahoo-id@yahoo.com"; // 换成你的yahoo.com或yahoo.co.in邮箱 final String appPassword = "your-yahoo-app-password"; // 这里填你创建的应用专用密码 final String toEmail = "recipient@example.com"; System.out.println("Starting Yahoo mail send..."); Properties prop = new Properties(); // 核心SMTP配置 prop.put("mail.smtp.host", "smtp.mail.yahoo.com"); prop.put("mail.smtp.port", "587"); // TLS端口 prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.starttls.enable", true); Authenticator auth = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(fromEmail, appPassword); } }; Session session = Session.getInstance(prop, auth); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(fromEmail)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); message.setSubject("Yahoo Mail Test"); message.setText("Hello from Yahoo SMTP!"); Transport.send(message); System.out.println("Mail sent successfully!"); } catch (Exception e) { System.out.println("Mail send failed:"); e.printStackTrace(); } } }
三、给你原有Gmail代码提个醒
你提供的Gmail代码现在大概率跑不通,因为Gmail也早就禁用了直接用账户密码登录SMTP的方式,同样需要开启两步验证后创建应用专用密码,或者改用OAuth2认证,不然会直接报认证失败的错误。
内容的提问来源于stack exchange,提问作者java_jazz
相关产品推荐
相关产品推荐

