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をどうぞ。

ダウンロードファイル一覧

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)

メール送信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行目以降:本文

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 のバージョンから次のオプションがサポートされます。

  1. 代表宛先名 "@to-header" 先頭が"@" ならば 先頭の "@" を削除して To: ヘッダーとして送信します。 メールアドレス以外の名前を使えます。日本語も使えます。メーリングリストに最適。 必ず、bccあるいはcc と共に使うこと。 例: mailto = "@Centerfolds-ML-User\tbcc\twho@hoge.com"; 次のように送信します。 To: Centerfolds-ML-User
  2. 転送モード ">#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";
  3. 転送モード時のヘッダー削除 ">#d" 転送するメールの該当ヘッダーを削除したいときに指定します。 例: mailto = "@ML-user\t>#xfr c:\\mail\\b21xxx.tmp\t>#dcc:\tbcc\twho@hoge.com";
  4. 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プロトコルでメールを受信します。
  • 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.