|
|
- Welcome to
Hiroshi's Home Page - |
|
|
|
||
|
||
|
▼ ▼ ▼ |
||
|
||
|
▼ ▼ ▼ |
||
|
||
MXを引くプログラム - その1 - MXを引く …
以前より、SPAMメールの中に、ドメイン部は既存のドメインを使用し、アカウント名は、適当な文字を組み合わせたものがある。
このようなメールアドレスに、エラーを送っても、さらにエラー(User unknown)となって舞い戻ってくるだけである。
こういったSPAMメールへの対処として、メール受信時に、メールアドレスが適切なものであるか否かを、問い合わせできれば、不要なメールを受信せずに済むと考え、第一弾として、プログラム(C言語)中からDNS(Domain Name System)サーバに、MX(Mail eXchange)サーバを問い合わせるサンプルを作ることにした。
DNS関連のプログラムをするのに、重要なドキュメントは、以下の2つである。
RFC1034 DOMAIN NAMES - CONCEPTS AND FACILITIES
RFC1035 DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION特に後者は、DNSサーバから受け取ったデータを解析するための情報が含まれているため、必須である。
DNSサーバへの問い合わせ方法は、直接クエリーを投げる等、幾つかあるが、今回は、libresolvを用いることにした。
DNSサーバに問い合わせをするには、res_query()関数を用いる。
int res_search(const char *dname, int class, int type, unsigned char *answer, int anslen);
dname 検索するドメインもしくはホスト名(MXを引く場合はドメイン名) class クラス指定(MXを引く場合はインターネットを示すC_IN) type 引く種別を指定(MXを検索する場合はT_MX) answer 検索結果を受信するバッファ anslen バッファサイズ 戻り値は、受信したデータ長が返ってくる。 answerで受信するデータは、RFC1035(4.MESSAGES)で記述されているフォーマットそのもので、データのヘッダ部分は、arpa/nameser_compat.h内でHEADER構造体として定義されている。(RedHat Linux 7.3の開発環境)
res_query()関数を使用し、MXを検索する簡単なサンプルを以下に示す。
#include <stdio.h> #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h> int main(int argc, char *argv[]) { int i, rc; unsigned char ans[PACKETSZ]; for(i = 1; i < argc; i++) { rc = res_query(argv[i], C_IN, T_MX, ans, sizeof(ans)); printf("res_query(): %d\n", rc); if(rc < sizeof(HEADER)) continue; } return 0; }これは引数に与えられたドメイン名について、MXを検索し、res_query()関数の戻り値を出力するものである。
(2002/06/03)
|
||
|
▲ ▲ ▲ |
||
|
||
|
▲ ▲ ▲ |
||
|
||
|
|
||
|
(c) Copyright 1998-2002 Hiroshi OHNO All
right reserved. |
||