Bsmtp ライブラリ

2000.03.20 初出
2000.11.15 更新

Bsmtp ライブラリは、メール送信関数を提供します。 アプリケーションで簡単にメールを送信したい方は是非どうぞ。 Red Hat Linux 6.1 gccコンパイラ以外での動作確認を行っておりません。 他のプラットホームで動かしてみた方、お知らせくださればありがたいです。

リリースノート

リリース 説明
1.0 2000/03/20 : 初公開。
1.0a 2000/10/29 : bsmtp.cc:bccファイルモードで宛先エラー時にエラーアドレスの行位置をメッセージに追加。
bwsock.cc:受信でループ状態になる不具合修正。
1.1 2000/11/05 : qmail-queue インタフェース追加。qmail-queueをfork するため高速です。
1.2 2000/11/15 : BSendMail2関数追加。ひとつのSMTPコネクションで複数メール送信を可能に。

ダウンロード


1.2 bsmtp-1.2.tgz (32KB) 2000/11/15
MD5 チェックサム: 59bb9e3814a60d8cab0f4cb1def56ba5
1.1 bsmtp-1.1.tgz (29KB) 2000/11/05
MD5 チェックサム: b0906f409896333727170a3416ecf829

1.0a bsmtp-1.0a.tgz (25KB) 2000/10/29
MD5 チェックサム: da70bc8b17fc4beaa981f7ca36bc6c28

1.0 bsmtp-1.0.tgz (25KB) 2000/03/20
MD5 チェックサム: c6d2b8e461164f6dd7f9feba0a17ed68

インストール

ダウンロードした bsmtp-1.1.tgz を適当なディレクトリにコピーします。
C++ソース提供ですので gcc などのC++コンパイラがないとインストールできません。
RedHat 以外の LinuxやUNIX では Makefile ファイルを環境に合わせて変更して みてください。
次のような手順でインストールします。

$ tar zxvf bsmtp-1.1.tgz           解凍します
                                   tar の z オプションがエラーなら
                                   $ gunzip bsmtp-1.1.tgz
                                   $ tar xvf bsmtp-1.1.tar
$ ls
bsmtp-1.1  bsmtp-1.1.tgz
$ cd bsmtp-1.1                     ディレクトリを変更して
$ make                             コンパイル、ライブラリを作成します
$ su                               エラーが出なかったら root ユーザになります

# make install                     /usr/include に bsmtp.h
                                   /usr/lib にライブラリがコピーされます
# exit
$ ls /usr/include/bsm*             ヘッダファイル名の確認
/usr/include/bsmtp.h       ....... ヘッダーファイル         
$ ls /usr/lib/libbsm*              ライブラリファイルの確認
/usr/lib/libbsmtp.a        ....... スタティックライブラリ
/usr/lib/libbsmtp.so.1.1   ....... 共有ライブラリ
/usr/lib/libbsmtp.so.1     ....... 共有ライブラリへのリンク
/usr/lib/libbsmtp.so       ....... 共有ライブラリへのリンク

$ make bsendm                      bsendmプログラムをコンパイルできれば OK

ライブラリの基礎知識は、こちら。

Bsmtp ライブラリが提供する関数

int BSendMail(char* ipaddr, char* to, char* from,
        char* subject, char* body, char* file, char* msg );
int BSendMail2(char* ipaddr, struct bsmtp_para* BP);
BSendMail/BSendMail2関数は、メールを SMTPプロトコルでメールサーバに送信します。 BSendMail2関数は、SMTPコネクションを毎回切断せずに大量にメールを送信するとき に使います。

cc/bcc/reply-toや任意のヘッダーの使い方

宛先メールIDパラメータの中にタブで区切ってcc/bcc/reply-to キーワードを指定します。 任意のヘッダーは、">"文字をつけてそのまま指定します。
使用例:
●宛先が id1 、CC に id2、Message-IDヘッダー
char szTo[] = "id1\tcc\tid2\t>Message-ID: 12345";

●宛先が id1とid2 、CC に id3
char szTo[] = "id1\tid2\tcc\tid2";

●宛先が id1とid2 、CC に id3 id4
char szTo[] = "id1\tid2\tcc\tid3\tid4";

●宛先が id1 、BCC に id2
char szTo[] = "id1\tbcc\tid2";

●宛先が id1 、CC に id2、BCCに id3
char szTo[] = "id1\tcc\tid2\tbcc\tid3";

●宛先が id1 、Reply-To に id2
char szTo[] = "id1\treply-to\tid2";

●CC に id2の例
char szTo[] = "cc\tid2";

●BCC に id2の例
char szTo[] = "bcc\tid2";

