BSMTP DLL
2003.02.11 更新
BSMTP DLLは、メール送信APIとメール受信APIを提供します。これをあなたのVisual Basic/C++ソースから
呼出せばメール送受信が簡単にできます。
メール受信時にコールバック関数を指定することにより、受信バイト数確認やキャンセルができます。
Visual C++とDelphiから使えます。1つのAPIを呼出すだけでメール送信OK。
Visual Basic/VBAからも使えます。
FlushMail API追加しました。2003/02/11 Update!
Java環境でSMTP/POP3などのメールをテストするには、
Jamesをどうぞ。
ダウンロードファイル一覧
- bsmtp.dll 本体
- bsmtp.h ヘッダファイル
- bsmtp.lib Visual C++ 6.0 用LIBファイル
Visual Basicからの使い方
Declareステートメントを次のように使ってください。
Private Declare Function SendMail Lib "bsmtp" _
(szServer As String, szTo As String, szFrom As String, _
szSubject As String, szBody As String, szFile As String) As String
Private Declare Function SendMailEx Lib "bsmtp" _
(szLogfile As String, szServer As String, szTo As String, _
szFrom As String, szSubject As String, szBody As String, szFile As String) As String
Private Declare Function RcvMail Lib "bsmtp" _
(szServer As String, szUser As String, szPass As String, _
szCommand As String, szDir As String) As Variant
Private Declare Function RcvMail2 Lib "bsmtp" _
(szServer As String, szUser As String, szPass As String, _
szCommand As String, szDir As String, callback As Long) As Variant
Private Declare Function ReadMail Lib "bsmtp" _
(szFilename As String, szPara As String, szDir As String) As Variant
Private Declare Function SortMail Lib "bsmtp" _
(szDir As String, szHeader As String, opt As Long, _
szFilter As String,delflag As Long) As Variant
Private Declare Function FlushMail Lib "bsmtp" _
(szServer As String, szDir As String, szLogfile As String) As Long
メール送信APIの使い方(Visual C++ 6.0/5.0)
- bsmtp.dll をsystem32ディレクトリにコピー。BASP21 DLLを既にインストールしてあれば不要。
- C++ 6.0 :bsmtp.lib を適当なディレクトリにコピー(例:c:\babaq\bsmtp.lib)
- C++ 5.0 :bsmtp50.lib を適当なディレクトリにコピー(例:c:\babaq\bsmtp50.lib)
- 関数プロトタイプを次のように定義
// Bsmtp DLL
extern "C"
__declspec(dllimport)
int BSendMail( LPCSTR szServer, // smtp server name
LPCSTR szTo, // to (最大文字数は8192バイトです)
LPCSTR szFrom, // from
LPCSTR szSubject, // subject
LPCSTR szBody, // body
LPCSTR szFile, // Attach Files (フルパスでタブで区切って複数指定可)
LPSTR msg); // error message
- 次のようにBSendMail関数を呼出す
char msg[80];
int ok = BSendMail(server, // サーバー名。タブで区切ってポート番号を
// 指定できます。
// サーバ名の代わりにディレクトリ名(メールキュー)を指定すると
// メールファイルを作成します。2003/2/6 Update!
// 戻り値は、メールキュー内のメールファイル数になります。
// 作成したメールファイルは、FlushMail APIファイルでサーバに送信します。
to, // to mail address (e.g., who@who.com\twho2...)
from, // from e-mail address
subj, // Message subject
body, // Message body
files, // Attach Files
msg); // error message
if (!ok) {
sprintf(buffer,"送信エラー (%s) %s %s %s %s",
msg,server,to,from,subj);
}
// メールファイル指定の場合2003/2/6 Update!
if (ok <= 9) { // エラー
}
- リンクライブラリに c:\babaq\bsmtp.lib(C++ 6.0の場合)
c:\babaq\bsmtp50.lib(C++ 5.0の場合)を指定してリンク。
bsmtp50.libは、リンクオプション /LINK50COMPATで作成しました。THNX!福嶋さん。
メール送信APIの使い方(Visual C++ 4.2の場合)
Visual C++ 4.2 ではbsmtp50.libのリンク時にエラーが出るようです。
この場合は、bsmtp50.lib を使えません。
LoadLibrary/GetProcAddressを使って関数をコールしてください。
// 関数のプロトタイプをtypedefを使って定義します。
typedef int (*pBSendMail)( LPCSTR szServer,
LPCSTR szTo,
LPCSTR szFrom,
LPCSTR szSubject,
LPCSTR szBody,
LPCSTR szFile,
LPSTR msg);
// ライブラリをロードします
HINSTANCE hInst = ::LoadLibrary("bsmtp.dll");
if (hInst == NULL)
return false;
// 関数ポインタを定義
pBSendMail pBs;
// BSendMail関数アドレスを設定
pBs = (pBSendMail)::GetProcAddress(hInst,"BSendMail");
if (pBs == NULL) {
FreeLibrary(hInst);
return false;
}
// ポインタを使ってBSendMailをコール
int ok = pBs(Server,To,From,Sub,Body,"",msg);
// 最後にライブラリをアンロード
FreeLibrary(hInst);
メール送信APIの使い方(Delphi)
Delphiでも動くようです。Delphiの場合は、libファイルは使えません。
平野@ラネックスさん、サンプルをありがとうございます。
Function BSendMail(
szServer, // smtp server name
szTo, // to
szFrom, // from
szSubject, // subject
szBody, // body
szFile:LPCSTR; // Attach Files split by tab char
msg:LPSTR):Integer; // error message
cdecl external 'Bsmtp.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
wkstr : array[0..80]of Char;
begin
if (BSendMail( PChar(Edit1.Text), // smtp server name
PChar(Edit2.Text), // to
PChar(Edit3.Text), // from
PChar(Edit4.Text), // subject
PChar(''), // body
PChar(Edit5.Text), // Attach Files split by tab char
wkstr) <> 0 )Then
begin
Showmessage('出力しました');
end
else
begin
Showmessage(wkstr);
end;
end;
Delphiでのメール受信のサンプルです。Thanks です北畑さん。
unit BSMTP;
interface
uses Windows;
type
TBSMTPStatus = record
Counter: integer;
Status : array[0..255] of LPSTR;
end;
TPBSMTPStatus = ^TBSMTPStatus;
function BSendMail(
szServer, // smtp server name
szTo, // to
szFrom, // from
szSubject, // subject
szBody, // body
szFile:LPCSTR; // Attach Files split by tab char
msg:LPSTR // error message
):Integer; cdecl external 'Bsmtp.dll';
procedure BFreeArray(Status:TPBSMTPStatus); cdecl external 'Bsmtp.dll';
function BPOP3(
szServer, // pop3 server name
szName, // NAME
szPass, // PASSWORD
szCommand, // COMMAND
szPath:LPCSTR; // directory
Status:TPBSMTPStatus; // return ARRAY LIST
msg:LPSTR // 80 bytes length message area
):Integer; cdecl external 'Bsmtp.dll';
function BMIME(
szCommand, // command name
szFileName, // Target Name
szPath:LPCSTR; // Target Name
Status:TPBSMTPStatus; // return ARRAY LIST
msg:LPSTR // 80 bytes length message area
):Integer; cdecl external 'Bsmtp.dll';
implementation
end.
FlushMail APIの使い方2003/02/11 New !
BSendMail API関数でメールキューに作成したメールファイルをSMTPプロトコルでメール送信します。
複数メールファイルを一度のTCPコネクションで送信するので効率よくメールが送れます。
バックグラウンド(別プロセスでbsendm.exeがFlushMailメソッドを実行)モードでの送信も可能です。
メールファイルは以下のようなテキスト形式です。
1行目:宛先メールアドレス
2行目:送信元メールアドレス
3行目:件名
4行目:添付ファイル名
5行目以降:本文
- 関数プロトタイプを次のように定義
extern "C"
__declspec(dllimport)
int BFlushMail(LPCSTR szServer, // smtp server name
LPCSTR szDir, // メールキュー名
LPCSTR szLogfile); // ログファイル名PASSWORD
char svr[] = "smtp-server"; // バックグラウンド指定は "&smtp-server"
char mdir[] = "c:\\temp\\maildir";
char logfile[] = "c:\\temp\\log.txt";
int rc = BFlushMail(svr,mdir,logfile);
cc/bcc/reply-toや任意のヘッダーの使い方
宛先メールIDパラメータの中にタブで区切ってcc/bcc/reply-to キーワードを指定します。
任意のヘッダーは、">"文字をつけてそのまま指定します。
使用例:
●宛先が id1 、CC に id2、Message-IDヘッダーの例
szTo = "id1\tcc\tid2\t>Message-ID: 12345"
●宛先が id1とid2 、CC に id3の例
szTo = "id1\tid2\tcc\tid2"
●宛先が id1とid2 、CC に id3 id4 の例
szTo = "id1\tid2\tcc\tid3\tid4"
●宛先が id1 、BCC に id2の例
szTo = "id1\tbcc\tid2"
●宛先が id1 、CC に id2、BCCに id3の例
szTo = "id1\tcc\tid2\tbcc\tid3"
●宛先が id1 、Reply-To に id2の例
szTo = "id1\treply-to\tid2"
●CC に id2の例
szTo = "cc\tid2"
●BCC に id2の例
szTo = "bcc\tid2"
●メール送信の拡張オプション
2000/01/23 のバージョンから次のオプションがサポートされます。
- 代表宛先名
"@to-header"
先頭が"@" ならば 先頭の "@" を削除して To: ヘッダーとして送信します。
メールアドレス以外の名前を使えます。日本語も使えます。メーリングリストに最適。
必ず、bccあるいはcc と共に使うこと。
例: mailto = "@Centerfolds-ML-User\tbcc\twho@hoge.com";
次のように送信します。
To: Centerfolds-ML-User
- 転送モード
">#xfr file-name"
指定されたファイルを転送します。RcvMail メソッドで作成されたファイルを指定します。
To: ヘッダーは、削除されますので宛先を指定してください。
サブジェクトは、上書きされます。サブジェクトが"" なら元のサブジェクトをそのまま
送信します。
パラメータとして指定された本文と添付ファイルは、無視されます。
次のヘッダーは、ファイルから削除されます。
X-Mailer:
X-Mail-Agent:
Status:
To:
Return-Path:
Delivered-To:
例1: mailto = "who@hoge.com\t>#xfr c:\\mail\\b21xxx.tmp";
例2: mailto = "@ML-user\t>#xfr c:\\mail\\b21xxx.tmp\tbcc\twho@hoge.com";
- 転送モード時のヘッダー削除
">#d"
転送するメールの該当ヘッダーを削除したいときに指定します。
例: mailto = "@ML-user\t>#xfr c:\\mail\\b21xxx.tmp\t>#dcc:\tbcc\twho@hoge.com";
- Bcc ファイル入力モード
">#bcc file-name"
メールアドレスをファイルから1行ずつ入力して メールを送信します。
送信アドレスは、ヘッダーとして送信しない Bcc として処理します
メールアドレスは、メールIDのみを指定してください。
例: mailto = "@ML-user\t>#xfr c:\\mail\\b21xxx.tmp\t>#bcc c:\\mai\\mailto.txt";
mailto.txt の内容:
# comment 1桁目が "#" の行はコメントとして無視されます
who@hoge.com
who1@hoge.com
who2@hoge.com
SMTPサーバ名の確認方法
SMTPサーバ名は、telnet コマンドで確認できます。次のようにポート番号25
を使って telnet コマンドを打って応答が返ってくるサーバ名がSMTPサーバです。
> telnet サーバ名 25
メール受信APIの使い方
POP3プロトコルでメールを受信します。
- 関数プロトタイプを次のように定義
struct RetArray {
int counter;
char* array[256];
};
extern "C"
__declspec(dllimport)
void BFreeArray(RetArray* parray);
extern "C"
__declspec(dllimport)
int BPOP3( LPCSTR szServer, // pop3 server name
LPCSTR szName, // NAME
LPCSTR szPass, // PASSWORD
LPCSTR szCommand,// COMMAND
LPCSTR szPath, // directory
RetArray* RetArray, // return ARRAY LIST
LPSTR msg // 80 bytes length message area
);
extern "C"
__declspec(dllimport)
int BMIME( LPCSTR szCommand, // command name
LPCSTR szFileName, // Target Name
LPCSTR szPath, // Target Name
RetArray* RetArray, // return ARRAY LIST
LPSTR msg // 80 bytes length message area
);
- BPOP3関数
BPOP3関数は、メールサーバからメールを受信してファイルに書込みます。
パラメータの説明:
szServer * POP3サーバ名を指定。IPアドレスでも可。タブで区切ってポート番号を
指定できます。
szName * メールアカウントのユーザ名
szPass * メールアカウントのパスワード名
2000/05/20 APOPをサポート
APOP 認証をするには、パスワードの前に "a" または "A" に 1個の
ブランクをつけます。
"a xxxx" : サーバがAPOP 未対応なら通常のUSER/PASS 処理をします。
"A xxxx" : サーバがAPOP 未対応ならエラーになります。
szCommand * 処理コマンド。大文字小文字どちらでも可。
STAT ...... メール数と総バイト数のみを返します
LIST ...... すべてのメールのSubject、From、Dateヘッダーの内容のみを
返します。
SAVE n .... n番目のメールを受信します
SAVD n .... n番目のメールを受信し、サーバのメールボックスから
削除します
SAVEALL ... 全てのメールを受信します
SAVEALLD .. 全てのメールを受信し、サーバのメールボックスから
削除します
szPath * 受信したメールを保存するディレクトリ名を指定します。
RetArray * メール受信の結果を配列で返します。配列内容はコマンドによって
次のようになります。エラーが発生した場合は、配列を返しません。
SAVExxx - 受信ファイル名。
STAT - メール数と総バイト数。
LIST - タブで区切られたSubject、From、Dateヘッダーの内容
msg * メッセージ領域(80バイト)
戻り値 * 1以上だと正常終了。
- BMIME関数
BMIME関数は、BPOP3関数で受信したRFC822形式のファイルを読込みます。
パラメータの説明:
szCommand * コマンド。大文字小文字どちらでも可。
GET ...... メールをヘッダー、本文、添付ファイルを読込みます。
GETNOF ... メールをヘッダー、本文のみ読込みます。
HEAD ...... メールのヘッダーのみ読込みます。
szFileName * BPOP3で書込まれたRFC822形式のファイル名
szPath * 添付ファイルを保存するディレクトリ名を指定します。
RetArray * メール受信の結果を配列で返します。配列内容はコマンドによって
次のようになります。エラーが発生した場合は、配列を返しません。
HEAD - ヘッダー。
GET - ヘッダー、本文、添付ファイル名。
GETNOF - ヘッダー、本文。
msg * メッセージ領域(80バイト)
戻り値 * 1以上だと正常終了。
- BFreeArray関数
BFreeArray関数は、BPOP3関数とBMIME関数で使用した配列メモリを開放します。
パラメータの説明:
parray * RetArray構造体のアドレス
BPOP3関数とBMIME関数の使い方
char msgx[80];
RetArray ret1,ret2;
int rc = BPOP3( "server1","user1","pass1",
"save 1","c:\\mail",&ret1,msgx);
if (rc <= 0)
return false;
rc = BMIME("get",ret1.array[0],"c:\\mail",&ret2,msgx);
if (rc > 0) {
FILE *fp = ::fopen("c:\\mail\\mail.txt","wb");
for (int i= 0;i < rc ;i++) {
::fwrite(ret2.array[i],1,strlen(ret2.array[i]),fp);
::fwrite("\015\012",1,2,fp); // put CRLF
}
::fclose(fp);
}
DeleteFile(ret1.array[0]);
BFreeArray(&ret1);
BFreeArray(&ret2);
BPOP3関数でのコールバック関数の使い方
typedef BOOL (APIENTRY *pcallback)(int itemno,int len);
static BOOL APIENTRY CallBack(int itemno,int len)
{
return 0; // 1 でキャンセルできます
}
char msgx[80];
RetArray ret1;
char name[200]; // ユーザ名 [tab] コールバック関数アドレス
wsprintf(name,"user1\t%ld",(long)CallBack);
int rc = BPOP3( "server1",name,"pass1",
"saveall","c:\\mail",&ret1,msgx);
ご注意
Visual C++以外のコンパイラでの動作確認を行っておりません。
babaqフリーソフトのご使用上の注意
●プログラムを使って発生した損害に関しては、一切の責任を負いません。
●使用、配布に制限はありません。自由にお使いください。
●動作の保証はありません。
●動作を確認したOSは、Windows NT 4.0 とWindows 95/98/Me/XP/2000のみです。
Home
Copyright 1997-2003 Tatsuo Baba,All rights reserved.