-PR-
解決済み

UNIX-Cで、SMTP送信するAPIとかないですか?

  • 困ってます
  • 質問No.96823
  • 閲覧数221
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 61% (8/13)

こんにちは。

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

どなたかご存知でしたら教えて下さい。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.3
レベル13

ベストアンサー率 37% (570/1525)

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
のように使います。
お礼コメント
afternoon_cafe

お礼率 61% (8/13)

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

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

色々と勉強させて頂きました。
ありがとうございました。
投稿日時 - 2001-07-02 09:15:33
関連するQ&A
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

APIではありませんが system("mail foo@hoge.ne.jp < message_file"); で送れます。 ...続きを読む
APIではありませんが

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

で送れます。
補足コメント
afternoon_cafe

お礼率 61% (8/13)

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

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


  • 回答No.2
レベル13

ベストアンサー率 37% (570/1525)

SMTPに特化したAPI(っていうか、システムコール)はありません。 全てを自前で制御するならSocketシステムコールを使う必要があります。 smtp(プロトコルtcp ポート番号25)を使って通信するなら… 1.接続先ホスト(この場合SMTPサーバ)のIPアドレス決定 gethostbynameまたはgethostbyaddr 2.サービスポート決定 getservbynameまた ...続きを読む
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の標準仕様)でサポートされる機能のみで考えました。
補足コメント
afternoon_cafe

お礼率 61% (8/13)

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

そうですか。SMTPのAPIってないんですね。。。
ソケットでSMTPを意識したSOCKETプログラムを組むかシステムコールのmailコマンドを呼ぶ方法のどちらかしかないんですね。

システムコールの場合、送信エラー等の通信エラーをプログラム側で拾う事ってできますか?
今回のプログラムはバッチで大量のメールを送るプログラムなのですがシステムコールで行うと性能的には問題ありませんか?

ちなみに、OSはsoralis2.6です。
投稿日時 - 2001-06-29 10:02:30
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