我正在尝试使用javamail api向自己发送电子邮件。我已经正确地遵循了我在网上找到的代码,但我似乎无法让它工作。我得到的错误是:
Exception in thread "main" javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client
这是否意味着我的电脑不支持身份验证?
public class Emails
{
public static void main(String[] args) throws MessagingException
{
Emails e = new Emails();
e.sendMail();
}
public void sendMail() throws MessagingException
{
boolean debug = false;
String subject = "Testing";
String message = "Testing Message";
String from = "myemail@email.com";
String[] recipients = {"myemail@email.com"};
// create some properties and get the default Session
Session session = getSession();
session.setDebug(debug);
// create a message
Message msg = new MimeMessage(session);
// set the from and to address
InternetAddress addressFrom = new InternetAddress(from);
msg.setFrom(addressFrom);
InternetAddress[] addressTo = new InternetAddress[recipients.length];
for (int i = 0; i < recipients.length; i++)
{
addressTo[i] = new InternetAddress(recipients[i]);
}
msg.setRecipients(Message.RecipientType.TO, addressTo);
// Optional : You can also set your custom headers in the Email if you Want
msg.addHeader("MyHeaderName", "myHeaderValue");
// Setting the Subject and Content Type
msg.setSubject(subject);
msg.setContent(message, "text/plain");
Transport.send(msg);
}
private Session getSession()
{
Authenticator authenticator = new Authenticator();
Properties properties = new Properties();
properties.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.host", "smtp.examplehost.com");
properties.setProperty("mail.smtp.port", "25");
return Session.getInstance(properties, authenticator);
}
private class Authenticator extends javax.mail.Authenticator
{
private PasswordAuthentication authentication;
public Authenticator()
{
String username = "myusername";
String password = "mypassword";
authentication = new PasswordAuthentication(username, password);
}
protected PasswordAuthentication getPasswordAuthentication()
{
return authentication;
}
}
}
当我从这台服务器发送电子邮件时,我要做的是,通过ssh登录到服务器(login.server.com等)然后我可以从邮件服务器发送电子邮件(smtp.server.com等)。 )。我需要在java中模仿这个
已解决:使用SMTPSSLTransport类
答案 0 :(得分:2)
我遇到了同样的问题,曾经没有在stackoverflow上找到答案。 @ JPC的答案却提供了(非常小的)线索。
从javamail 1.4.3开始(?参见refs),javamail将拒绝通过未加密的通道发送纯文本凭据。因此,启用TLS传输是一种解决方案。另一种解决方案是在服务器支持的情况下尝试其他身份验证方法,例如NTLM或SASL。另一种解决方案是恢复到JavaMail 1.4.1,它在明文中发送凭证没有问题。这样做的好处是您的代码不必更改。问题中的代码可以正常运行。缺点显然是您以明文方式发送凭据,但如果您的Exchange管理员允许它...在我的情况下,邮件服务器不支持TLS,所以我别无选择。
参考文献:
答案 1 :(得分:1)
确保您有一个smtp服务器(smtp.examplehost.com)来实际发送电子邮件。 确保您的smtp服务器允许“myemail@email.com”发送电子邮件。
这些是标准smtp服务器实施的一些安全检查。
答案 2 :(得分:1)
这可能是你敲错了端口。我想您正在使用IMAP协议:对于基于SSL的IMAP,您必须连接到端口993
答案 3 :(得分:-3)
SMTPSSLTransport解决了这个问题