ソケットSMTPメール送信

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ひょう

ソケットSMTPメール送信

#1

投稿記事 by ひょう » 15年前

度々すみません・・・
ソケット繋がって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);
}
で受信文字列も見れないし・・・

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

softya

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

#2

投稿記事 by softya » 15年前

ここにサンプルがあるので違いを比べてみてください。
http://a-gamyl.hp.infoseek.co.jp/Clang/list_86.html

ひょう

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

#3

投稿記事 by ひょう » 15年前

ありがとうございます。

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

YuO

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

#4

投稿記事 by YuO » 15年前

ちゃんとプロトコルを守りましょう。
SMTPはリクエスト - レスポンスを繰り返すプロトコルです。
HTTPのように,原則1回のリクエスト - レスポンスで完結するプロトコルとは異なります。

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

ひょう

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

#5

投稿記事 by ひょう » 15年前

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);
----------------------------------
このようにしたのですが
できませんでした。

何が悪いのでしょうか?

YuO

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

#6

投稿記事 by YuO » 15年前

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

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

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


dic

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

#8

投稿記事 by dic » 15年前

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る