• 締切済み

No.1687のつづき

UNIX-Cよりmailコマンドを実行し、ログインユーザのメールを取得したいのですが 受信件数やメールサイズなどを取得する方法がわかりません。 処理イメージとしては (1)受信メール数、サイズをチェック (2)mailコマンドを実行 (3)s * filename -- 任意のファイルへ受信メールを書き込み (4)(3)のファイルより受信メールを解析 (5)(4)で解析したメールを1件ずつ保存 といったイメージしているのですが・・・ (mailコマンドでは不可能でしょうか?)

  • sting
  • お礼率12% (35/274)

みんなの回答

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.5

> POP3のコマンド(STAT,REST・・・)はUNIX-Cの関数にあるのでしょうか? POP3 のコマンドは、socket でサーバに送信するものです。send や write を使います。 > また、基本的なことなのですが、SMTPで他メールサーバから受信したメール群は > 自動的にPOPサーバに以降されるのでしょうか?現在サーバの設定は特にしていない > のですが・・・。 SMTP と POP3 が別のホストになっている場合には、SMTP のサーバから転送してあげないといけません。 同じサーバであれば、両方とも同じ spool をみるので、特に意識する必要は無いです。

  • mld_sakura
  • ベストアンサー率20% (264/1282)
回答No.4

ここのサイトを参考にしてください。 http://sanaki-web.hp.infoseek.co.jp/tcpip/pop3.htm ただし、ログインユーザ全てとなると、以下の方法が考えられますね。 (1)上記のPOP3コマンドをすべてのユーザとして投げる。 (2)スプールのメールを解析する。 質問の(3)は単にテキスト等にリダイレクトかければいい訳です。 (4)と(5)もヘッダ情報を取得すれば、単純なそうですね。 いずれにしても、スプールを解析するか、リモート受信するかどうかですね。

参考URL:
http://sanaki-web.hp.infoseek.co.jp/tcpip/pop3.htm
sting
質問者

お礼

POP3プロトコルを使用すればmailコマンドは必要ないのですね。 POP3のコマンド(STAT,REST・・・)はUNIX-Cの関数にあるのでしょうか? また、基本的なことなのですが、SMTPで他メールサーバから受信したメール群は 自動的にPOPサーバに以降されるのでしょうか?現在サーバの設定は特にしていない のですが・・・。

sting
質問者

補足

mailxコマンドを子プロセスからexecv関数にて実行し、 親プロセスにて"s [filename]\n","q\n"を出力して1メール ずつ処理していきたいのですが、mailxコマンドの結果受信メール の有無が取得できないため困っています・・・。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.3

> mailコマンド起動の方で探してみようと思います。 そちらの方が簡単だ、と思うのは あ・ま・い 。 対話的に使うわけですから、それほど難しさは変わらないです。 > でもサンプルがなかなかなくて・・・ ちょっと探してみました。キーワードを "pipe dup close fork mail" といったところで。 pipe システムコールの典型的な使い方になるのですが、メールの送信の例はたくさん あるのですけれどね。 例えば、として参考URL の pipemail.c とか。 このソースで、親プロセスの受信用のハンドル(pfd[0])を close しないで、 こちらからメールの内容と mail コマンドのプロンプトを読み取りつつ、メールを保存し、 適当な終了判定をする、という感じになるでしょうか。

参考URL:
http://www.cs.odu.edu/~cs476/unix/codelectures/
sting
質問者

お礼

すみません、イマイチどのようにやり取りすればよいのかわかりません。例えば、3通受信メールがある場合、子プロセスでexec*を使いmailコマンドを実行し、 1通目からメール内容を取得していきたいのですが・・・。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

書き忘れたことをもうひとつ。 もし、あなたが、Windows 系のプログラムの方が得意なのであれば、参考URL のような コンポーネントを使う手もあります。

参考URL:
http://www.hi-ho.ne.jp/%7Ebabaq/basp21.html
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> プログラムからmailコマンドを起動してやるしかないでしょうか・・。 これもひとつの手ではありますね。 私なら、直接 socket を POP につないでやり取りしちゃいます。 socket を知っているのであれば、テキストのやり取りなので、さして難しいプログラムではありません。RFC1939 を参照ください(→参考URLのひとつめ)。 サンプルは幾らでも Web に転がっています。ちょっと探してみました(→参考URLのふたつめ)。 コメントが英語ですらないですが、ソースを読むだけだったら問題ないですね。 わりかし ベタっと 書いてあるので、流れは追いやすいでしょう。 面倒だとしたら、MIME の処理(いわゆる添付ファイル)かなあ。

参考URL:
http://www.spencernetwork.org/reference/rfc1939-ja-POP3.txt,http://www.salemioche.com/us/pop_prog1.htm
sting
質問者

お礼

回答ありがとうございます。私にはちょっと難しかったです・・・ mailコマンド起動の方で探してみようと思います。 でもサンプルがなかなかなくて・・・

sting
質問者

補足

POPでやるとすると、各ユーザ名、パスワードが事前にわかっていないといけないですよね? POPにするかmailコマンドにするか悩みどころです・・・。

