こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ソケット通信で大容量のメールの場合送信されません

質問です
smtpクライアントからtcpでメール送信するプログラムを組んだのですが、
添付ファイルのサイズが大きいもの(500000行を超えるような)を1行ずつsendメソッドで送信すると送信先で受信できません。
400000行まではいくのですが…
sendではエラーは返っておらずパケットは送られてる様です。
パケットダンプをとってみたのですが、メールサーバから応答は返ってきていました。

filein.open("test.eml");
if (filein.fail()){
return -1;
}
if((soc = ConnectHost("testhost","smtp",25)) == -1){
return -1;
}
send_buf = new char[BUFSIZ];
sprintf(send_buf,"MAIL FROM:<%s>\r\n","test@test.test");
SocketSend(soc,send_buf,strlen(send_buf));
sprintf(send_buf,"RCPT TO:<%s>\r\n","test2@test.test");
SocketSend(soc,send_buf,strlen(send_buf));
sprintf(send_buf,"DATA\r\n");
SocketSend(soc,send_buf,strlen(send_buf));
ss = new char[1024];
while (filein.getline(ss,1024)){
sprintf(send_buf,"%s\r\n",ss);
SocketSend(soc,send_buf,strlen(send_buf)); ←ここでループ
}
delete ss;
sprintf(send_buf,"\r\n.\r\n");
SocketSend(soc,send_buf,strlen(send_buf));
SocketRead(soc,send_buf);
delete send_buf;
filein.close();
if(SocketClose(soc) == -1){
return err;
}


int SocketSend(int soc,char* buff,int nbytes)
{
register int nleft,nwritten;
char* p = buff;

nleft = nbytes;
while(nleft > 0) {
nwritten = send(soc,p,nleft,0);
if(nwritten <= 0){
return nwritten;
}
nleft -= nwritten;
p += nwritten;
}
return 0;
}

int SocketClose(int soc)
{
int ret;
if(close(soc) == -1){
return -1;
}

return 0;
}

int SocketRead(int soc,char* buff)
{
int rbyte;
rbyte = read(soc,buff,strlen(buff));
return 0;
}

上記で問題になっていそうなところがあれば
教えてください。。
よろしくお願いします。

投稿日時 - 2009-08-24 20:28:37

QNo.5233630

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

>添付ファイルのサイズが大きいもの(500000行を超えるような)を1行ずつsendメソッドで送信すると送信先で受信できません。

メールにはISPにより「最大行数」または「最大サイズ」に制限があります。

とあるISPでは5MB、とあるISPでは1MB、とあるISPでは30万行と、ISPごとに「最大値」はバラバラです。また、一部のISPでは最大値を設けていない場合もあります。

また、メールを受信するサーバーに制限が無くとも、中継するサーバーに制限がある場合もあり「送れるかどうかは、実際に送ってみないと判らない」というのが現状です。

投稿日時 - 2009-08-24 21:55:30

お礼

ご回答ありがとうございます。

ご回答頂いた点ですが、
phpのプログラムからは正常に送れていますので
サーバ側に問題はないと考えています。

投稿日時 - 2009-08-25 00:46:43

あなたにオススメの質問