No.3ベストアンサー
- 回答日時:
system(3)関数を呼ぶことを「システムコール」と言っちゃうとopen(2),socket(2)などの「システムコール」とこんがらがっちゃうのでお止めになったほうがよろしいかと…
system(3)関数はライブラリ関数です。
UNIX系のOSで「システムコール」というと「システム(=OS)の機能を呼び出す」という意味になり、WindowsでいうAPIコールと同様の意味になります。
(深いところまで追求するとAPIとシステムコールは微妙に定義が異なりますが)
余談はこれくらいにして。
大量のメールを送信するならsocket(3)機能で“完全に”アプリケーションで制御するほうが効率はいいでしょう。
メール1メッセージごとにsystem(3)を呼び出すとメッセージごとにmail(1)が起動されてとんでもないことになります。
もし、mailコマンドを使うならpipe(2)システムコールを使ってアプリケーションからmail(1)コマンドを制御したほうがいいでしょう。
1.pipe(2)を3回コールする(以下P1,P2,P3)
2.fork(2)でプロセスを生成する
3.子プロセス側で
P1出力=標準入力
P2入力=標準出力
P3入力=標準エラー出力
にリダイレクトする
4.子プロセスをmail(1)コマンドにexecする
5.親プロセス側で
P1入力にmail(1)コマンドのサブコマンドを出力しmailコマンドを制御
P2出力、P3出力に結果が出力されるのでサブコマンド実行結果確認やエラー制御は“これ”を参照して行う
だたし、pipe(2)でプロセス通信するとデッドロックを起こすことがあるのでしっかりと設計しないとヤバイです。
また、全ユーザに同じメッセージを送るなら
system("mail x1@y1 x2@y2 x3@y3 ... < message") ;
または
system("mail x1@y1 x2@y2 x3@y3 ... <<!.\nメッセージ本文\n!\n") ;
で出来そうな気がします。
(2番目の使い方は$SHELLの設定によって使えないかも?)
上記の中の(数字)の数字はUNIX系OSの伝統的なマニュアルの章番号です。
1...コマンド
2...システムコール
3...ライブラリ関数
を示しており、
$ man 1 mail
のように使います。
回答ありがとうございます。
結局のところ、socket(3)機能で“完全に”アプリケーション制御した方が効率もよく、自由度が高そうなのでそのようにしようと思います。
色々と勉強させて頂きました。
ありがとうございました。
No.2
- 回答日時:
SMTPに特化したAPI(っていうか、システムコール)はありません。
全てを自前で制御するならSocketシステムコールを使う必要があります。
smtp(プロトコルtcp ポート番号25)を使って通信するなら…
1.接続先ホスト(この場合SMTPサーバ)のIPアドレス決定
gethostbynameまたはgethostbyaddr
2.サービスポート決定
getservbynameまたはサービスポート番号直接指定
3.ソケット生成
socket
4.接続
connect
5.送受信
サーバーに対してSMTPコマンドを送信しステータスを受信。これを繰り返す。コマンドにはメールメッセージの送信コマンドが含まれる。
文字コード変換やMIME変換などはSMTPのサービスではないのでアプリケーション側で行う。
send(writeでも可)、recv(readでも可)
6.切断、ソケット廃棄
shutdown,close(closesocketがあればそちらでも可)
SMTPサービスおよびiso-2022-jpコード、MIMEについては該当するRFCを参照してください。
以下、老婆心ながら…
UNIXという名称は元祖の製品(UNIX
Version 1~9およびPWB,System III,System V)のみに許される名称なのでこれら以外のOSをお使いならOSの名称とバージョンを明記してください。
とりあえず、POSIX(UNIX互換OSの標準仕様)でサポートされる機能のみで考えました。
この回答への補足
回答ありがとうございます。
そうですか。SMTPのAPIってないんですね。。。
ソケットでSMTPを意識したSOCKETプログラムを組むかシステムコールのmailコマンドを呼ぶ方法のどちらかしかないんですね。
システムコールの場合、送信エラー等の通信エラーをプログラム側で拾う事ってできますか?
今回のプログラムはバッチで大量のメールを送るプログラムなのですがシステムコールで行うと性能的には問題ありませんか?
ちなみに、OSはsoralis2.6です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TEXの表の位置が・・・
-
バッチファイルでキー操作を行う。
-
コマンドプロンプトについて
-
UDP通信での受信方法について
-
開発者コマンドプロンプト for ...
-
"伴われる"は正しい日本語ですか?
-
IBMメインフレームの勉強法
-
コマンドプロンプトが実行中か...
-
コンボボックス(最終行取得)
-
アンドロイドでも、robocopyは...
-
ローマ字入力で「トゥ」を入力...
-
1点の辻の字に変換したいがエク...
-
チケット何回もエラーは高額請求?
-
「未使用」と「不使用」ってど...
-
コロナ FF-65MR5 EAとエラーが...
-
DoEvents
-
スマホの小文字gについて
-
改札エラーについて
-
記号まるア
-
ネットカフェから、メールでき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンドプロンプトが実行中か...
-
コマンドプロンプトで表示が多...
-
バッチファイルでキー操作を行う。
-
ttlで戻り値を取得する方法
-
別のユーザーフォームのコマン...
-
VBユーザーフォームで時間入力
-
Tera Term Proに関する質問です。
-
RTX1100の削除コマンド
-
コマンドプロンプトですべてのU...
-
コンボボックス(最終行取得)
-
EEPROMのデータの初期化について
-
文字の点滅はどうやるのですか?
-
excel-vbaで作成したマクロを別...
-
コマンドキーがないんですけど...
-
ルーターにつながっている全て...
-
VBA
-
dosバッチ起動後、画面を閉じな...
-
[WSH|JS|VB] telnetコマンドの...
-
【Teratermマクロ】文字列の一...
-
makeコマンドのエラー
おすすめ情報