在不进行身份验证的情况下发送Java电子邮件(没有此类提供程序例外:smtp)

在不进行身份验证的情况下发送Java电子邮件(没有此类提供程序例外:smtp),java,email,authentication,jakarta-mail,Java,Email,Authentication,Jakarta Mail,我目前使用的代码如下: String to=“....@gmail.com”; 字符串from=“…..@gmail.com”; 字符串host=“127.0.0.1”; Properties=System.getProperties(); setProperty(“mail.smtp.host”,host); Session Session=Session.getDefaultInstance(属性); 试一试{ MimeMessage message=新MimeMessage(会话); me

我目前使用的代码如下:

String to=“....@gmail.com”;
字符串from=“…..@gmail.com”;
字符串host=“127.0.0.1”;
Properties=System.getProperties();
setProperty(“mail.smtp.host”,host);
Session Session=Session.getDefaultInstance(属性);
试一试{
MimeMessage message=新MimeMessage(会话);
message.setFrom(新的InternetAddress(from));
message.addRecipient(message.RecipientType.TO,
新互联网地址(至);;
message.setSubject(“这是主题行!”);
message.setText(“这是实际消息”);
传输。发送(消息);
System.out.println(“已成功发送消息…”);
}捕获(消息例外mex){
mex.printStackTrace();
}
如果我将上述代码粘贴到Java
servlet
中并运行它,将引发以下异常:
javax.mail.NoSuchProviderException:smtp


我也尝试了以下参考资料中列出的解决方案,但没有效果:。

首先,如果你想使用gmail从你的程序发送电子邮件,你需要将stmp主机定义为gmail。您当前的主机“127.0.0.1”是本地主机,意思是您自己的计算机?您的计算机上是否运行邮件服务器

在这里,您可以看到一些如何使用gmail发送电子邮件的教程:

如果你害怕通过你正常的gmail账户,那么就创建一些测试邮件,比如kselvatest之类的

你错过了很多:

final String username = "username@gmail.com";
final String password = "password";

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");
因此,基本上您需要添加的是:

1.登录名和密码,以便JavaMail可以使用一些gmail帐户

2.声明要使用的邮件服务器

更改
String host=“127.0.0.1”
String host=“smtp.gmail.com”


3.设置邮件端口

对于此代码,您应该获得
javax.mail.MessaginException:无法连接到SMTP主机:127.0.0.1,端口:25异常


但我怀疑你有jre问题。可能是smtp实现有问题。为什么不从下载java mail实现并将其添加到项目类路径中,然后再试一次呢?

NoSuchProviderException
意味着JavaMail API配置中出现了一些问题。您在哪里以及如何安装JavaMail jar文件


另外,如果从其他响应中看不清楚,那么在不进行身份验证的情况下发送邮件的唯一方法就是运行自己的邮件服务器。一般用途的在线电子邮件服务(如Gmail)无法做到这一点。

如果您包含javax.mail.NoSuchProviderException和JavaMail调试输出的完整堆栈跟踪,这将有所帮助。因为您是在一个servlet容器中运行它的,所以您可能会在其中运行。将您的呼叫更改为Transport.set,设置为以下内容:

    final ClassLoader ccl = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(Session.class.getClassLoader());
    try {
        Transport.send(message);
    } finally {
        Thread.currentThread().setContextClassLoader(ccl);
    }

该代码将隔离允许代码查看的传输类。这将排除代码中的错误。

您的本地主机上是否运行邮件服务器?邮件服务器的意思是,您可以解释一下吗?我不想在这里混淆您,您首先需要检查“mx记录”是什么。试试这个:试试gmail-smtp-in.l.google.com作为主机而不是127.0.0.1使用提供商的smtp发送服务器,在你的情况下是“smtp.gmail.com”,我试过了,但只得到了相同的错误…我在没有验证的情况下问你,你在使用gmail时有点胡闹,最近,我能够发送未经身份验证的电子邮件,但我们的域内管理员启用了这种方式,但它只能在内部网内工作。最后,你告诉我,我们无法在Gmail中发送未经身份验证的邮件,如果你想用gmail发送电子邮件,你必须像我所展示的那样。大多数人在gmail的stack overflow中给出了w/o代码,这与代码无关…?最新的JavaMail下载是。