掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26487

SMTPサーバにmail送信
投稿者---h3X(HN変えました、昔はzeroです..一応宣言)(2006/03/21 00:43:32)


SMTPサーバにメールを送信する単純なテストプログラムをCで作製しています。
環境はLinuxでgccでコンパイルしています。

yahooのWEBメールのアカウントを取得し、yahooのSMTPサーバにメールを
送信して成功するか試しています。

プログラムは完成したのですが、なぜかメールサーバにメールが届きません。
プログラムは正常に動作しているようですが、(これはデバッグ用に出力した
内容から、SMTPサーバからの応答コードが正常であることから、プログラムは正常に動作し、mailを送信できていると判断しています。)
メールボックスを見てもメールは送られていません。

このプログラムは、テストプログラムであるためサーバーからの応答コードのチェック等のエラー処理はまだ対応していません。

以下にソースと、実行結果を掲示します。なおメールアドレスなどは架空のモノにさせて頂いております。

----------- [ send_mail.h ]----------------------------------

#ifndef _SEND_MAIL_H_
#define _SEND_MAIL_H_

/*===========================================
    Edit your own environment
 ===========================================*/
#define SMTP_SERVER     "mx1.mail.yahoo.co.jp"
#define SMTP_PORT       25
#define MAIL_FROM       "xxxxxx@yahoo.co.jp"
#define MAIL_TO         "xxxxxx@yahoo.co.jp"
/*===========================================*/

#define SEND_BUF    1024
#define RECV_BUF    8192

struct mail_struct;

int init_mail_struct(struct mail_struct *m_s);
int create_send_data(struct mail_struct *m_s, const char *data);
int send_mail(struct mail_struct *m_s);

#endif /* _SEND_MAIL_H_ */



-----------------[ send_mail.c ] --------------------------------
* ちょっと長くて掲示板にポストエラーが出たので次のスレッドに載せます。


< 実行結果>
$./send_mail
[!] init_mail_struct() called.
[!] send_mail() called.
[+] Connecting(202.93.77.231:25)... done.
==================== SESSION OPEN =======================

>220 YSmtp mta85.mail.bbt.yahoo.co.jp ESMTP service ready
HELO h3X
>250 mta85.mail.bbt.yahoo.co.jp
MAIL FROM:<xxxxxx@yahoo.co.jp>
>250 sender <xxxxxx@yahoo.co.jp> ok
RCPT TO:<xxxxxx@yahoo.co.jp>
>250 recipient <xxxxxx@yahoo.co.jp> ok
DATA
>354 go ahead
hello, world
.
>250 ok dirdel
QUIT
>221 mta85.mail.bbt.yahoo.co.jp
==================== SESSION CLOSE =======================

以上です。
なぜメールが届かないのかご教授下さい。
プログラムの不備なのか、サーバー側でフィルタリングされてる可能性が
あるのか分りません。

よろしくお願い致します。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:SMTPサーバにmail送信 26489 h3X 2006/03/21 00:45:13
<子記事> Re:SMTPサーバにmail送信 26497 si 2006/03/21 12:02:36


No.26489

Re:SMTPサーバにmail送信
投稿者---h3X(2006/03/21 00:45:13)


-------------------- [send_mail.c]--------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <netdb.h>
#include <unistd.h>

#include "send_mail.h"

struct mail_struct {
    char *smtp_server;
    int  port;

    char *mail_from;
    char *mail_to;

    char *data;
};

#define DEBUG   /* debugging only */
#ifdef  DEBUG
# define       DX(x)  x
#else
# define       DX(x)  
#endif  /* DEBUG */

/* return value 0:success -1:fail */
int send_mail(struct mail_struct *m_s) {
    struct sockaddr_in  host;
    struct hostent      *ent;
    struct in_addr    addr;
    int sock;
    char send_buf[SEND_BUF], recv_buf[RECV_BUF];
    ssize_t recv_bytes;
    
    DX(printf("[!] send_mail() called.\n"));
    
    memset(&host, 0, sizeof(host));
    host.sin_family = AF_INET;
    host.sin_port = htons(m_s->port);
    
    /* resolv smtp server ip address */
    if (inet_aton(m_s->smtp_server, &addr) == 0) {
        ent = gethostbyname(m_s->smtp_server);
        if (ent == NULL) {
            perror("[*] gethostbyname()");
            return -1;
        }
        else {
            memcpy( &(host.sin_addr), ent->h_addr, ent->h_length); 
        }
    }
    else {
        memcpy( &(host.sin_addr), &addr, sizeof(addr));
    }
    
    /* socket */
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("[*] socket()");
        return -1;
    }
    
    /* connecting host */
    DX(printf("[+] Connecting(%s:%d)... ", inet_ntoa(host.sin_addr), m_s->port));
    if (connect(sock, (struct sockaddr *)&host, sizeof(host)) == -1) {
        perror("[*] connect()");
        return -1;
    }
    fflush(stdout); 
    DX(printf("done.\n")); 
    
    /* ok, preparation done */
    DX(printf("====================  SESSION OPEN =======================\n\n"));
    
    /* recv first message */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* HELO [send] */
    snprintf(send_buf, SEND_BUF, "HELO h3X\r\n");
    send(sock, send_buf, strlen(send_buf), 0);
    sleep(1);
    DX(printf("%s", send_buf));
    /* HELO [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* MAIL FROM [send] */
    snprintf(send_buf, SEND_BUF, "MAIL FROM:<%s>\r\n", m_s->mail_from);
    send(sock, send_buf, strlen(send_buf), 0);
    sleep(1);
    DX(printf("%s", send_buf));
    /* MAIL FROM [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* RCPT TO [send] */
    snprintf(send_buf, SEND_BUF, "RCPT TO:<%s>\r\n", m_s->mail_to);
    send(sock, send_buf, strlen(send_buf), 0);
    sleep(1);
    DX(printf("%s", send_buf));
    /* RCPT TO [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* DATA [send] */
    send(sock, "DATA\r\n", 6, 0);
    sleep(1);
    DX(printf("DATA\r\n"));
    /* DATA [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* MESSAGE [send] */
    send(sock, m_s->data, strlen(m_s->data), 0);
    send(sock, "\r\n.\r\n", 5, 0);
    DX(printf("%s", m_s->data));
    DX(printf("\r\n.\r\n"));
    sleep(1);
    /* MESSAGE [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    
    /* QUIT [send] */
    send(sock, "QUIT\r\n", 6, 0);
    sleep(1);
    DX(printf("QUIT\r\n"));
    /* QUIT [reply] */
    recv_bytes = recv(sock, recv_buf, RECV_BUF, 0); recv_buf[recv_bytes] = '\0';
    DX(printf(">%s", recv_buf));
    DX(printf("====================  SESSION CLOSE =======================\n"));
    
    return 0;
}



