今回、コマンドライン上で,
プログラム名 差出メールアドレス あて先メールアドレス テキストファイル メールサーバのIPアドレス
います
を入力することでメールサーバのIPアドレスへ接続して、宛先にテキストファ
イルの内容を送れるようにするプログラムを作りたいと思っています。
現在はサーバに接続までして,readによってサーバから準備完了のメッセージ
を受けるところまではうまく動いているのですが,
/* HELOの送信 */以降がうまく動きません.
コンパイルしたところ,
220 (クライアントのホスト名) ESMTP (e085dcc28efeae7a99084b8cba67b4ad)
パイプ破壊
と表示されました.
クライアントから,サーバへのパイプが切れてしまっているからパイプ破壊と
出ると思っているのですが,その改善法がわかりません.
パイプを緯持?するのはどうしたらいいのでしょうか.
どうしたらHELO以降を送信し,サーバからメッセージを受けとることができる
のでしょうか.
回答宜しくお願いします.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#define SERVER_NAME "(サーバ名)"
#define ERR -1
#define BUFSIZE 1024
void usage(void);
char *command_name;
int socket(int domain, int type, int protocol);
int main(int argc, char* argv[]){
int sds; //ソケットディスクリプタ
FILE *fp;
struct sockaddr_in server;//サーバプロセスのソケットアドレス情報
struct hostent *hp; //ホスト情報
char buf[BUFSIZE];
char *mes;
if(argc != 5)
usage();
/*ソケットの作成*/
if((sds = socket(PF_INET, SOCK_STREAM, 0)) == ERR){
perror("client: socket");
exit(1);
}
/*サーバの情報を格納*/
memset((void*)&server, 0, sizeof(server));
server.sin_family = PF_INET;
server.sin_port = htons(25); //ポート番号25
// printf("%d", server.sin_family);
/*IPアドレスの設定*/
hp = gethostbyname(argv[4]);
memcpy(&(server.sin_addr), hp->h_addr_list[0], hp->h_length);
/*サーバに接続*/
if(connect(sds, (struct sockaddr *)&server, sizeof(server))==ERR){
perror("client: connect");
exit(1);
}
read(sds, buf, sizeof(buf));
printf("%s\n", buf);
/* HELOの送信 */
write(sds, "HELO (クライアントのホスト名)", sizeof(buf));
read(sds, buf, sizeof(buf));
printf("%s\n", buf);
/* MAIL FROMの送信 */
write(sds, "MAIL FROM:argv[1]", sizeof(buf));
read(sds, buf, sizeof(buf));
/* RCPT TOの送信 */
write(sds, "RCPT TO:argv[2]", sizeof(buf));
read(sds, write, sizeof(buf));
/* DATA の送信 */
write(sds, "DATA", sizeof(buf));
read(sds, write, sizeof(buf));
fp = fopen(argv[3], "r");
while(fgets(buf, 1024, fp) != NULL){
write(sds, fp, sizeof(buf));
}
write(sds, "QUIT", sizeof(buf));
read(sds, write, sizeof(buf));
return 0;
}
void usage(void)
{
fprintf(stderr, "Usage: %s 差出 宛先 テキスト IP\n",command_name);
exit(1);
}