繁体   English   中英

发送未经身份验证的Java电子邮件(此类提供程序例外:smtp)

[英]Send Java email without authentication (no such provider exception: smtp)

我当前使用的代码如下:

String to = "....@gmail.com";
String from = ".....@gmail.com";
String host = "127.0.0.1";
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", host);
Session session = Session.getDefaultInstance(properties);
try {
    MimeMessage message = new MimeMessage(session);
    message.setFrom(new InternetAddress(from));
    message.addRecipient(Message.RecipientType.TO,
                              new InternetAddress(to));
    message.setSubject("This is the Subject Line!");
    message.setText("This is actual message");
    Transport.send(message);
    System.out.println("Sent message successfully....");
} catch (MessagingException mex) {
    mex.printStackTrace();
}

如果将上面的代码粘贴到Java servlet并运行它,则会抛出以下异常: javax.mail.NoSuchProviderException: smtp

我也尝试遵循这些资源中概述的解决方案,但无济于事: link1 link2 link3 link4

NoSuchProviderException意味着JavaMail API配置中有些混乱。 您在哪里以及如何安装JavaMail jar文件?

另外,如果从其他响应中看不出来,则无需身份验证即可发送邮件的唯一方法是运行自己的邮件服务器。 您不能使用通用的在线电子邮件服务( 例如 Gmail)来做到这一点。

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

在这里,您可以看到一些教程,如何使用gmail发送电子邮件: http : //www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/

如果您害怕通过常规的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 = "127.0.0.1"; String host = "smtp.gmail.com";

3.设置邮件端口

对于此代码,您应该得到javax.mail.MessagingException: Could not connect to SMTP host: 127.0.0.1, port: 25; 例外

但我怀疑您有jre问题。 可能是smtp实施有问题。 为什么不从http://www.oracle.com/technetwork/java/javamail/index-138643.html下载Java邮件实现并将其添加到项目类路径中并尝试?

如果您包含javax.mail.NoSuchProviderException和JavaMail调试输出的完整堆栈跟踪,将会有所帮助。 因为您是在servlet容器中运行此程序,所以可能会遇到Bug 6668 -skip无法使用的Store和Transport类 将对Transport.set的呼叫更改为以下内容:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM