度々すみません・・・
ソケット繋がって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);
}
で受信文字列も見れないし・・・
わかる方ご教授お願いします。
ソケットSMTPメール送信
Re:ソケットSMTPメール送信
ここにサンプルがあるので違いを比べてみてください。
http://a-gamyl.hp.infoseek.co.jp/Clang/list_86.html
http://a-gamyl.hp.infoseek.co.jp/Clang/list_86.html
Re:ソケットSMTPメール送信
ありがとうございます。
拝見させていただきましたが、
データ送信に使っている関数を
write関数にしているところ以外
私と大差ないと思ったのですが、
send関数はsmtpメール送信には
使用できないのでしょうか?
拝見させていただきましたが、
データ送信に使っている関数を
write関数にしているところ以外
私と大差ないと思ったのですが、
send関数はsmtpメール送信には
使用できないのでしょうか?
Re:ソケットSMTPメール送信
ちゃんとプロトコルを守りましょう。
SMTPはリクエスト - レスポンスを繰り返すプロトコルです。
HTTPのように,原則1回のリクエスト - レスポンスで完結するプロトコルとは異なります。
そもそも,仕様書のAppendix. Dにサンプルシナリオまで載っているのですから,
これに沿った送受信をしてみてはどうでしょうか。
IETF: RFC 5321 Simple Mail Transfer Protocol
http://www.ietf.org/rfc/rfc5321.txt
SMTPはリクエスト - レスポンスを繰り返すプロトコルです。
HTTPのように,原則1回のリクエスト - レスポンスで完結するプロトコルとは異なります。
そもそも,仕様書のAppendix. Dにサンプルシナリオまで載っているのですから,
これに沿った送受信をしてみてはどうでしょうか。
IETF: RFC 5321 Simple Mail Transfer Protocol
http://www.ietf.org/rfc/rfc5321.txt
Re:ソケットSMTPメール送信
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);
----------------------------------
このようにしたのですが
できませんでした。
何が悪いのでしょうか?
私もそのことに気付き
編集して
---------------------------------
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メール送信
・sendをループにしていないのはなぜですか。
sendに指定したサイズ分だけ確実に送出されることは保証されていません。
MSDN: send function (Windows)
http://msdn.microsoft.com/en-us/library/ms740149.aspx
・recvしていないのはなぜですか。
仕様ではEHLOに対する応答が250であることを確認してからMAIL FROMを送る,ということになっていますよね。
# 誤字も疑っていたりしますが,応答をちゃんと見れば気づくはず……。
sendに指定したサイズ分だけ確実に送出されることは保証されていません。
MSDN: send function (Windows)
http://msdn.microsoft.com/en-us/library/ms740149.aspx
・recvしていないのはなぜですか。
仕様ではEHLOに対する応答が250であることを確認してからMAIL FROMを送る,ということになっていますよね。
# 誤字も疑っていたりしますが,応答をちゃんと見れば気づくはず……。
Re:ソケットSMTPメール送信
語弊があるといけないので
大丈夫なの?というのは
こういったある程度のレベル以上のプログラムになると
英語しか資料がなくなります(私の知っている範囲ですが
つまり、先人達はある程度の教養を必要としてるのでは?
という意味で言っているわけです
これをもにゃもにゃして もにゃもにゃになったら
もにゃもにゃになってしまうとか
心配性なだけかもしれませんが
ひとりごと すいません

大丈夫なの?というのは
こういったある程度のレベル以上のプログラムになると
英語しか資料がなくなります(私の知っている範囲ですが
つまり、先人達はある程度の教養を必要としてるのでは?
という意味で言っているわけです
これをもにゃもにゃして もにゃもにゃになったら
もにゃもにゃになってしまうとか
心配性なだけかもしれませんが
ひとりごと すいません
