2008-11-07 3 views
10

배달에 사용되는 SMTP-Server로 귀찮게하지 않고 메일을 보내고 싶습니다.누군가가 Java 용 메일 (SMTP) 배달 라이브러리를 알고 있습니까?

그래서 JavaMail API은 연결할 SMTP 서버를 지정해야하므로 작동하지 않습니다.

메일 주소 도메인의 MX 레코드를 쿼리하여 어떤 SMTP 서버가 어떤 SMTP 서버를 담당하는지 자체적으로 알아낼 수 있습니다.

나는 Aspirin과 같은 제품을 찾고 있습니다. 안타깝게도 Aspirin 자체는 사용할 수 없습니다. 개발이 2004 년 중단 되었기 때문에 라이브러리가 최신 스팸 강화 서버와 올바르게 통신하지 못하기 때문입니다.

James의 삽입 가능 버전이 작업을 수행합니다. 그러나 이것이 가능한지 여부에 관한 문서를 찾지 못했습니다.

아니면 다른 사람이 사용할 수있는 라이브러리에 대해 알고 있습니까?

+0

궁금합니다. 왜 메시지를 처리하고 작업 부하를 줄이기 위해 자신의 메일 서버를 사용하고 싶지 않습니까? – Joel

+0

응용 프로그램이 다른 환경의 다른 고객을 위해 설치됩니다. 그들은 자신의 이메일 주소로 보고서 메일을 보낼 것입니다. 나는 그들에게 "우리"의 이메일 서버를 사용하여 "그들의"이메일을 전달하기를 원하지 않는다. –

+3

아스피린에 대한 연구가 재개 된 것 같습니다. 2009 년 GitHub (http://github.com/masukomi/aspirin)로 옮겨졌고 9 월에 출시되었습니다. –

답변

2

이 문제를 해결하는 것은 완전히 잘못된 방법입니다. 당신은 그들이 몇 가지 않기 때문에 활용하려는

등 당신의 ISP, 사무실, - 인터넷에 연결

사람은 이메일의 제출을 ​​취할 그들에게 제공 "합법적"SMTP 서버의 어떤 것 당신을위한 것들.

1) 귀하의 메시지와 그 메시지를 처리 ​​할 책임이 있습니다. 당신이 그것을 내려 놓은 후에는 더 이상 당신의 문제가 아닙니다.

2) 모든 메일 스팸 방지 기술은 서버에서 처리합니다. 더 좋게도,/그 기술이 변경되면 (도메인 키 사용자는 누구입니까?), 서버가 코드를 처리하지 않습니다.

3) 메일 시스템을 보내는 클라이언트 인 귀하는 해당 서버와의 대화에 필요한 자격 증명을 가지고 있습니다. 기본 SMTP 서버는 인증, IP 범위 등을 통해 잠겨 있습니다.

4) 당신은 바퀴를 다시 발명하지 않습니다.보유한 인프라를 활용하십시오. 응용 프로그램 또는 메일 서버를 작성하고 있습니까? 메일 서버를 설정하는 것은 일상적으로 수행하기 쉬운 작업입니다. 인터넷에있는 그 캐주얼 "벙어리"사용자들은 모두 이메일 설정을 할 수있었습니다.

16

하나 가능한 해결책 : 직접 MX 레코드를 가져오고 JavaMail API을 사용하십시오.

당신은 dnsjava 프로젝트를 사용하여 MX 레코드를 얻을 수 있습니다 :

Maven2 의존성 : MX 레코드 검색을위한

<dependency> 
    <groupId>dnsjava</groupId> 
    <artifactId>dnsjava</artifactId> 
    <version>2.0.1</version> 
</dependency> 

방법 : JavaMail에 코드를 통해 메일을 보내기

public static String getMXRecordsForEmailAddress(String eMailAddress) { 
    String returnValue = null; 

    try { 
     String hostName = getHostNameFromEmailAddress(eMailAddress); 
     Record[] records = new Lookup(hostName, Type.MX).run(); 
     if (records == null) { throw new RuntimeException("No MX records found for domain " + hostName + "."); } 

     if (log.isTraceEnabled()) { 
      // log found entries for debugging purposes 
      for (int i = 0; i < records.length; i++) { 
       MXRecord mx = (MXRecord) records[i]; 
       String targetString = mx.getTarget().toString(); 
       log.trace("MX-Record for '" + hostName + "':" + targetString); 
      } 
     } 

     // return first entry (not the best solution) 
     if (records.length > 0) { 
      MXRecord mx = (MXRecord) records[0]; 
      returnValue = mx.getTarget().toString(); 
     } 
    } catch (TextParseException e) { 
     throw new RuntimeException(e); 
    } 

    if (log.isTraceEnabled()) { 
     log.trace("Using: " + returnValue); 
    } 
    return returnValue; 
} 

private static String getHostNameFromEmailAddress(String mailAddress) throws TextParseException { 
    String parts[] = mailAddress.split("@"); 
    if (parts.length != 2) throw new TextParseException("Cannot parse E-Mail-Address: '" + mailAddress + "'"); 
    return parts[1]; 
} 

:

public static void sendMail(String toAddress, String fromAddress, String subject, String body) throws AddressException, MessagingException { 
    String smtpServer = getMXRecordsForEmailAddress(toAddress); 

    // create session 
    Properties props = new Properties(); 
    props.put("mail.smtp.host", smtpServer); 
    Session session = Session.getDefaultInstance(props); 

    // create message 
    Message msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress(fromAddress)); 
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddress)); 
    msg.setSubject(subject); 
    msg.setText(body); 

    // send message 
    Transport.send(msg); 
} 
+0

나는 이것이 대중적인 경우에는 효과가 없을 것이라고 생각한다. 메일 서버를 오픈 릴레이 모드로 구성 할 관리자는 많지 않습니다. 서버에 자신을 인증해야합니다. – Lazarin

+4

이것은 릴레이 시나리오가 아닙니다. 이메일 주소를 담당하는 메일 서버에 메일을 배달합니다. [email protected]은 gmail에 전달되며 gmail은 유효한 Gmail 주소 인 경우 메일을 수락합니다. 이것이 이메일 전송 시스템이 작동하는 방식입니다. –

+1

당신 말이 맞아요, 당신은 릴레이를 설명하지 않고 있어요. 그러나 Lazarin은 스팸으로 강화 된 서버로 인해 발신 호스트가 MX 레코드에 포함되어 발송인의 도메인에 있는지 확인합니다. – erickson

2

하지 마십시오.

전자 메일 보내기는 생각보다 훨씬 복잡합니다. 이메일 서버는 안정적인 전달에 탁월합니다.

필요한 경우 별도의 전자 메일 서버를 설정하십시오. 이는 Java에서 구현하는 것과 본질적으로 동일합니다 (이 작업을위한 라이브러리를 찾을 수 있을지는 모르지만 본질적으로 완전한 메일 서버 임). 그러나 훨씬 더 간단합니다. .