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 終了 ======================================