2014-04-21 4 views
0

나는 분명히 이메일을 보내도록 자바 메일 서블릿을 만들었습니다. 그것은 프로덕션 서버에서 완벽하게 작동하지만 내가 시도하고 내 자신의 홈 서버에서 다음과 같은 오류 메시지가 나타납니다자바 메일이 원격으로 작동하지 않습니다.

javax.mail.SendFailedException : 잘못된 주소;

javax.servlet.ServletException : javax.mail.SendFailedException : 잘못된 주소. 상자의 예외는 다음과 같습니다 com.sun.mail.smtp.SMTPAddressFailedException : 554 5.7.1 < * @ googlemail.com> : 릴레이 액세스 I가 로컬 호스트에서 호스트 변수를 변경

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 

거부 서블릿에있는 서버의 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); 
    } 
} 
    } 
+1

잘 모르겠지만 스팸 일 수 있으므로 도메인이나 Gmail이 필요하다고 생각합니다. 요청을 거부합니다. 내 생각 엔 프로덕션 서버의 호스트 이름이 google이고 홈 서버가 아닌 것으로 알려져 있습니다. – Selim

+0

방금 ​​코드를 게시했습니다. 프로덕션 서버는 내 메일 서버가 설치된 상태에서 나에게 속한 서버입니다. – user3473776

답변

1

구글이 도메인은에서 전송 (또는에서 보내는 말)되어 유효성을 검사합니다.

개발 계정을 사용하는 경우 프로덕션 계정과 다른 동작이 발생합니다. 이 모든 것을 말해 Domain Keys

+0

도메인 키는 집과 서버 IP 주소간에 보낸 이메일을 구별하는 데 도움이되지 않습니다. 또한 도메인 키가 없으면 전자 메일이 정크로 끝나지 만 릴레이가 거부되지는 않습니다. –

+0

그래서 내 ISP의 smtp 서버를 사용하는 것 외에 다른 해결책이 없습니다. 서블릿에 조건을 추가하여 사용할 서버를 결정할 수 있습니다. – user3473776

+0

그게 도메인 키의 핵심입니다. 스팸은 불쾌한 문제이며, 오래된 장소에서 중계를 허용하면 스팸을 피해 갈 수 없습니다.대량의 사용자 인증 전자 메일은 실제적으로 불가능하기 때문에 도메인 키는 도메인 전체의 인증이라는 차선책입니다. 인증 된 도메인이 있다면, 당신은 황금색입니다. 이것은 자바 질문이 아니라 net-admin 질문입니다 Upvotes 감사합니다 –

0

라인

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

에 (아마존 SES 포함) 거기에 모든 주요 메일 제공 업체와 이런 식으로

당신의 대답은 거짓말을 간다.

귀하의 집 ISP 나 Gmail에서 어떤 이유로 귀하의 이메일 릴레이 요청을 거부합니다.

가정 ISP는 자신의 SMTP 서버에 연결하도록 요구할 수 있습니다 (이는 일반적인 스팸 방지 고려 사항입니다).

(ISP가 스팸 메일을 신중하게 차단하지 않기 때문에) Gmail에 블랙리스트에 집 IP가있을 수 있습니다.

업데이트

String host = "codeprojects.co.uk"; 
props.put("mail.smtp.host", host); 

는 외부 SMTP 서버를 사용하는 나타냅니다. 많은 가정 ISP가 허용하지 않으므로 설명하는 것과 같은 오류가 발생합니다. 이것을 가정에서 실행하려면 SMTP 서버를 ISP의 SMTP 서버로 변경하십시오.

+0

내 코드가 아니란 걸 알았어. 어쨌든 이것을 바로 잡을 수 있습니까? – user3473776

+0

@ user3473776 : 내 편집을 참조하십시오. –

관련 문제