C言語でメール送信クライアントを作成しています

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

C言語でメール送信クライアントを作成しています

#1

投稿記事 by ファイブマン » 14年前

C言語でメール送信クライアントを作成しているのですが,
今回、コマンドライン上で,
プログラム名 差出メールアドレス あて先メールアドレス テキストファイル メールサーバの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);
}


YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: C言語でメール送信クライアントを作成しています

#2

投稿記事 by YuO » 14年前

writeの第三引数は,書き込むサイズなのに,よくわからないサイズが指定されています。
例えばEHLOであれば,
"EHLO (address-literal)\r\n"
の長さを渡すようにしてください。
# sizeofではなくstrlenを利用。

それ以外の点として,SMTPのコマンドは\r\nで終わります。
また,HELOコマンドはDeprecatedです。
reference) RFC 5321 : Simple Mail Transfer Protocol

ファイブマン

Re: C言語でメール送信クライアントを作成しています

#3

投稿記事 by ファイブマン » 14年前

なるほど!readは最大文字数でいいのですけど,writeは文字数を指定しないと駄目なのですね.
strcpy,strcatを使ってやったらうまくいきました.
ありがとうございました.

コード:

/* HELOの送信 */
  strcpy(buf, "HELO (クライアントのホスト名)\r\n");
  write(sds, buf, strlen(buf)); 
  read(sds, buf, sizeof(buf));
  printf("%s\n", buf);
 
  
  /* MAIL FROMの送信 */ 
  strcpy(buf, "MAIL FROM:");
  strcat(buf,argv[1]); 
  strcat(buf, "\r\n"); 
  write(sds, buf, strlen(buf)); 
  //printf("%s", buf);  
  read(sds, buf, sizeof(buf));
   printf("%s", buf);
 

/* RCPT TOの送信 */
  strcpy(buf, "RCPT TO:");
  strcat(buf, argv[2]);
  strcat(buf, "\r\n");
  write(sds, buf, strlen(buf)); 
  //printf("%s", buf); 
  read(sds, buf, sizeof(buf));
  printf("%s", buf);
 



閉鎖

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