関連するQ&A

  • C言語での置換処理について

    引数で指定されたディレクトリ配下のファイル全てに置換処理を行う 処理をC言語で作成したいと考えています。 ディレクトリ配下には、最大で100MB位のファイルが約100件存在する 想定です。 (ファイルのサイズ、件数は実行毎に異なります。) そこで2点ほど教えていただきたいことがあります。 1.基本的に、UNIXコマンドのtrコマンドでで置換するより、C言語で   全てのファイルを開き1行ずつ、「置換文字列のチェック」→   「置換文字列が存在すれば置換」→「ファイル書込み」と行った   ほうが早いものでしょうか?   (trコマンドを実行したところ、10分待っても処理が完了しませんでした。) 2.C言語にてディレクトリ配下のファイル名を取得し、ファイルの   件数分ループさせるにはどのようにすればよいのでしょうか?   execコマンドにて「ls -l test.txt | awk '{print $○}'」   (ファイル名のみ取得)の結果をファイルに出力し、そのファイル   からファイル名を取得し、EOFになるまでループすることで出来る   と思いますが、この方法は一般的でしょうか?   出来れば余計なファイルは、作成したくないと考えています。 ご回答の方、よろしくお願いします。

  • リモートでのスクリプトファイルの実行方法について

    Solaris9を利用しております。 データを更新するスクリプトファイル(shファイル)があり、現在はcronで スケジュール設定を行っております。 最近、そのスクリプトファイルの実行をユーザの意図したタイミングで走らせたい という要望が挙がっております。 ただし、そのユーザはUNIXについては全く知らない素人なため、直接コマンドを 実行させるのは避けたい状況です。(ログインパスワードも知らせたくない) という状況なのですが、簡単な操作でスクリプトを実行できる何か良い方法はありますでしょうか? 宜しくお願い致します。

  • リモートシェルでファイルをrootで実行させる方法

    UNIX1マシンから一般ユーザーで、ramshを使って UNIX2マシンのシェルをrootで実行させる、という仕組みを 自動化させたいのですが、パスワードが聞かれるためうまくいきません。 何か良い方法はあるでしょうか? もしくは一般ユーザーがUNIX2のシェルを実行し、その中で suコマンドを使ってrootであるファイルを実行する、というパターン でもいいのですが。 宜しくおねがいします。

  • [unixのシェルコマンド]のエラー「zip: argument list too long」を回避する方法について

    telnetでログインして、 unixのシェルコマンドを使って圧縮 % zip file.zip filename/* すると、 zip: argument list too long というエラーが出てしまいます。 凡そ40万ファイル程度あるのですがこれを 一括で簡単に圧縮したいのですが何か良い方法は無いでしょうか?

  • バイナリファイルの解析方法

    Unixでのlastコマンドをつくろうと思っています。 lastコマンドはwtmpxというバイナリファイルを参照しているらしいと分かり、 wtmpxを分析してlastコマンドと同じ出力結果を出そうとスクリプトを書いてます。 ただ、分析するため od -c wtmpx というコマンドが良いと思ったのですが、これではlastで得られるような時間(いつログインしたか)までは分かりませんでした。 このようなバイナリファイルを解析するにはどうすればよいでしょうか?

  • Windowsでsuコマンド

    ユーザのパスワードを知ることなくユーザの環境をセットアップ できないかなと考えています。 Unixでは 管理者はsuコマンドを使いユーザのパスワードを知らなくても ログインしてユーザの環境を利用することができます。 似たような機能として runasコマンドや 別のユーザとして実行 という 機能があるのですがパスワードが必要だし、ユーザの環境をセットアップ したい時には意味がありません。 どなたか知っていたら教えてください。 よろしくお願いします。

  • mvコマンド

    UNIXは初心者の者です。 mvコマンドを実行したらPermission deniedがでてmvできません。 どうすればよいですか? ユーザーも自分ではいっておりファイルのユーザーとグループも 自分になっています。

  • unix の mv コマンド

    unix の mv コマンドの mv -i directory1 directory2 の場合で、directory2が既存でない場合、directory1をdirectory2 に移動する(変名する)と、 参考書に書いてありますが、既存でないとは、lsでは、ディレクトリー名が出てくるけど、emptyなディレクトリーということでしょうか(ファイルが入ってない)? mv -i filename1 filename2 の場合、filename1 を filename2 に移動(変名する)と参考書にありますが、ファイルの名前だけ変えることじゃなくて中身も変えるということでしょうか? mv コマンドでは、単にファイルの名前だけ変えることはできないということでしょうか? unix超初心者で申し訳ありませんが、よろしくお教えください。

  • 環境変数の取得について

    Javaプログラムで環境変数を取得することって可能ですか?? 例えば任意の環境変数%TEST%なんかを設定してから実行したら 取得可能ですか??(OSはUnix上です) もしくはプロパティファイルかなんか設定ファイルを使用しても良いと考えているのですが、Unix上でResourceBundleクラスを使用するとき、ファイルの配置場所はどこにあれば良いのでしょうか??

    • ベストアンサー
    • Java
  • UNIXで、あるサーバhogeにログインしているログインIDとユーザの名前だけを表示させたい

    UNIXで、あるサーバhogeにログインしているログインIDとユーザの名前だけを表示させたいのですが、コマンドをどのように入力すればよいでしょうか。