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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:39:08