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で質問しましょう!
似たような質問が見つかりました
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- サーバー 接続・ログインはできているのにメールが送信できない 2 2022/06/27 15:03
- ドメイン・サーバー・クラウドサービス Google Workspaceでの独自ドメインのメール送信について 2 2022/05/31 19:48
- システム メール送信について、ドメイン「@liam.co.jp」でメールを送信します。 ネットワークaにあるA 2 2022/05/31 15:47
- Outlook(アウトルック) メール送信できない 3 2022/07/20 09:07
- iOS Unix実行ファイルの開き方 1 2022/06/07 12:47
- WordPress(ワードプレス) Contact Form7?でお問い合わせを送信できません 2 2023/02/02 13:24
- その他(メールソフト・メールサービス) Thunderbirdのメール送信ができません 1 2022/10/28 16:54
- ネットワーク ニフティメールのiPhoneとWin PCでの運用 1 2023/03/30 11:19
- C言語・C++・C# ファイルがあるのにエクスプローラでは存在しない 4 2023/02/15 17:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルでキー操作を行う。
-
ttlで戻り値を取得する方法
-
コマンドプロンプトで表示が多...
-
コマンドプロンプトが実行中か...
-
コマンドキーがないんですけど...
-
EEPROMのデータの初期化について
-
別のユーザーフォームのコマン...
-
VBユーザーフォームで時間入力
-
VBA でshell関数を使ってコマン...
-
DOSコマンドでポートから受信
-
この画像のプログラムを出すコ...
-
RTX1100の削除コマンド
-
シリアル通信でコマンドを送信...
-
ルーターにつながっている全て...
-
PowerShell実行結果をデスクト...
-
ディスクの空き容量を取得する...
-
Pythonのターミナルをクリアし...
-
makeコマンドのエラー
-
delphiでtelnet(indy)
-
tcl/tkで標準出力に出される値...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイルでキー操作を行う。
-
コマンドプロンプトが実行中か...
-
コマンドプロンプトで表示が多...
-
ttlで戻り値を取得する方法
-
Tera Term Proに関する質問です。
-
別のユーザーフォームのコマン...
-
RTX1100の削除コマンド
-
VBユーザーフォームで時間入力
-
コマンドキーがないんですけど...
-
TEXの表の位置が・・・
-
ルーターにつながっている全て...
-
dosバッチ起動後、画面を閉じな...
-
コマンドプロンプトですべてのU...
-
makeコマンドのエラー
-
コンボボックス(最終行取得)
-
デフォルトのショートカットキ...
-
【Teratermマクロ】文字列の一...
-
文字の点滅はどうやるのですか?
-
excel-vbaで作成したマクロを別...
-
jupyter notebookが開けません!
おすすめ情報