문제

배달에 사용되는 SMTP 서버를 사용하지 않고 메일을 보내고 싶습니다.

그래서 자바메일 API 연결할 SMTP 서버를 지정해야 하기 때문에 작동하지 않습니다.

도서관에서 메일 주소 도메인의 MX 레코드를 쿼리하여 어떤 SMTP 서버가 어떤 이메일 주소를 담당하는지 자체적으로 알아냈으면 합니다.

나는 다음과 같은 것을 찾고 있습니다. 아스피린.불행히도 2004년에 개발이 중단되었고 라이브러리가 최신 스팸 방지 서버와 올바르게 통신하지 못하기 때문에 Aspirin 자체를 사용할 수 없습니다.

삽입 가능한 버전 제임스 그 일을 할 것입니다.그러나 이것이 가능한지에 관한 문서를 찾지 못했습니다.

아니면 내가 사용할 수 있는 다른 라이브러리에 대해 아는 사람이 있나요?

도움이 되었습니까?

해결책

이것은 이것을 처리하는 완전히 잘못된 방법입니다.

인터넷에 연결된 사람은 누구나 ISP, 사무실 등 이메일 제출을 처리할 수 있는 일종의 "합법적인" SMTP 서버를 갖게 됩니다.

그들이 당신을 위해 여러 가지 일을 하기 때문에 당신은 활용하고 싶어합니다.

1) 그들은 귀하의 메시지와 그 메시지를 처리할 책임을 집니다.당신이 그것을 떨어뜨린 후에는 더 이상 당신의 문제가 아닙니다.

2) 모든 메일 스팸 방지 기술은 서버에서 처리됩니다.더 좋은 점은 이러한 기술이 변경되면(도메인 키가 누구입니까?) 코드가 아닌 서버가 이를 처리한다는 것입니다.

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

4) 바퀴를 재발명하지 않습니다.보유한 인프라를 활용하세요.애플리케이션을 작성 중이신가요, 아니면 메일 서버를 작성 중이신가요?메일 서버 설정은 일반적으로 간단하게 수행할 수 있는 일상적인 작업입니다.인터넷상의 모든 "멍청한" 사용자들은 이메일 설정을 완료했습니다.

다른 팁

가능한 한 가지 해결책 : MX 레코드를 직접 얻고 사용하십시오. Javamail API.

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

maven2 종속성 :

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

MX 레코드 검색 방법 :

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];
}

Javamail 코드를 통해 메일 보내기 :

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);
}

하지 않다.

이메일을 보내는 것은 보이는 것보다 훨씬 더 복잡합니다. 이메일 서버는 신뢰할 수있는 배송에서 탁월합니다.

필요한 경우 별도의 전자 메일 서버를 설정하십시오. 즉, Java에서 하나를 구현하는 것과 본질적으로 동일합니다 (이 작업에 대한 라이브러리를 찾을 수있을 것입니다. 본질적으로 완전한 메일 서버 일 것입니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top