@ひろP

    - Welcome to Hiroshi's Home Page -
    趣味を中心とした個人のホームページです


@ひろP / ホビー / プロフィール / ブックマーク / 掲示板 / アルバム / サイトマップ / memo

▼ ▼ ▼

Linux関連 / OpenBlockSS関連 / 電波時計関連 / GPS関連 / USB関連 / プログラミング

▼ ▼ ▼

MXを引くプログラム

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)

MXを引くプログラム

▲ ▲ ▲

Linux関連 / OpenBlockSS関連 / 電波時計関連 / GPS関連 / USB関連 / プログラミング

▲ ▲ ▲

@ひろP / ホビー / プロフィール / ブックマーク / 掲示板 / アルバム / サイトマップ / memo

@ひろP

(c) Copyright 1998-2002 Hiroshi OHNO All right reserved.
E-MAIL: hirop0730@hotmail.com / hiroshi@bigfield.com