プロが教えるわが家の防犯対策術!

こんにちは。

UNIX環境で、メールの送信を行うAPIってないんですか?

どなたかご存知でしたら教えて下さい。

A 回答 (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
のように使います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

結局のところ、socket(3)機能で“完全に”アプリケーション制御した方が効率もよく、自由度が高そうなのでそのようにしようと思います。

色々と勉強させて頂きました。
ありがとうございました。

お礼日時:2001/07/02 09:15

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です。

補足日時:2001/06/29 10:02
    • good
    • 0

APIではありませんが



system("mail foo@hoge.ne.jp < message_file");

で送れます。

この回答への補足

回答ありがとうございます。

なるほど。そういう方法もありますね!気付かなかった。
でも、送信エラー等のエラーハンドリングも行いたいので
やはりAPIでないと駄目なんです。

補足日時:2001/06/28 22:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!