• ベストアンサー

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

こんにちは。 UNIX環境で、メールの送信を行うAPIってないんですか? どなたかご存知でしたら教えて下さい。

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答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 のように使います。

afternoon_cafe
質問者

お礼

回答ありがとうございます。 結局のところ、socket(3)機能で“完全に”アプリケーション制御した方が効率もよく、自由度が高そうなのでそのようにしようと思います。 色々と勉強させて頂きました。 ありがとうございました。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答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の標準仕様)でサポートされる機能のみで考えました。

afternoon_cafe
質問者

補足

回答ありがとうございます。 そうですか。SMTPのAPIってないんですね。。。 ソケットでSMTPを意識したSOCKETプログラムを組むかシステムコールのmailコマンドを呼ぶ方法のどちらかしかないんですね。 システムコールの場合、送信エラー等の通信エラーをプログラム側で拾う事ってできますか? 今回のプログラムはバッチで大量のメールを送るプログラムなのですがシステムコールで行うと性能的には問題ありませんか? ちなみに、OSはsoralis2.6です。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

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

afternoon_cafe
質問者

補足

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

関連するQ&A

  • winsock APIをUNIXで

    初めて質問させて頂きます。 winsock APIの重複I/O(WSARecv,WSASend)、イベントシグナル(WSAWaitForMultiplrEvnts)に変わるものをUNIX(サーバー側)で実現させたいと考えております。 fcntl,select関数を使って実現出来るようなのですが、サンプルとなるソースが無く使い方がよく分かりません。 お分かりの方、ご教授お願い致します。 それと参考になるページ、本がありましたらあわせて教えて頂けると助かります。

  • UNIXのpasswd

    UNIXユーザのパスワードを変更するAPIを知りませんか?passwdコマンドはTTY入力が必要なのでNGです。 アプリケーションの中からパスワード変更したいのですが該当するAPIをご存じの方、教えてください。 OSはSolarisです。

  • 設定ファイルのAPI

    UnixのC言語でini形式の設定ファイルを取り扱うAPIなどございますでしょうか?ご存知の方がいらっしゃいましたらご教授下さい。 何卒宜しくお願いいたします。

  • unixへのSMTPコマンドでメールが送れません

    windows2000のPC1台と、SolarisOSを積んだunix機が1台(Postfixが素人によりインストールされている状態)あります。 windows2000から、フリーソフトTeraTermを使い、telnetでunix機の25番ポートにSMTPコマンドで 下記のようにメールを送りましたが、エラーが出てしまいます。関係あるかわかりませんが、 resolv.confには社内DNSアドレスが正しく記入されていました。 エラーから、ホストかドメインが見つからなくて、DNSに関連しているだろうことはわかりました。 解決へのヒントをください。よろしくお願いします。 【送ったコマンド】------------------------------------------------------ telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 tokyo_unix.localdomain ESMTP Postfix mail from:tekito@ezweb.ne.jp 250 2.1.0 Ok rcpt to:root@tokyo_unix.localhost 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> from:tekito@ezweb.ne.jp to:root@tokyo_unix.localhost subject:test date:2008/1/24 10:20:30 送信テスト . 250 2.0.0 Ok: queued as 1A34567DA quit 221 2.0.0 Bye Connection to localhost closed by foreign host. 【エラー】------------------------------------------------------------ 3E84667C0 351 Wed Jan 23 09:17:40 tekito@ezweb.ne.jp (Host or domain name not found. Name service error for name=localdomain type=A: Host not found) root@tokyo_unix.localhost F2A2C678B 336 Mon Jan 21 09:51:14 tekito@ezweb.ne.jp (delivery temporarily suspended: Host or domain name not found. Name service error for name=localdomain type=A: Host not found) root@tokyo_unix.localhost --------------------------------------------------------------------

  • APIについて

    文字列をsjisからjisに変換して、 byte型に格納しているのですが dim data() as byte data()をapi関数に渡しているのですが、 apiに渡すときに、apiでの定義は bdata as byte となっていて、バッファを送信するとあります。 この場合、渡す方法としては、data()の配列数分のloopを 行い、1つずつ渡していく方法になるのでしょうか? よくわからない質問かも知れませんが、ご存知の方がいらっしゃいましたらよろしくお願いします。

  • UNIX/Cについて

    今度仕事の都合でUNIX/Cでのプログラミングを行うことになったんですが、 C言語とUNIX/Cの違いがよくわかりません。 C言語を知っていれば、UNIX/Cはできるんでしょうか?

  • smtpでのメール送信?

    最近レンタルするようになったサーバーがsendmailがつかえないと知りました。 smtpでもメール送信のスクリプトを組める様ですが、簡単なサンプルをご存知の方教えていただけないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • メール送信

    Windows2000でVB6.0のSP5を使用していますが、メールの自動送信を行いたいのですが、VBだけではできないのでしょうか? できる事ならあまり環境に依存したくないので、ActiveXやAPI等の使用は避けたいのですが、それしか方法がないのでしょうか? メールは新規メールが起動するのではなく、完全にプログラムからの自動送信を考えています。 つまり、データベース等のデータを使用してメール送信を全自動で行いたいのです。 どうぞ、よろしくお願いします。

  • APIって何でしょうか?

    APIって何でしょうか? こんばんわ。 無知ですみませんが、APIって何ですか? Wikiなどで説明を読みましたが、分かりませんでした。 ・APIの役割って何でしょう? ・APIがなぜあるのか? ・関数コールと違うのか? ・APIが無いとどうなるのか? ご存知の方、教えてください。 (お礼が遅くなるかもしれませんがお願い致します)

  • C#をAPIで取得したいです

    こんにちは。 APIの取得プログラムを書くのは初めてです bootstrapを使っているAPIで スレッド型のサイトです スクロールさせると、新しい投稿が追加されるサイトで、 bootstrap-scrollspy.jsやbootstrap-dropdown.jsを使っているようです 1スレッドずつ取得したいのですが、初めの1ページだけしか取得できていません 環境は Windows 7 Pro i7 mem 24GB VS 2012 Express C# 現在はNewtonsoft.Jsonを使って試しています 回答よろしくお願いします