1

私は Delphi XE3 を使用しています。以下は私のサンプル アプリケーションです。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    function Send(const FromAddr, ToAddr, Subject: String; const AttachFiles: array
        of string; const MsgBody: String): boolean;
  end;

var
  Form1: TForm1;

implementation

uses Winapi.Mapi;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Send('', 'lmengyew@gmail.com', 'test', [], '');
end;

function TForm1.Send(const FromAddr, ToAddr, Subject: String; const
    AttachFiles: array of string; const MsgBody: String): boolean;
var Msg: TMapiMessage;
    lpSender, lpRecipient: TMapiRecipDesc;
    Attach: array of TMapiFileDesc;
    SMTP: TFNMapiSendMail;
    MAPIModule: HModule;
    i: integer;
    S: string;
begin
  Result := False;
  FillChar(Msg, SizeOf(Msg), 0);

  Msg.lpszSubject := PAnsiChar(UTF8String(Subject));
  Msg.lpszNoteText := PAnsiChar(UTF8String(MsgBody));

  if FromAddr <> '' then begin
    lpSender.ulRecipClass := MAPI_ORIG;
    lpSender.lpszName     := PAnsiChar(UTF8String(FromAddr));
    lpSender.lpszAddress  := PAnsiChar(UTF8String(FromAddr));
    lpSender.ulReserved   := 0;
    lpSender.ulEIDSize    := 0;
    lpSender.lpEntryID    := Nil;
    Msg.lpOriginator      := @lpSender;
  end;

  if ToAddr <> '' then begin
    lpRecipient.ulRecipClass := MAPI_TO;
    lpRecipient.lpszName     := PAnsiChar(UTF8String(ToAddr));
    lpRecipient.lpszAddress  := PAnsiChar(UTF8String(ToAddr));
    lpRecipient.ulReserved   := 0;
    lpRecipient.ulEIDSize    := 0;
    lpRecipient.lpEntryID    := Nil;
    Msg.nRecipCount          := 1;
    Msg.lpRecips             := @lpRecipient;
  end;

  SetLength(Attach, Length(AttachFiles));
  FillChar(Attach[0], Length(Attach) * SizeOf(TMapiFileDesc), 0);
  i := 0;
  for S in AttachFiles do begin
    Attach[i].nPosition := Cardinal($FFFFFFFF);
    Attach[i].lpszPathName := PAnsiChar(UTF8String(S));
    Inc(i);
  end;
  Msg.nFileCount := Length(AttachFiles);

  if Msg.nFileCount = 0 then
    Msg.lpFiles := nil
  else
    Msg.lpFiles := @Attach[0];

  MAPIModule := LoadLibrary(PChar(MAPIDLL));

  if MAPIModule <> 0 then begin
    try
      @SMTP := GetProcAddress(MAPIModule, 'MAPISendMail');
      if @SMTP <> nil then
        Result := SMTP(0, Application.Handle, Msg, 0, 0) = SUCCESS_SUCCESS;
    finally
      FreeLibrary(MAPIModule);
    end;
  end;
end;

end.

ここに画像の説明を入力

Button1 をクリックすると、印刷画面として確認ダイアログが表示されます。私の質問は、確認ダイアログを表示せずにメールをすぐに送信する方法です。これを達成することは可能ですか?

4

2 に答える 2

5

それは簡単です。使用しないでくださいMAPI。:-)

ユーザーの介入なしにメールを送信MAPIすることは、マルウェア/スパイウェアが行うことであるため、Windows はそれをブロックして、それが起こらないようにします。このセキュリティはバイパスできないようにするために特別に追加されているため、バイパスすることはできません。

できれば想像してみてください。あなたは何か悪いことを書いていました。ユーザーのコンピューターをスキャンして、必要なファイル (財務書類、個人情報など) を取得し、ユーザーの許可なしにどこにでも電子メールで送信できます。または、ユーザーのメール アカウントからウイルスやスパムの送信を開始することもできます。おっとっと!これがまさに、ユーザーが 経由で電子メールを送信するように求められる理由MAPIです。

ユーザーにソフトウェアの送信アカウントを設定してもらい、TIdSMTP(または他の SMTP コンポーネント) を使用してそのアカウント経由でメールを送信できます。これにより、ユーザーはアプリケーションがメールを送信することを確認し、資格情報 (サーバー名、電子メール アカウント) と電子メールに必要なセキュリティ情報 (ユーザー名、パスワードなど) を提供できます。

于 2013-06-29T04:19:13.100 に答える