【问题标题】:Sending mail using java使用java发送邮件
【发布时间】:2017-03-02 17:08:58
【问题描述】:

我尝试从域发送邮件,但遇到了一些错误。

代码:

package SendingClass;

import java.util.*;  

import java.util.Date;
import java.util.Properties; 
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;

import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail  
{  
public static void main(String [] args)
{
    String host="chnmail.hcl.com";
    final String user="allwinjayson.m@hcl.com";
    final String password="*******";
    String to="allwinjayson.m@hcl.com";

    //Get the session object  
    Properties props = new Properties();  
    props.put("mail.smtp.host",host);  
    props.put("mail.smtp.auth", "true");  


    //new
    Session session = Session.getDefaultInstance(props,  
    new javax.mail.Authenticator() 
    {  
            protected PasswordAuthentication getPasswordAuthentication() 
            {  
                return new PasswordAuthentication(user,password);  
            }  
    });  


     //Compose the message  
    try 
    {  
        MimeMessage message = new MimeMessage(session);  
        message.setFrom(new InternetAddress(user));
        message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
        message.setSubject("Praise the Lord");
        message.setText("This is simple program of sending email using JavaMail API");

        //send the message  
         Transport.send(message);  
         System.out.println("message sent successfully...");  
    } 
    catch (MessagingException e) 
    {
        e.printStackTrace();
    }  
}
}  

错误:

javax.mail.AuthenticationFailedException:服务器和客户端均不支持身份验证机制
    在 com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:756)
    在 com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:669)
    在 javax.mail.Service.connect(Service.java:313)
    在 javax.mail.Service.connect(Service.java:172)
    在 javax.mail.Service.connect(Service.java:121)
    在 javax.mail.Transport.send0(Transport.java:190)
    在 javax.mail.Transport.send(Transport.java:120)
    在 SendingClass.SendEmail.main(SendEmail.java:63)

【问题讨论】:

  • 客户端和服务器都支持的认证机制吗?尝试使用连接方法而不使用用户名和密码

标签: java jakarta-mail


【解决方案1】:

您很可能需要启用 SSL/TLS 才能让您的服务器允许您登录。根据服务器的要求,将属性mail.smtp.ssl.enablemail.smtp.starttls.enable 设置为true

此外,您还需要清理其中的一些 common JavaMail mistakes

【讨论】:

  • 我添加了但收到错误“javax.mail.MessagingException:无法连接到 SMTP 主机:chnmail.hcl.com,端口:25;”
【解决方案2】:

这表现更好吗?这是我的一个 Java 应用程序的简化示例,希望我没有引入复制粘贴语法错误。它看起来与您的代码相似,但几乎没有额外的 smtp 道具。

Properties prop = new Properties();
prop.put("mail.smtp.allow8bitmime", "true");
prop.put("mail.smtp.timeout", "60000");
prop.put("mail.smtp.connectiontimeout", "60000");
prop.put("mail.smtp.host", "smtp.gmail.com");
prop.put("mail.smtp.port", "465");
prop.put("mail.smtp.auth", "true");
prop.put("mail.smtp.socketFactory.port", "465");
prop.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
prop.put("mail.smtp.from", "myname@gmail.com");

final String username = "myname";
final String pwd      = "mypwd";
Session session = Session.getInstance(prop,
  new javax.mail.Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(username, pwd);
    }
  }
);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress( (String)prop.get("mail.smtp.from") ));
((MimeMessage)msg).setSubject("My email title ÅÄÖ", "UTF-8");
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("other@world.com", false));

Multipart mp = new MimeMultipart();
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText("This is a body text ÅÄÖ", "UTF-8");
mp.addBodyPart(mbp1);
msg.setContent(mp);

Transport tr = session.getTransport("smtp");
tr.connect();
tr.sendMessage(msg, msg.getAllRecipients());
tr.close();

【讨论】:

  • 解释实际问题比代码转储更进一步。
  • @Makoto:是的,问题已经在问题中解释过了,对吧?我的回答是提供更多的道具示例来尝试一下。 JavaMail 有时是一种黑魔法,我在这里并不是要宣布最终答案,只是程序员头脑尝试的食物。我的代码对其他几方有效。毕竟这是 Stackoverflow。
  • 我的直接偏好是一个权威的答案,即为什么人们可以得到那个特定的错误,而不是一些应该“正常工作”来解决这个问题的代码。解决问题是一回事,但在这种情况下,知道问题出在哪里更有价值。因此,代码转储对我来说似乎没有那么有价值。其他人可能觉得它值得,但我没有看到它的价值。
  • @Makoto:感谢您的意见。让原始发布者看看它如何适合他/她的场景,如果问题没有消失,请提供更多信息。我们可能会迭代地找到解决方案。
猜你喜欢
  • 2012-03-27
  • 2013-11-04
  • 2013-04-13
  • 2012-09-11
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多