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