我正在使用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时,它会将确认对话框提示为打印屏幕。我的问题是如何在没有提示确认对话框的情况下立即发送邮件?这有可能实现吗?
答案 0 :(得分:5)
这很容易。不要使用MAPI
。 : - )
在没有用户干预的情况下通过MAPI
发送邮件是恶意软件/间谍软件所做的事情,因此Windows阻止它以防止这种情况发生。您无法绕过该安全性,因为它已被专门添加以防止您这样做。
想象一下,如果可以的话,你写的是坏事。您可以扫描用户计算机,获取所需的任何文件(如财务文档,个人信息等),并在未经用户许可的情况下通过电子邮件发送给他们。或者您可以开始从用户电子邮件帐户发送病毒和垃圾邮件。哎呀!您正在完成以前的工作,这正是用户现在被要求通过MAPI
发送电子邮件的原因。
您可以让用户为您的软件配置其传出帐户,然后使用TIdSMTP
(或任何其他SMTP组件)通过该帐户发送邮件。这允许用户确认您的应用程序将发送邮件,并提供电子邮件所需的任何凭据(服务器名称,电子邮件帐户)和安全信息(用户名,密码等)。
答案 1 :(得分:1)