Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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
Java Mail赢得';我不能远程工作_Java_Jakarta Mail - Fatal编程技术网

Java Mail赢得';我不能远程工作

Java Mail赢得';我不能远程工作,java,jakarta-mail,Java,Jakarta Mail,我制作了一个Java邮件Servlet来发送电子邮件。它在生产服务器上运行得非常好,但是当我尝试在我自己的家庭服务器上运行它时,我收到以下错误消息 javax.mail.SendFailedException:无效地址 javax.servlet.ServletException:javax.mail.SendFailedException:无效地址; 嵌套异常是: com.sun.mail.smtp.SMTPAddressFailedException:554 5.7.1:中继访问被拒绝 ev

我制作了一个Java邮件Servlet来发送电子邮件。它在生产服务器上运行得非常好,但是当我尝试在我自己的家庭服务器上运行它时,我收到以下错误消息

javax.mail.SendFailedException:无效地址

javax.servlet.ServletException:javax.mail.SendFailedException:无效地址; 嵌套异常是: com.sun.mail.smtp.SMTPAddressFailedException:554 5.7.1:中继访问被拒绝

evo.net.Mail.service(Mail.java:60)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52
我在servlet中将hostname变量从localhost更改为服务器的IP,但这并没有什么区别

我的代码:

package evo.net;
import java.util.*;

import javax.mail.*;
import javax.mail.Session;
import javax.mail.internet.*;
import javax.activation.*;

import java.io.IOException;
import java.io.PrintWriter;

 import javax.servlet.ServletException;
 import javax.servlet.annotation.WebServlet;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;

 @WebServlet("/Mail")
 public class Mail extends HttpServlet {
private static final long serialVersionUID = 1L;

 public Mail() {
    super();
 }

protected void service(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {

    PrintWriter out = response.getWriter();

    String to = "********";
    String from = "*******@codeprojects.co.uk";
    String host = "codeprojects.co.uk";

    Properties props = System.getProperties();

    props.put("mail.smtp.host", host);
    props.put("mail.smtp.auth", "true");

    Session session = Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("root", "*****");
            }
      });

    try {
        Transport trans = session.getTransport("smtp");
        trans.connect("root", "******");

        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO, new             InternetAddress(to));

        message.setSubject("The subject");
        message.setText("Hello World");

        trans.sendMessage(message, message.getAllRecipients());;
        out.println("Test");

    } catch(MessagingException mex) {
        throw new ServletException(mex);
    }
}
  }

谷歌验证你发送的域名(或者说你发送的域名)

如果您使用的是开发帐户,您将获得与生产帐户不同的行为。每个主要的邮件提供商(包括亚马逊SES)都是这样做的

你的答案就在这一行

SMTPAddressFailedException: 554 5.7.1 <*@googlemail.com>: Relay access denied

指示您正在使用外部SMTP服务器。许多家庭ISP不允许这样做,并且会给出一个类似于您描述的错误。要在家中运行此功能,请尝试将SMTP服务器更改为ISP的服务器。

我不确定,但我认为您需要一个域,否则gmail将拒绝您的请求,因为它可能是垃圾邮件。我猜谷歌知道你的生产服务器的主机名,而你的主服务器不知道。我刚刚发布了我的代码。生产服务器属于我,上面安装了我自己的邮件服务器。域密钥无助于区分从家庭和服务器IP地址发送的电子邮件。此外,缺少域密钥可能会使电子邮件变成垃圾邮件,但不会导致中继被拒绝。因此,除了使用我的ISP的smtp服务器之外,真的没有其他解决方案。我可以在servlet中添加条件来决定使用哪台服务器。这就是域密钥的要点。垃圾邮件是一个令人讨厌的问题,如果你接受从任何一个老地方的中继,你甚至不能削弱垃圾邮件。由于大量用户认证的电子邮件实际上是不可能的,因此域密钥做了次好的事情,即域范围的认证。如果你有一个经过验证的域名,那么你就是黄金。这不是一个java问题,这是一个网络管理问题,我们对此表示感谢
String host = "codeprojects.co.uk";
props.put("mail.smtp.host", host);