●メール送信の拡張オプション

  1. 代表宛先名 "@to-header" 先頭が"@" ならば 先頭の "@" を削除して To: ヘッダーとして送信します。 メールアドレス以外の名前を使えます。日本語も使えます。メーリングリストに最適。 必ず、bccあるいはcc と共に使うこと。 例: char mailto[] = "@Centerfolds-ML-User\tbcc\twho@hoge.com"; 次のように送信します。 To: Centerfolds-ML-User
  2. 転送モード ">#xfr file-name" 指定されたメールファイルを転送します。 To: ヘッダーは、削除されますので宛先を指定してください。 サブジェクトは、上書きされます。サブジェクトが"" なら元のサブジェクトをそのまま 送信します。 パラメータとして指定された本文と添付ファイルは、無視されます。 次のヘッダーは、ファイルから削除されます。 X-Mailer: X-Mail-Agent: Status: To: Return-Path: Delivered-To: 例1: char mailto[] = "who@hoge.com\t>#xfr ./mail/mail.txt"; 例2: char mailto[] = "@ML-user\t>#xfr /home/user/mail/mail.txt\tbcc\twho@hoge.com";
  3. 転送モード時のヘッダー削除 ">#d" 転送するメールの該当ヘッダーを削除したいときに指定します。 例: char mailto[] = "@ML-user\t>#xfr /home/user/mail/mail.txt\t>#dcc:\tbcc\twho@hoge.com";
  4. Bcc ファイル入力モード ">#bcc file-name" メールアドレスをファイルから1行ずつ入力して メールを送信します。 送信アドレスは、ヘッダーとして送信しない Bcc として処理します メールアドレスは、メールIDのみを指定してください。 例: char mailto[] = "@ML-user\t>#xfr /home/user/mail/mail.txt\t>#bcc /home/user/mail/mailto.txt"; mailto.txt の内容: # comment 1桁目が "#" の行はコメントとして無視されます who@hoge.com who1@hoge.com who2@hoge.com

c サンプル

bsmtp.h ヘッダーファイルをインクルードして関数を呼出します。
メールサーバは、ローカルマシンのqmail を使います。 コンパイルは、次のようにします。
$ gcc sample.c -o sample -lbsmtp
sample2.c は、BsendMail2関数を使ったサンプルです。

=================== sample.c 開始 ======================================
/*
//  sample.c
//
// mail send sample
//                     Author Tatsuo Baba
*/
#include <stdio.h>
#include <bsmtp.h>
int main(int argc,char *argv[])
{
        char msg[80];
        int rc;
        char svr[] = "-euc /var/qmail/bin/qmail-queue";
        char to[] = "xxxx@xxxx.com";
        char from[] = "xxxx@xxxx.com";
        char subject[] = "test";
        char body[] = "test\r\ndesu";
        char file[] = "./sample.c";
        rc = BSendMail(svr,to,from,subject,body,file,msg);
        if (rc == 0)
                printf("send error %s\n",msg);
        else
                printf("send ok\n");

     return 0;
}
=================== sample.c 終了 ======================================


=================== sample2.c 開始 ======================================
//
//  sample2.c
//
// mail send sample using BSendMail2
//
//                  Author Tatsuo Baba

#include <stdio.h>
#include <bsmtp.h>

static void CallBack(struct bsmtp_para *BP)
{
  char body[4096];
  if (BP->calltype == 0) { // before send
      BP->to = BP->current_arg; // set current to
      sprintf(body,"Hello %s\r\n",BP->to);
      strcat(body,"Bye. \r\nRegards,\r\n");
      strcat(body,BP->from);
      strcat(body,"\r\n");
      BP->body = body; // set current body
      return;
  }
  // after send
  if (BP->rc == 0) {
    printf("send error (%s) %s %s\n",BP->msg,BP->to,BP->from);
  } else {
    printf("ok %s %s\n",BP->to,BP->from);
  }
}

int main(int argc,char *argv[])
{
  struct bsmtp_para BP;
  char msg[80],*svr;
  FILE *fp;
  if (argc < 3) {
    printf("invalid arg  usage: sample2 svr addr-file from\n");
    return 1;
  }
  svr = argv[1];
  BP.control_file = argv[2];
  if ((fp = fopen(BP.control_file,"r")) == NULL) {
    printf("cannot open %s\n",BP.control_file);
    return 1;
  }
  fclose(fp);

  BP.CallBack = CallBack;
  BP.to = NULL;
  BP.from = argv[3];
  BP.subject = "test subj";
  BP.body = NULL;
  BP.files = "";
  BP.work = NULL;
  BP.msg = msg;
  BP.rc = 0;
  BP.interval = 0;
  BP.interval_send = 0;
 
  BSendMail2(svr,&BP);

  printf("done. %s\n",BP.rc);
  return 0;
}
=================== sample2.c 終了 ======================================



bsmtp ライブラリを使ったアプリケーション

bsendmは、bsmtp ライブラリを使った メールの高速配信コマンドラインメーラです。


Home


Copyright 2000 Tatsuo Baba,All rights reserved.