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

时间:2015-04-15 13:02:06

标签: java email authentication javamail

我目前使用的代码如下:

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

4 个答案:

答案 0 :(得分:1)

NoSuchProviderException表示JavaMail API配置中出现了一些问题。您在何处以及如何安装JavaMail jar文件?

此外,如果从其他响应中不清楚,您可以在没有身份验证的情况下发送邮件的唯一方法是,如果您正在运行自己的邮件服务器。您无法使用通用在线电子邮件服务(例如 Gmail)。

答案 1 :(得分:0)

首先,如果你想使用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.declare你想使用哪个邮件服务器

String host = "127.0.0.1";更改为String host = "smtp.gmail.com";

3.set邮件端口

答案 2 :(得分:0)

对于此代码,您应该获得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邮件实现并将其添加到项目类路径并尝试?

答案 3 :(得分:0)

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

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

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