如何在Oracle SQL Developer中添加mail.jar解决javax.mail.NoSuchProviderException错误
解决Oracle Forms6i中Java邮件类的
javax.mail.NoSuchProviderException问题 我理解你在Oracle Forms6i里调用自定义Java类发送邮件时,碰到了javax.mail.NoSuchProviderException: No provider for Address type: rfc822的错误——哪怕已经加了相关JAR包、尝试过签名,问题还是没解决。结合Oracle Forms的特殊运行环境,下面是针对性的排查和解决步骤:
1. 把JAR包部署到Forms的专属目录
Oracle Forms6i不会直接沿用你在SQL Developer里配置的类路径,必须把mail.jar、activation.jar、smtp.jar这些邮件相关JAR包放到Forms安装目录的ORACLE_HOME/jlib文件夹下。同时要检查Forms的系统环境变量CLASSPATH,确保这些JAR包的路径已经被正确添加,保证Forms运行时能加载到这些类。
2. 匹配兼容的JavaMail版本
Oracle Forms6i基于较老的JDK版本(一般是JDK 1.3或1.4),请使用和这个版本兼容的JavaMail版本(推荐JavaMail 1.4.7或更早版本)。新版本的JavaMail可能依赖更高版本的JDK特性,会导致Forms无法正常加载类。另外要注意,activation.jar必须是和JavaMail配套的版本,别混用不同版本的包。
3. 正确完成JAR包签名(关键步骤)
Oracle Forms对调用的Java类有严格的签名要求,之前的签名操作可能有疏漏,正确流程如下:
- 先生成密钥库:
按照提示输入密钥库密码、别名密码及相关信息。keytool -genkey -alias forms_mail -keystore forms_keystore.jks - 给每个邮件相关JAR包签名:
jarsigner -keystore forms_keystore.jks mail.jar forms_mail jarsigner -keystore forms_keystore.jks activation.jar forms_mail jarsigner -keystore forms_keystore.jks smtp.jar forms_mail - 把签名后的JAR包替换到
ORACLE_HOME/jlib目录,覆盖未签名的文件。 - 确保Forms的安全配置信任这个签名:可以在
webutil.cfg里指定密钥库路径,或者在Forms运行时的Java控制面板中添加该密钥库为信任证书。
4. 微调Java代码细节
你的代码可以做以下小调整,避免潜在的加载问题:
- 显式指定邮件传输协议:在Properties中添加
props.put("mail.transport.protocol", "smtp"); - 简化收件人地址的创建,避免解析错误:将
修改为message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("yyyyyy@gmail.com"));message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("yyyyyy@gmail.com")});
5. 排查Forms的安全与类加载设置
- 检查
formsweb.cfg配置文件,确保jpi_security设置合适(测试环境可以临时设为jpi_security=none,生产环境则需要配置安全策略文件)。 - 开启Forms的Java控制台,查看更详细的错误日志——可能会发现类加载失败的具体原因(比如某个依赖类找不到),而不只是表面的
NoSuchProviderException。
附上你提供的原始代码供参考:
import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class EnvoyerEmail { private String username = "xxxxxxx@gmail.com"; private String password = "****"; public void envoyer() { Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("xxxxx@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("yyyyyy@gmail.com")); message.setSubject("Test email"); message.setText("Bonjour, ce message est un test ..."); Transport.send(message); System.out.println("Message_envoye"); } catch (MessagingException e) { throw new RuntimeException(e); } } public static void main(String[] args) { EnvoyerEmail test = new EnvoyerEmail(); test.envoyer(); } }
内容的提问来源于stack exchange,提问作者Ala Eddine Hmidi
相关产品推荐
相关产品推荐

