ページ 11

ソケットSMTPメール送信

Posted: 2010年4月09日(金) 07:24
by ひょう
度々すみません・・・
ソケット繋がってHTTPリクエストもできました。
そこで本来ソケット通信したかった目的、
SMTP接続メール送信をしようと思いました。

----------------------------------------------------------------
/*ソケット初期化*/
ret = WSAStartup(0x0101, &wsaData);
if(ret != 0)
{
printf(">Socket initialization ERROR.\n");
}
else
{
hostent = gethostbyname(host);
memcpy(&inaddr,hostent->h_addr_list[0],4);
strcpy(szIP,inet_ntoa(inaddr));
printf(">Socket initialization OK.\n");
}
Sleep(1000);

/*ソケット作成*/
s = socket(AF_INET,SOCK_STREAM,0);
if(s == SOCKET_ERROR)
{
printf(">Socket making ERROR.\n");
}
else
{
printf(">Socket making OK.\n");
}
Sleep(1000);

/*送信先セット*/
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(szIP);
sa.sin_port = htons(25);

/*サーバー接続*/
check = connect(s,(SOCKADDR *)&sa,sizeof(sa));
if(check == SOCKET_ERROR)
{
printf(">Server connection ERROR.\n");
}
else
{
printf(">Server connection OK.\n");
}
Sleep(1000);

/*送受信*/
strcpy(buf,"HELO ");
strcat(buf,host);
strcat(buf,"\r\n");
strcat(buf,"MAIL FROM:<");
strcat(buf,from);
strcat(buf,">\r\n");
strcat(buf,"RCPT TO:<");
strcat(buf,to);
strcat(buf,">\r\n");
strcat(buf,"DATE\r\n");
strcat(buf,sub);
strcat(buf,"\r\n");
strcat(buf,body);
strcat(buf,"\r\n");
strcat(buf,"\r\n.\r\n");
strcat(buf,"RSET\r\n");

send(s,buf,strlen(buf),0);
recN = recv(s,buf,sizeof(buf),0);

for(i=0; i<recN; i++)
{
printf("%s",buf);
}

// ソケットの破棄
closesocket(s);

// クリーンアップ
WSACleanup();
-----------------------------------------------------------------
どこか間違ってますか?
メールは送れないし
最後の
for(i=0; i<reN; i++)
{
printf("%s",buf);
}
で受信文字列も見れないし・・・

わかる方ご教授お願いします。

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 09:45
by softya
ここにサンプルがあるので違いを比べてみてください。
http://a-gamyl.hp.infoseek.co.jp/Clang/list_86.html

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 13:14
by ひょう
ありがとうございます。

拝見させていただきましたが、
データ送信に使っている関数を
write関数にしているところ以外
私と大差ないと思ったのですが、
send関数はsmtpメール送信には
使用できないのでしょうか?

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 13:37
by YuO
ちゃんとプロトコルを守りましょう。
SMTPはリクエスト - レスポンスを繰り返すプロトコルです。
HTTPのように,原則1回のリクエスト - レスポンスで完結するプロトコルとは異なります。

そもそも,仕様書のAppendix. Dにサンプルシナリオまで載っているのですから,
これに沿った送受信をしてみてはどうでしょうか。
IETF: RFC 5321 Simple Mail Transfer Protocol
http://www.ietf.org/rfc/rfc5321.txt

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 15:05
by ひょう
YuOさん

私もそのことに気付き
編集して
---------------------------------
strcpy(buf,"HELO ");
strcat(buf,host);
strcat(buf,"\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,"MAIL FROM:<");
strcat(buf,from);
strcat(buf,">\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,"RCPT TO:<");
strcat(buf,to);
strcat(buf,">\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,"DATE\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,sub);
strcat(buf,"\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,body);
strcat(buf,"\r\n");
send(s,buf,strlen(buf),0);

strcpy(buf,"\r\n.\r\n");
strcat(buf,"RSET\r\n");
send(s,buf,strlen(buf),0);
----------------------------------
このようにしたのですが
できませんでした。

何が悪いのでしょうか?

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 15:47
by YuO
・sendをループにしていないのはなぜですか。
sendに指定したサイズ分だけ確実に送出されることは保証されていません。
MSDN: send function (Windows)
http://msdn.microsoft.com/en-us/library/ms740149.aspx

・recvしていないのはなぜですか。
仕様ではEHLOに対する応答が250であることを確認してからMAIL FROMを送る,ということになっていますよね。

# 誤字も疑っていたりしますが,応答をちゃんと見れば気づくはず……。

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 16:44
by dic
大丈夫なの?

Re:ソケットSMTPメール送信

Posted: 2010年4月09日(金) 17:26
by dic
語弊があるといけないので
大丈夫なの?というのは
こういったある程度のレベル以上のプログラムになると
英語しか資料がなくなります(私の知っている範囲ですが
つまり、先人達はある程度の教養を必要としてるのでは?
という意味で言っているわけです

これをもにゃもにゃして もにゃもにゃになったら
もにゃもにゃになってしまうとか

心配性なだけかもしれませんが
ひとりごと すいません
画像