誰かがJava用のメール(SMTP)配信ライブラリを知っていますか?
質問
配信に使用されるSMTPサーバーに煩わされることなくメールを送信したい。
JavaMail API は、SMTPサーバーを指定する必要があるため機能しません接続します。
メールアドレスドメインのMXレコードを照会することで、どのSMTPサーバーがどのメールアドレスを担当するかをライブラリで独自に見つけたい。
アスピリンのようなものを探しています。残念ながら、開発が2004年に停止し、ライブラリが最新のスパム強化サーバーと正しく通信できないため、アスピリン自体は使用できません。
James の埋め込み可能なバージョンがタスクを実行します。しかし、これが可能かどうかに関するドキュメントは見つかりませんでした。
または私が使用できる他のライブラリについて誰か知っていますか?
解決
これはこれを処理する完全に間違った方法です。
インターネットに接続しているユーザーには、何らかの「レギット」があります。 ISP、オフィスなど、メールの送信に使用できるSMTPサーバー
いくつかのことをしてくれるので、活用したいです。
1)彼らはあなたのメッセージを受け取り、そのメッセージを処理する責任を負います。落とした後は、もう問題ではありません。
2)メールのスパム対策技術はすべてサーバーによって処理されます。さらに良いのは、それらの技術が変更された場合/ドメインが変更された場合(ドメインキーは誰か?)、コードではなくサーバーがそれを処理することです。
3)その送信メールシステムのクライアントとして、そのサーバーと通信するために必要な資格情報を既に持っています。メインSMTPサーバーは、認証、IP範囲などを介してロックダウンされています。
4)車輪の再発明ではありません。所有しているインフラストラクチャを活用します。アプリケーションまたはメールサーバーを書いていますか?メールサーバーの設定は、通常簡単に実行できる毎日のタスクです。これらのカジュアルな「ダム」はすべてインターネット上のユーザーはメールを設定することができました。
他のヒント
1つの可能な解決策:自分でMXレコードを取得し、 JavaMail API を使用します。
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);
}
しないでください。
メールの送信は、見かけよりもはるかに複雑です。電子メールサーバーは、信頼できる配信に優れています(または優れている必要があります)。
必要に応じて別の電子メールサーバーをセットアップします。これは、Javaで実装するのと本質的に同じです(このタスクのライブラリを見つけるのは間違いないでしょう。本質的に完全なメールサーバーになります)。