2000.03.20 初出
2000.11.15 更新
リリース 説明 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
$ 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ライブラリの基礎知識は、こちら。
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コネクションを毎回切断せずに大量にメールを送信するとき に使います。
例: char svr[] = "127.0.0.1"; char svr[] = "/var/qmail/bin/qmail-queue"; char svr[] = "-euc 127.0.0.1"; char svr[] = "-sjis hege.com/127.0.0.1:25:60";
拡張子 | Content-type |
---|---|
txt | text/plain |
htm html | text/html |
jpg jpeg | image/jpeg |
gif | image/gif |
bmp | image/bmp |
zip | application/x-zip-compressed |
doc | application/msword |
xls | application/vnd.ms-excel |
ppt | application/vnd.ms-excel |
xls | application/vnd.ms-powerpoint |
exe dll | application/vnd.ms-download |
eml mht mhtml nws | message/rfc822 |
fdf | application/vnd.fdf |
application/pdf | |
rmi | audio/mid |
qt mov | video/quicktime |
avi | video/x-msvideo |
tiff | image/tiff |
wav mp1 mp2 mp3 | audio/wav |
als | Audio/X-Alpha5 |
以外 | application/octet-stream |
BP は、BSendMail2関数のインタフェースエリアです。 BsendMail2 関数は、SMTPコネクションを維持するため、 送信内容は、コールバック関数内で設定します。 コールバック関数は、制御ファイルの1行単位に送信前と後に bsmtpライブラリが呼出します。 struct bsmtp_para { char* to; /* to address */ char* from; /* from address */ char* subject; /* subject */ char* body; /* body */ char* files; /* attach files */ char* msg; /* message */ char* control_file; /* control file name */ void (*CallBack)(struct bsmtp_para*); /* call-back address */ int interval; /* interval time for connect */ int interval_send; /* send count for once */ int calltype; /* 0: before call 1: after call */ char* current_arg; /* current aurgument */ int rc; /* return code */ char* work; /* work area */ }; to : 送信先アドレス。コールバック関数内で変更可能。 from : 送信元アドレス。コールバック関数内で変更可能。 subject : サブジェクト。コールバック関数内で変更可能。 body : 本文。コールバック関数内で変更可能。 files : 添付ファイル名。コールバック関数内で変更可能。 msg : メッセージエリア(80バイト)。 control_file : 制御ファイル名。このファイルを1行ごとに読込んで コールバック関数が呼出されます。 calltype : CallBack関数のタイプ。0-メール送信前、1-メール送信後。 CallBack : コールバック関数のアドレス。メール送信前とメール送信後に bsmtpライブラリから呼び出されます。NULL の場合、呼出しません。 送信状況を参照、本文を個別に変更したいときに便利です。 宛先ごとに本文の内容を変更したいときは、body 変数に本文の 内容を設定します。 interval : 再コネクト時の時間間隔を秒単位で指定します。 interval_send : 1回のSMTPコネクションでの送信メール数を指定します。 この数に達すると再コネクトして送信します。 0 なら1回のSMTPコネクションで全メールを送信します。 current_arg : 制御ファイルから呼出されたカレント行の内容。 コールバック関数内でこの内容をもとに to や body を変更します。 rc : 送信結果が設定されます。コールバック関数で参照します。 コールバック関数の calltype= 1 のとき有効。 0 - エラー。1 - 成功。 work : 作業領域。
0 - エラー。 1 - 成功。
0 - エラー。 n - 送信メール数。
使用例: ●宛先が 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"; ●メール送信の拡張オプション
- 代表宛先名 "@to-header" 先頭が"@" ならば 先頭の "@" を削除して To: ヘッダーとして送信します。 メールアドレス以外の名前を使えます。日本語も使えます。メーリングリストに最適。 必ず、bccあるいはcc と共に使うこと。 例: char mailto[] = "@Centerfolds-ML-User\tbcc\twho@hoge.com"; 次のように送信します。 To: Centerfolds-ML-User
- 転送モード ">#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";
- 転送モード時のヘッダー削除 ">#d" 転送するメールの該当ヘッダーを削除したいときに指定します。 例: char mailto[] = "@ML-user\t>#xfr /home/user/mail/mail.txt\t>#dcc:\tbcc\twho@hoge.com";
- 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
=================== 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 終了 ======================================