後半はさらに次のスレッドで。見憎くなってすみません。


この投稿にコメントする

削除パスワード

No.26490

Re:SMTPサーバにmail送信
投稿者---h3X(2006/03/21 00:45:40)


/* return value 0:success -1:fail */
int init_mail_struct(struct mail_struct *m_s) {
    
    DX(printf("[!] init_mail_struct() called.\n"));
    
    m_s->smtp_server = SMTP_SERVER;
    m_s->port       = SMTP_PORT;
    m_s->mail_from   = MAIL_FROM;
    m_s->mail_to     = MAIL_TO;
    m_s->data       = NULL;
    
    return 0;
}

/* return value 0:success -1:fail */
int create_send_data(struct mail_struct *m_s, const char *data) {
    
    if (data == NULL)
        return -1;
    else 
        m_s->data = strdup(data);
        
    return 0;
}

int main(int argc, char *argv[]) {
    struct mail_struct m_s;

    init_mail_struct(&m_s);
    
    create_send_data(&m_s, "hello, world");
    
    send_mail(&m_s);

    return 0;
}




以上です。


この投稿にコメントする

削除パスワード

No.26497

Re:SMTPサーバにmail送信
投稿者---si(2006/03/21 12:02:36)


Local Lan 内でテストしたら、送信できますし、以下のセッション表示も
送信は成功しています。
>==================== SESSION OPEN =======================

>>220 YSmtp mta85.mail.bbt.yahoo.co.jp ESMTP service ready
>HELO h3X
>>250 mta85.mail.bbt.yahoo.co.jp
>MAIL FROM:<xxxxxx@yahoo.co.jp>
>>250 sender <xxxxxx@yahoo.co.jp> ok
>RCPT TO:<xxxxxx@yahoo.co.jp>
>>250 recipient <xxxxxx@yahoo.co.jp> ok==================== SESSION OPEN =======================

>220 YSmtp mta85.mail.bbt.yahoo.co.jp ESMTP service ready
HELO h3X
>250 mta85.mail.bbt.yahoo.co.jp
MAIL FROM:<xxxxxx@yahoo.co.jp>
>250 sender <xxxxxx@yahoo.co.jp> ok
RCPT TO:<xxxxxx@yahoo.co.jp>
>250 recipient <xxxxxx@yahoo.co.jp> ok
DATA
>354 go ahead
hello, world
.
>250 ok dirdel
QUIT
>221 mta85.mail.bbt.yahoo.co.jp
==================== SESSION CLOSE =======================

>DATA
>>354 go ahead
>hello, world
>.
>>250 ok dirdel
>QUIT
>>221 mta85.mail.bbt.yahoo.co.jp
>==================== SESSION CLOSE =======================
ただし、このメールが、受け取り人に届くかどうかは別問題です。


この投稿にコメントする

削除パスワード

No.26498

Re:SMTPサーバにmail送信
投稿者---h3X(2006/03/21 17:23:43)


>Local Lan 内でテストしたら、送信できますし、以下のセッション表示も
>送信は成功しています。

テストして頂きありがとうございます。

>ただし、このメールが、受け取り人に届くかどうかは別問題です。

推測でもよろしいんで、siさんは何が原因でメールが届かないと
お考えですか?
参考にお聞きしたいのですが。よろしくお願いします。


この投稿にコメントする

削除パスワード

No.26499

Re:SMTPサーバにmail送信
投稿者---si(2006/03/21 18:33:17)


>何が原因でメールが届かないと、お考えですか?
テストしたサーバは、local Lan内間のメールはノーチェックで配送します。


この投稿にコメントする

削除パスワード

No.26500

Re:SMTPサーバにmail送信
投稿者---h3X(2006/03/21 19:31:21)


>テストしたサーバは、local Lan内間のメールはノーチェックで配送します。

すると、今回私がYahooのSMTPサーバにメールを送信したテストでは、
SMTPサーバがやはりメールをフィルタリングして配送してくれなかった、
ということでしょうか?

もしそうだとすると、どのようにプログラムを訂正すれば、Local Lan内に
限らず、メールが正常に配送されるようにすることができるのでしょうか?

ご教授のほどよろしくお願いします。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