我目前使用的代码如下:
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
答案 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);
}
该代码将隔离允许代码看到的传输类。这将排除代码中的错误。