Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaMail通过vps发送电子邮件,不需要身份验证,但获取AuthenticationFailedException-为什么?_Java_Email_Authentication_Smtp_Jakarta Mail - Fatal编程技术网

JavaMail通过vps发送电子邮件,不需要身份验证,但获取AuthenticationFailedException-为什么?

JavaMail通过vps发送电子邮件,不需要身份验证,但获取AuthenticationFailedException-为什么?,java,email,authentication,smtp,jakarta-mail,Java,Email,Authentication,Smtp,Jakarta Mail,我最初将我的网站设置为使用本地ISP通过我的网站发送电子邮件。我想改变这一点,并开始通过我的VPS发送电子邮件。根据在线文档(来自我的vps提供商),我有“SMTP认证前的POP”。因此,此时我不需要身份验证,也不需要安全连接 我对通过本地ISP发送电子邮件的代码做了一些修改。以下是我所拥有的: Transport t = null; try { String Username = "mrsmith@mydomain.com"; String Password = "so

我最初将我的网站设置为使用本地ISP通过我的网站发送电子邮件。我想改变这一点,并开始通过我的VPS发送电子邮件。根据在线文档(来自我的vps提供商),我有“SMTP认证前的POP”。因此,此时我不需要身份验证,也不需要安全连接

我对通过本地ISP发送电子邮件的代码做了一些修改。以下是我所拥有的:

Transport t = null; 
   try {
    String Username = "mrsmith@mydomain.com";
    String Password = "somepassword";

        InternetAddress from = new InternetAddress("mrsmith@mydomain.com", "Bob Smith");                        

    Properties props = new Properties();                                    

   //commented out, since I don't want to use authentication
   //props.setProperty("mail.smtp.auth", "true");           

   props.put("mail.pop3.host", "mydomain.com";
   props.put("mail.smtp.host", "mydomain.com");

   String protocol = "smtp";             
   Session ssn = Session.getInstance(props, null);
   ssn.setDebug(true);  

 t = ssn.getTransport(protocol);    

Store s = ssn.getStore();
s.connect();

  t.connect(SMTP,Username,Password);

//Create the message
Message msg = new MimeMessage(ssn);
msg.setFrom(from);
msg.addRecipient(Message.RecipientType.TO, to);
msg.setSubject(subject);
msg.setContent(body, "text/html");

t.sendMessage(msg, msg.getAllRecipients());
t.close();
s.close();  
我联系了我的vps提供商,在按照他们的指示调整代码后,我仍然得到“身份验证失败”。这是在成功连接到端口25上的主机后进行的

有人能指出我遗漏了什么吗

编辑以添加其他信息 在我添加store.connect(“mailhost”、用户名、密码)之后;声明的代码,我得到了比以往任何时候都更进一步

下面是一些打印到tomcat提示符的信息-

DEBUG : getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc.] POP3: connecting to host "mydomain.com", port 110, isSSL false server ready OK User name accepted, password please Password somepassword OK Mailbox open, 0 messages DEBUG: geProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smpt.SMTPTransport,Sun Microsystems, Inc.] DEBUG SMTP: useEhlo true, useAuth false DEBUG SMTP: trying to connect to host "mydomain.com", port 25, isSSL false 220 mydomain.com ESMTP Sendmail 8.14.3/8.14.3; DEC 2010 29 DEBUG SMTP: connected to host "mydomain.com", port: 25 ( a lot of additional debug information was here ) DEBUG SMTP: Attempt to authenticate AUTH LOGIN 535 5.7.0 authentication failed javax.mail.AuthenticationFailedException at javax.mail.Service.connect(Service.java:319) at javax.mail.Service.connect(Service.java:169) ... continues with more 'at's. DEBUG:getProvider()返回javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,sun Microsystems,Inc.] POP3:连接到主机“mydomain.com”,端口110,isSSL错误 服务器就绪 确定接受用户名,请输入密码 密码 确定邮箱已打开,0封邮件 调试:geProvider()返回javax.mail.Provider[传输,smtp,com.sun.mail.smpt.SMTPTransport,sun Microsystems,Inc.] 调试SMTP:useEhlo true,useAuth false 调试SMTP:尝试连接到主机“mydomain.com”,端口25,isSSL false 220 mydomain.com ESMTP Sendmail 8.14.3/8.14.3;2010年12月29日 调试SMTP:已连接到主机“mydomain.com”,端口:25 (这里有很多额外的调试信息) 调试SMTP:尝试进行身份验证 身份验证登录 535.7.0身份验证失败 javax.mail.AuthenticationFailedException 在javax.mail.Service.connect(Service.java:319) 在javax.mail.Service.connect(Service.java:169) ... 继续使用更多的“at”。 你在这些信息中看到什么奇怪的东西了吗?我不太明白为什么当Pop3使用相同的用户名和密码进行身份验证时,身份验证失败了。
SMTP身份验证之前的POP基本上意味着您需要能够证明您可以使用POP3(使用正确的身份验证)获取邮件,然后才能允许您使用SMTP(无身份验证)发送邮件

使用Java Mail API,您可以像这样对POP3服务器进行身份验证:

Store store = ssn.getStore("pop3");
store.connect("mailhost", Username, Password);
您应该在连接到SMTP服务器之前执行这些调用,因此在连接到SMTP服务器之前(不带用户名和密码),如下所示

t.connect();
确保先连接到商店

在您的代码段中,您仍然在根据smtp进行身份验证,因为您正在提供用户名/密码

另一种选择是使用Commons电子邮件,它在smtp身份验证之前内置了对pop的支持。在中检查以下方法

使用commons电子邮件,无需在代码中执行pop管道(发送前连接)

有关更多信息,请访问:


检查提供程序实现(pop3.jar)是否在您的构建路径/类路径中。

VPS上的邮件日志中有什么内容?12月28日15:48:40 motokarz saslauthd[20304]:do_auth:auth failure:[user=mrsmith][service=smtp realm mydomain.com][mech=pam][reason=pam auth error]您知道如何在我的web应用程序中禁用SMTP身份验证吗?我尝试了您指示的方法-我将代码放在t.sendMessage()之前和t.connect()之后。。。。但我还是得到了同样的例外。。。请注意,根据您的建议,我在上面的原始帖子中所做的更改(请查看代码段)。在您的代码中,您在通过POP进行身份验证之前连接到SMTP。t、 connect(SMTP、用户名、密码)已连接到SMTP服务器,而不是sendMessage(),好的,进行了更改,现在我收到一个javax.mail.NoSuchProviderException,协议无效:null我假设我缺少了其他内容,但什么?你得到了。。。我编辑了答案。您是否使用ssn.getStore(“pop3”)而不是ssn.getStore()?感谢您继续帮助我:)我刚刚尝试将其更改为ssn.getStore(“pop3”),我再次收到AuhenticationFailedException。然后我将“pop3”改为“pop3”,只是为了尝试一下,然后我得到了“NoSuchProviderException:No provider for pop3”。
email.setPopBeforeSMTP(true,popHost,popUsername,popPassword);
Properties props = new Properties();
props.put("mail.smtp.host", "mailserver.com");
Session s = Session.getInstance(props,null);

InternetAddress from = new InternetAddress("mail@mail.com");
InternetAddress to = new InternetAddress(recepeint@server.com");