[Delphi] 添付ファイル付きメールをプログラムから送信する
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls,
  Registry, MAPI;               //←要追加

//========================================================================
//  機能:MAPIの有無チェック    By ボーランド技術部 有澤
//========================================================================
function CheckMAPI: boolean;
var
        R : TRegistry;
begin
    Result := False;
    if Win32MajorVersion>=4 then begin
        R := TRegistry.Create;
        try
            R.RootKey := HKEY_LOCAL_MACHINE;
            R.OpenKey('SOFTWARE\Microsoft\Windows Messaging Subsystem',False);
            if R.ReadString('MAPI') = '1' then Result := True;
            R.CloseKey;
        finally
            R.Free;
        end;
    end
    else if GetProfileInt('Mail', 'MAPI', 0) = 1 then Result := True;
end;


//======================================================================
//  機能:添付ファイル付きメール送信(受信者、添付ファイル数:各1件)
//======================================================================
function SendMailProc( Address,Subject,MailText,FileName:string ): boolean;
const
    MaxRecip = 20;      // 最大受信者数(TO,CC,BCC合計)
    MaxFiles = 10;      // 最大添付ファイル数
var
        MapiMessage: TMapiMessage;
        FMapiRecipDescR: array[0..MaxRecip-1] of TMapiRecipDesc;    // 受信者
        FMapiFileDesc  : array[0..MaxFiles-1] of TMapiFileDesc;     // 添付ファイル
        Flag: FLAGS;
        ii: integer;
begin
    ii := 0;
    // 送信先の記述
    with FMapiRecipDescR[ii] do begin
        ulReserved   := 0;
        ulRecipClass := MAPI_TO;            // 受信者は TO:
        lpszName     := PChar(Address);     // 受信者名
        lpszAddress  := nil;
        ulEIDSize    := 0;
        lpEntryID    := nil;
    end;
    // 添付ファイルの記述
    with FMapiFileDesc[ii] do begin
        ulReserved   := 0;
        flFlags      := 0;
        nPosition    := ii;
        lpszPathName := PChar(FileName);
        lpszFileName := nil;
        lpFileType   := nil;
    end;
    // 送信データの編集
    with MapiMessage do begin
        ulReserved         := 0;
        lpszSubject        := PChar(Subject);       //件名
        lpszNoteText       := PChar(MailText);      //本文
        lpszMessageType    := nil;
        lpszDateReceived   := PChar(FormatDateTime('yyyy,mm,dd, hh:mm',Now));
        lpszConversationID := nil;
        flFlags            := 0;                    //送信オプション設定
        lpOriginator       := nil;                  //送信者
        nRecipCount        := 1;                    //受信者の件数
        lpRecips           := @FMapiRecipDescR;     //受信者
        nFileCount         := 1;                    //添付ファイルの件数
        lpFiles            := @FMapiFileDesc;       //添付ファイル
    end;

    Flag := 0;
    Flag := Flag or MAPI_DIALOG;        {送信前にダイアログを表示する時}
    Result := MapiSendMail(0, Application.Handle, MapiMessage,Flag,0)=0;
end;


<< 使用例 >>
procedure TfmMain.Button1Click(Sender: TObject);
var
        Address, Subject, MailText, FileName: string;
        rc: boolean;
begin
    if CheckMAPI() then begin
        Address  := 'o.m.s@nifty.com';
        Subject  := 'メールの件名(MAPISendMail)';
        MailText := 'メールの本文です。'#13#10#13#10'以上';
        FileName := ParamStr(0);
        rc := SendMailProc( Address,Subject,MailText,FileName );
        if rc=FALSE then MessageDlg( '送信エラー',mtError,[mbOK],0 );
    end
    else begin
        MessageDlg( 'メール送信環境が有りません。',mtError,[mbOK],0 );
    end;
end;


受信者(送信先)と添付ファイル数は各1件で作成しているので、用途に応じて修正が
必要です。

[動作確認の結果]
・Outlook Express 6     問題なし
・Windowsメール(Vista)   問題なし
・Netscape Messenger 4.7  本文の改行が無効になる
・Netscape Messenger 7   本文の改行と送信先が無効になる
      

・インターネット上の情報や書籍の内容を一部参考に作成してます。
・コーディング内容は著作権フリーですが、使用する場合は自己責任にてお願いします。
・記述内容に問題点や改善点がありましたらこちらまでお願いします。

サンプル集の一覧に戻る