10

配信に使用する SMTP サーバーを気にせずにメールを送信したい。

そのため、接続先の SMTP サーバーを指定する必要があるため、 JavaMail APIは機能しません。

メール アドレス ドメインの MX レコードを照会して、どの SMTP サーバーがどのメール アドレスを担当しているかをライブラリが独自に調べてほしいと思います。

アスピリンのようなものを探しています。残念ながら、私はアスピリン自体を使用できません。開発が 2004 年に停止し、ライブラリが最近のスパム強化サーバーと正しく通信できなくなったためです。

Jamesの組み込み可能なバージョンがそのタスクを実行します。しかし、これが可能かどうかに関するドキュメントは見つかりませんでした。

または、私が使用できる他のライブラリについて知っている人はいますか?

4

3 に答える 3

15

考えられる解決策の1つは、MXレコードを自分で取得し、JavaMailAPIを使用することです。

dnsjavaプロジェクトを使用してMXレコードを取得できます。

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);
}
于 2008-11-07T11:37:19.860 に答える
3

これは、これを処理する完全に間違った方法です。

インターネットに接続している人なら誰でも、ある種の「正当な」SMTP サーバーを利用して、電子メールの提出を受け取ることができます (ISP、オフィスなど)。

彼らはあなたのためにいくつかのことをするので、あなたは活用したい.

1) 彼らはあなたのメッセージとそのメッセージを処理する責任を負います。あなたがそれを落とした後、それはもうあなたの問題ではありません。

2) メールのスパム対策技術はサーバーによって処理されます。さらに良いことに、これらのテクノロジが変更された場合 (ドメイン キーは誰か?)、コードではなくサーバーが処理します。

3) あなたは、その送信メール システムのクライアントとして、そのサーバーと通信するために必要な資格情報を既に持っています。メインの SMTP サーバーは、認証、IP 範囲などによってロックダウンされています。

4) 車​​輪の再発明をしているわけではありません。お持ちのインフラストラクチャを活用します。アプリケーションまたはメールサーバーを作成していますか? メール サーバーの設定は、通常は簡単に行える日常的なタスクです。インターネット上のそれらのカジュアルな「ばか」ユーザーはすべて、電子メールの設定に成功しています。

于 2008-11-07T17:04:08.627 に答える
2

しないでください。

電子メールの送信は、見た目よりもはるかに複雑です。電子メール サーバーは、信頼性の高い配信に優れています (または優れているはずです)。

必要に応じて別の電子メール サーバーをセットアップします。これは、Java で実装する場合と本質的に同じです (このタスク用のライブラリが見つかるとは思えません。それらは本質的に完全なメール サーバーになります)。

于 2008-11-07T16:43:22.023 に答える