MX レコードの DNS ルックアップを実行する必要があるアプリケーションを作成しています。この種の作業を経験したことがある人がいるかどうかはわかりませんが、もしあれば、どんな助けもいただければ幸いです。
編集:私が目指しているのは、電子メールアラートを送信するアプリケーションです。問題は、アプリケーションがドメインの MX レコードを検索できるようにする必要があることです。
最も簡単な方法は、一般的に入手可能なツールを使用することです。
基本的な「dig」コマンドは、次のクエリを介してレコードを返します。
dig mx example.com
mx レコードの行だけが必要な場合は...
dig mx example.com | grep -v '^;' | grep example.com
dig は、ほとんどの linux/unix ボックスで利用できます。
Windows を使用している場合は、nslookup を使用できます
nslookup -type=mx example.com
次に、これらの一般的なツールの出力を解析します。
「C」をタグとして付けているので、raw ソケットを使用して MX ルックアップを実行するソース コードを探していると思います。これをhttp://www.developerweb.net/forum/showthread.php?t=3550からコピーしました。それはあなたが探しているもの以上かもしれませんか?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <resolv.h>
int main (int argc, char *argv[])
{
u_char nsbuf[4096];
char dispbuf[4096];
ns_msg msg;
ns_rr rr;
int i, j, l;
if (argc < 2) {
printf ("Usage: %s <domain>[...]\n", argv[0]);
exit (1);
}
for (i = 1; i < argc; i++) {
l = res_query (argv[i], ns_c_any, ns_t_mx, nsbuf, sizeof (nsbuf));
if (l < 0) {
perror (argv[i]);
} else {
#ifdef USE_PQUERY
/* this will give lots of detailed info on the request and reply */
res_pquery (&_res, nsbuf, l, stdout);
#else
/* just grab the MX answer info */
ns_initparse (nsbuf, l, &msg);
printf ("%s :\n", argv[i]);
l = ns_msg_count (msg, ns_s_an);
for (j = 0; j < l; j++) {
ns_parserr (&msg, ns_s_an, j, &rr);
ns_sprintrr (&msg, &rr, NULL, NULL, dispbuf, sizeof (dispbuf));
printf ("%s\n", dispbuf);
}
#endif
}
}
exit (0);
}
Linux 向けに書いていることに気付きました。通常のプログラムが Unix ライクなシステムでメールを送信するための理想的な方法は、次のいずれかです。
どちらの方法でも、ローカル メーラーがメールを必要な場所に渡すように構成されていることを前提としています。適切に構成された Linux ボックスでは、これは妥当な仮定です。
それが気に入らない場合、次善の方法は、プログラムが使用するローカル メール リレー サーバーのアドレスを受け入れ、ポート 25 でそのサーバーに接続することです。
つまり、可能な限り、既存のメール リレーを使用してメールを送信します。これらのメール リレーは、実行中のネットワークからメールを取得するために必要なすべてのローカル情報を備えています。MX を調べて宛先に直接送信しようとしても、常にうまくいくとは限りません。
これらすべてを読んでもMXレコードを検索したい場合は、adns ライブラリを試してみてください。DNS 解決に関連する面倒な詳細をすべて処理してくれます (信じてください、面倒で間違いやすいのです!) 。 .
Linux の場合:
host -t mx google.com
NLnet Labsのldnsを見てください。このライブラリは、低レベルのパケット処理を処理し、独自のリゾルバー クライアントが組み込まれています。
ドキュメントには、必要なことを正確に実行するサンプル コードが含まれています。
[免責事項: 以前は SnertSoft のベータ テスターでしたが、今でもいくつかの製品を実行しています]
実際に手動でこれを行うと、たとえば、切り捨てられた応答を処理する必要があり、UDP から TCP に切り替える必要がある場合など、落とし穴があります。
SnertSoftのlibsnert
(無料、クリックスルー ライセンスが必要) には、エントリのベクトルを返すための C 実装が既にあります。可能であれば、「ここで発明されていない」ことを避けるようにしてください:)
既存のソリューションを使用する代わりに、MTA を再実装する必要がありますか?