调用Outlook发送邮件
// uses ComObj,Dialogsfunction TForm1.SendMailWithAttachments(Email, Subject : string; Body : Widestring ; Filename : string): boolean;var outlook : variant; item : variant;begintry outlook := CreateOLEObject('outlook.application'); try item := outlook.CreateItem(0); item.Subject := Subject; // You can use "Body := Memo1.text". item.Body := Body; // You can add more Attachments by adding the same line. item.Attachments.Add(FileName,1,1,FileName); item.To := email; item.Send; finally // To make sure Outlook don't stay open. outlook.quit; end; except result := false; exit; end;result := true;end;// Here is an example how the function works.procedure TForm1.Button1Click(Sender: TObject);var Opendialog1 : TOpenDialog; begin // Create an OpenDialog to get the Attachment. // Is the Dialogs unit in the uses line? Opendialog1 := TOpendialog.Create(application); try if OpenDialog1.Execute then begin SendMailWithAttachments('[email protected]', 'Delphi3000 function','Have fun!',opendialog1.FileName); end; finally Opendialog1.Destroy; end;end;--------------------------------------------------------------------------------
uses ComObj; {Delphi 5} procedure TForm1.Button1Click(Sender: TObject); const // Outlook邮件类型常数 olMailItem = 0; olAppointmentItem = 1; olContactItem = 2; olTaskItem = 3; olJournalItem = 4; olNoteItem = 5; olPostItem = 6; // Outlook附件类型常数 olByValue = 1; olByReference = 4; olEmbeddedItem = 5; olOLE = 6; var myOlApp, myItem, myRecipient, myAttachments: OleVariant; begin // 生成邮件和附件 myOlApp := CreateOLEObject('Outlook.Application'); myItem := myOlApp.CreateItem(olMailItem); myItem.Subject := 'This is the Subject'; myRecipient := myItem.Recipients.Add('[email protected]'); myItem.Body := #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'Hello,' + #13; myItem.Body := myItem.Body + 'This code created this message and '+ ' sent it and I didn''t even have' + #13; myItem.Body := myItem.Body + 'to click the send button!!!' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'If you have any more problems, let me know' + #13; myItem.Body := myItem.Body + 'rename to blah.vbs and run like this:' + #13; myItem.Body := myItem.Body + 'wscript c:\blah.vbs' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'Eddie' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'const'+ #13; myItem.Body := myItem.Body + ' // 邮件类型常数'+ #13; myItem.Body := myItem.Body + ' olMailItem = 0;'+ #13; myItem.Body := myItem.Body + ' olAppointmentItem = 1;'+ #13; myItem.Body := myItem.Body + ' olContactItem = 2;'+ #13; myItem.Body := myItem.Body + ' olTaskItem = 3;'+ #13; myItem.Body := myItem.Body + ' olJournalItem = 4;'+ #13; myItem.Body := myItem.Body + ' olNoteItem = 5;'+ #13; myItem.Body := myItem.Body + ' olPostItem = 6;'+ #13; myItem.Body := myItem.Body + ' // 附件类型常数'+ #13; myItem.Body := myItem.Body + ' olByValue = 1;'+ #13; myItem.Body := myItem.Body + ' olByReference = 4;'+ #13; myItem.Body := myItem.Body + ' olEmbeddedItem = 5;'+ #13; myItem.Body := myItem.Body + ' olOLE = 6;'+ #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'var'+ #13; myItem.Body := myItem.Body + ' myOlApp, myItem, myRecipient, myAttachments:OleVariant;'+ #13; myItem.Body := myItem.Body + 'begin'+ #13; myItem.Body := myItem.Body + ' myOlApp := CreateObject(''Outlook.Application'')' + #13; myItem.Body := myItem.Body + ' myItem := myOlApp.CreateItem(olMailItem)' + #13; myItem.Body := myItem.Body + ' myItem.Subject := ''This is the Subject''' + #13; myItem.Body := myItem.Body + ' myItem.Body := ''This is the body''' + #13; myItem.Body := myItem.Body + ' myRecipient := myItem.Recipients.Add('[email protected]')' + #13; myItem.Body := myItem.Body + ' myAttachments := myItem.Attachments' + #13; myItem.Body := myItem.Body + ' // 开始粘贴附件...' + #13; myItem.Body := myItem.Body + ' myAttachments.Add ''C:\blah.txt'', olByValue,1, ''Blah.txt Attachment''' + #13; myItem.Body := myItem.Body + ' myItem.Send' + #13; myItem.Body := myItem.Body + ' myOlApp := VarNull;' + #13; myItem.Body := myItem.Body + ' myItem := VarNull;' + #13; myItem.Body := myItem.Body + ' myRecipient := VarNull;' + #13; myItem.Body := myItem.Body + ' myAttachments := VarNull;' + #13; myItem.Body := myItem.Body + 'end;' + #13; // 开始粘贴附件... myAttachments := myItem.Attachments; myAttachments.Add('C:\blah.txt', olByValue, 1, 'Blah.txt Attachment'); myItem.Send myOlApp := VarNull; myItem := VarNull; myRecipient := VarNull; myAttachments := VarNull; end;
// uses ComObj,Dialogsfunction TForm1.SendMailWithAttachments(Email, Subject : string; Body : Widestring ; Filename : string): boolean;var outlook : variant; item : variant;begintry outlook := CreateOLEObject('outlook.application'); try item := outlook.CreateItem(0); item.Subject := Subject; // You can use "Body := Memo1.text". item.Body := Body; // You can add more Attachments by adding the same line. item.Attachments.Add(FileName,1,1,FileName); item.To := email; item.Send; finally // To make sure Outlook don't stay open. outlook.quit; end; except result := false; exit; end;result := true;end;// Here is an example how the function works.procedure TForm1.Button1Click(Sender: TObject);var Opendialog1 : TOpenDialog; begin // Create an OpenDialog to get the Attachment. // Is the Dialogs unit in the uses line? Opendialog1 := TOpendialog.Create(application); try if OpenDialog1.Execute then begin SendMailWithAttachments('[email protected]', 'Delphi3000 function','Have fun!',opendialog1.FileName); end; finally Opendialog1.Destroy; end;end;--------------------------------------------------------------------------------
uses ComObj; {Delphi 5} procedure TForm1.Button1Click(Sender: TObject); const // Outlook邮件类型常数 olMailItem = 0; olAppointmentItem = 1; olContactItem = 2; olTaskItem = 3; olJournalItem = 4; olNoteItem = 5; olPostItem = 6; // Outlook附件类型常数 olByValue = 1; olByReference = 4; olEmbeddedItem = 5; olOLE = 6; var myOlApp, myItem, myRecipient, myAttachments: OleVariant; begin // 生成邮件和附件 myOlApp := CreateOLEObject('Outlook.Application'); myItem := myOlApp.CreateItem(olMailItem); myItem.Subject := 'This is the Subject'; myRecipient := myItem.Recipients.Add('[email protected]'); myItem.Body := #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'Hello,' + #13; myItem.Body := myItem.Body + 'This code created this message and '+ ' sent it and I didn''t even have' + #13; myItem.Body := myItem.Body + 'to click the send button!!!' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'If you have any more problems, let me know' + #13; myItem.Body := myItem.Body + 'rename to blah.vbs and run like this:' + #13; myItem.Body := myItem.Body + 'wscript c:\blah.vbs' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'Eddie' + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'const'+ #13; myItem.Body := myItem.Body + ' // 邮件类型常数'+ #13; myItem.Body := myItem.Body + ' olMailItem = 0;'+ #13; myItem.Body := myItem.Body + ' olAppointmentItem = 1;'+ #13; myItem.Body := myItem.Body + ' olContactItem = 2;'+ #13; myItem.Body := myItem.Body + ' olTaskItem = 3;'+ #13; myItem.Body := myItem.Body + ' olJournalItem = 4;'+ #13; myItem.Body := myItem.Body + ' olNoteItem = 5;'+ #13; myItem.Body := myItem.Body + ' olPostItem = 6;'+ #13; myItem.Body := myItem.Body + ' // 附件类型常数'+ #13; myItem.Body := myItem.Body + ' olByValue = 1;'+ #13; myItem.Body := myItem.Body + ' olByReference = 4;'+ #13; myItem.Body := myItem.Body + ' olEmbeddedItem = 5;'+ #13; myItem.Body := myItem.Body + ' olOLE = 6;'+ #13; myItem.Body := myItem.Body + #13; myItem.Body := myItem.Body + 'var'+ #13; myItem.Body := myItem.Body + ' myOlApp, myItem, myRecipient, myAttachments:OleVariant;'+ #13; myItem.Body := myItem.Body + 'begin'+ #13; myItem.Body := myItem.Body + ' myOlApp := CreateObject(''Outlook.Application'')' + #13; myItem.Body := myItem.Body + ' myItem := myOlApp.CreateItem(olMailItem)' + #13; myItem.Body := myItem.Body + ' myItem.Subject := ''This is the Subject''' + #13; myItem.Body := myItem.Body + ' myItem.Body := ''This is the body''' + #13; myItem.Body := myItem.Body + ' myRecipient := myItem.Recipients.Add('[email protected]')' + #13; myItem.Body := myItem.Body + ' myAttachments := myItem.Attachments' + #13; myItem.Body := myItem.Body + ' // 开始粘贴附件...' + #13; myItem.Body := myItem.Body + ' myAttachments.Add ''C:\blah.txt'', olByValue,1, ''Blah.txt Attachment''' + #13; myItem.Body := myItem.Body + ' myItem.Send' + #13; myItem.Body := myItem.Body + ' myOlApp := VarNull;' + #13; myItem.Body := myItem.Body + ' myItem := VarNull;' + #13; myItem.Body := myItem.Body + ' myRecipient := VarNull;' + #13; myItem.Body := myItem.Body + ' myAttachments := VarNull;' + #13; myItem.Body := myItem.Body + 'end;' + #13; // 开始粘贴附件... myAttachments := myItem.Attachments; myAttachments.Add('C:\blah.txt', olByValue, 1, 'Blah.txt Attachment'); myItem.Send myOlApp := VarNull; myItem := VarNull; myRecipient := VarNull; myAttachments := VarNull; end;
解决方案 »
- 如何用流把Stringgird导到做好的Excel模板
- 有什么方法可以安全地稳定地把客户数据库中的数据上存到服务器数据库中?
- KeyPress 这个是怎么添加的?
- Delphi+MapX开发的严重问题!
- 如何判断最后一条记录记录? 200410
- 怎样把一个网站的内容下载到本机上,有没有好的软件与工具!!!!
- FORM上画的图象,最小化后又最大化就不见了,该如何处理?
- 请各位帮我寻路。
- 关于查询字段内容相同的问题
- 字体问题??????????????????
- 请详细说明TStringLists的Objects属性的用法,最好有例子!一定给分!
- ComboBox中如何把一天的時間段全部加進去呢(時間的間隔符是按系統來的)?
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type
{ Introducing a new Type of Event to get the Errorcode }
TMapiErrEvent = procedure(Sender: TObject; ErrCode: Integer) of object; TMapiControl = class(TComponent)
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
private
{ Private-Deklarationen }
FSubject: string;
FMailtext: string;
FFromName: string;
FFromAdress: string;
FTOAdr: TStrings;
FCCAdr: TStrings;
FBCCAdr: TStrings;
FAttachedFileName: TStrings;
FDisplayFileName: TStrings;
FShowDialog: Boolean;
FUseAppHandle: Boolean;
{ Error Events: }
FOnUserAbort: TNotifyEvent;
FOnMapiError: TMapiErrEvent;
FOnSuccess: TNotifyEvent;
{ +> Changes by Eugene Mayevski [mailto:[email protected]]}
procedure SetToAddr(newValue : TStrings);
procedure SetCCAddr(newValue : TStrings);
procedure SetBCCAddr(newValue : TStrings);
procedure SetAttachedFileName(newValue : TStrings);
{ +< Changes }
protected
{ Protected-Deklarationen }
public
{ Public-Deklarationen }
ApplicationHandle: THandle;
procedure Sendmail();
procedure Reset();
published
{ Published-Deklarationen }
property Subject: string read FSubject write FSubject;
property Body: string read FMailText write FMailText;
property FromName: string read FFromName write FFromName;
property FromAdress: string read FFromAdress write FFromAdress;
property Recipients: TStrings read FTOAdr write SetTOAddr;
property CopyTo: TStrings read FCCAdr write SetCCAddr;
property BlindCopyTo: TStrings read FBCCAdr write SetBCCAddr;
property AttachedFiles: TStrings read FAttachedFileName write SetAttachedFileName;
property DisplayFileName: TStrings read FDisplayFileName;
property ShowDialog: Boolean read FShowDialog write FShowDialog;
property UseAppHandle: Boolean read FUseAppHandle write FUseAppHandle; { Events: }
property OnUserAbort: TNotifyEvent read FOnUserAbort write FOnUserAbort;
property OnMapiError: TMapiErrEvent read FOnMapiError write FOnMapiError;
property OnSuccess: TNotifyEvent read FOnSuccess write FOnSuccess;
end; procedure Register; implementation uses Mapi; { Register the component: }
procedure Register;
begin
RegisterComponents('expectIT', [TMapiControl]);
end; { TMapiControl } constructor TMapiControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FOnUserAbort := nil;
FOnMapiError := nil;
FOnSuccess := nil;
FSubject := '';
FMailtext := '';
FFromName := '';
FFromAdress := '';
FTOAdr := TStringList.Create;
FCCAdr := TStringList.Create;
FBCCAdr := TStringList.Create;
FAttachedFileName := TStringList.Create;
FDisplayFileName := TStringList.Create;
FShowDialog := False;
ApplicationHandle := Application.Handle;
end; { +> Changes by Eugene Mayevski [mailto:[email protected]]}
procedure TMapiControl.SetToAddr(newValue : TStrings);
begin
FToAdr.Assign(newValue);
end; procedure TMapiControl.SetCCAddr(newValue : TStrings);
begin
FCCAdr.Assign(newValue);
end; procedure TMapiControl.SetBCCAddr(newValue : TStrings);
begin
FBCCAdr.Assign(newValue);
end; procedure TMapiControl.SetAttachedFileName(newValue : TStrings);
begin
FAttachedFileName.Assign(newValue);
end;
{ +< Changes } destructor TMapiControl.Destroy;
begin
FTOAdr.Free;
FCCAdr.Free;
FBCCAdr.Free;
FAttachedFileName.Free;
FDisplayFileName.Free;
inherited destroy;
end; { Reset the fields for re-use}
procedure TMapiControl.Reset;
begin
FSubject := '';
FMailtext := '';
FFromName := '';
FFromAdress := '';
FTOAdr.Clear;
FCCAdr.Clear;
FBCCAdr.Clear;
FAttachedFileName.Clear;
FDisplayFileName.Clear;
end; { Send the Mail via the API, this procedure composes and sends
the Email }
procedure TMapiControl.Sendmail;
var
MapiMessage: TMapiMessage;
MError: Cardinal;
Sender: TMapiRecipDesc;
PRecip, Recipients: PMapiRecipDesc;
PFiles, Attachments: PMapiFileDesc;
i: Integer;
AppHandle: THandle;
{ First we store the Application Handle, if not
the Component might fail to send the Email or
your calling Program gets locked up. }
AppHandle := Application.Handle; { We need all recipients to alloc the memory }
MapiMessage.nRecipCount := FTOAdr.Count + FCCAdr.Count + FBCCAdr.Count;
GetMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc)); try
with MapiMessage do
begin
ulReserved := 0;
{ Setting the Subject: }
lpszSubject := PChar(Self.FSubject); { ... the Body: }
lpszNoteText := PChar(FMailText); lpszMessageType := nil;
lpszDateReceived := nil;
lpszConversationID := nil;
flFlags := 0; { and the sender: (MAPI_ORIG) }
Sender.ulReserved := 0;
Sender.ulRecipClass := MAPI_ORIG;
Sender.lpszName := PChar(FromName);
Sender.lpszAddress := PChar(FromAdress);
Sender.ulEIDSize := 0;
Sender.lpEntryID := nil;
lpOriginator := @Sender; PRecip := Recipients; { We have multiple recipients: (MAPI_TO)
and setting up each: }
if nRecipCount > 0 then
begin
for i := 1 to FTOAdr.Count do
begin
PRecip^.ulReserved := 0;
PRecip^.ulRecipClass := MAPI_TO;
{ lpszName should carry the Name like in the
contacts or the adress book, I will take the
email adress to keep it short: }
PRecip^.lpszName := PChar(FTOAdr.Strings[i - 1]);
{ If you use this component with Outlook97 or 2000
and not some of Express versions you will have to set
'SMTP:' in front of each (email-) adress. Otherwise
Outlook/Mapi will try to handle the Email on itself.
Sounds strange, just erease the 'SMTP:', compile, compose
a mail and take a look at the resulting email adresses
(right click).
}
PRecip^.lpszAddress := PChar('SMTP:' + FTOAdr.Strings[i - 1]);
PRecip^.ulEIDSize := 0;
PRecip^.lpEntryID := nil;
Inc(PRecip);
end; { Same with the carbon copy recipients: (CC, MAPI_CC) }
for i := 1 to FCCAdr.Count do
begin
PRecip^.ulReserved := 0;
PRecip^.ulRecipClass := MAPI_CC;
PRecip^.lpszName := PChar(FCCAdr.Strings[i - 1]);
PRecip^.lpszAddress := PChar('SMTP:' + FCCAdr.Strings[i - 1]);
PRecip^.ulEIDSize := 0;
PRecip^.lpEntryID := nil;
Inc(PRecip);
end; { ... and the blind copy recipients: (BCC, MAPI_BCC) }
for i := 1 to FBCCAdr.Count do
begin
PRecip^.ulReserved := 0;
PRecip^.ulRecipClass := MAPI_BCC;
PRecip^.lpszName := PChar(FBCCAdr.Strings[i - 1]);
PRecip^.lpszAddress := PChar('SMTP:' + FBCCAdr.Strings[i - 1]);
PRecip^.ulEIDSize := 0;
PRecip^.lpEntryID := nil;
Inc(PRecip);
end;
end;
lpRecips := Recipients; { Now we process the attachments: } if FAttachedFileName.Count > 0 then
begin
nFileCount := FAttachedFileName.Count;
GetMem(Attachments, MapiMessage.nFileCount * sizeof(TMapiFileDesc)); PFiles := Attachments; { Fist setting up the display names (without path): }
FDisplayFileName.Clear;
for i := 0 to FAttachedFileName.Count - 1 do
FDisplayFileName.Add(ExtractFileName(FAttachedFileName[i])); if nFileCount > 0 then
begin
{ Now we pass the attached file (their paths) to the
structure: }
for i := 1 to FAttachedFileName.Count do
begin
{ Setting the complete Path }
Attachments^.lpszPathName := PChar(FAttachedFileName.Strings[i - 1]);
{ ... and the displayname: }
Attachments^.lpszFileName := PChar(FDisplayFileName.Strings[i - 1]);
Attachments^.ulReserved := 0;
Attachments^.flFlags := 0;
{ Position has to be -1, please see the WinApi Help
for details. }
Attachments^.nPosition := Cardinal(-1);
Attachments^.lpFileType := nil;
Inc(Attachments);
end;
end;
lpFiles := PFiles;
end
else
begin
nFileCount := 0;
lpFiles := nil;
end;
end; { Send the Mail, silent or verbose:
Verbose means in Express a Mail is composed and shown as setup.
In non-Express versions we show the Login-Dialog for a new
session and after we have choosen the profile to use, the
composed email is shown before sending Silent does currently not work for non-Express version. We have
no Session, no Login Dialog so the system refuses to compose a
new email. In Express Versions the email is sent in the
background.
}
if FShowDialog then
MError := MapiSendMail(0, AppHandle, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0)
else
MError := MapiSendMail(0, AppHandle, MapiMessage, 0, 0); { Now we have to process the error messages. There are some
defined in the MAPI unit please take a look at the unit to get
familiar with it.
I decided to handle USER_ABORT and SUCCESS as special and leave
the rest to fire the "new" error event defined at the top (as
generic error) Not treated as special:
MAPI_E_AMBIGUOUS_RECIPIENT,
MAPI_E_ATTACHMENT_NOT_FOUND,
MAPI_E_ATTACHMENT_OPEN_FAILURE,
MAPI_E_BAD_RECIPTYPE,
MAPI_E_FAILURE,
MAPI_E_INSUFFICIENT_MEMORY,
MAPI_E_LOGIN_FAILURE,
MAPI_E_TEXT_TOO_LARGE,
MAPI_E_TOO_MANY_FILES,
MAPI_E_TOO_MANY_RECIPIENTS,
MAPI_E_UNKNOWN_RECIPIENT:
} case MError of
MAPI_E_USER_ABORT:
begin
if Assigned(FOnUserAbort) then
FOnUserAbort(Self);
end;
SUCCESS_SUCCESS:
begin
if Assigned(FOnSuccess) then
FOnSuccess(Self);
end
else begin
if Assigned(FOnMapiError) then
FOnMapiError(Self, MError);
end; end;
finally
{ Finally we do the cleanups, the message should be on its way }
FreeMem(Recipients, MapiMessage.nRecipCount * sizeof(TMapiRecipDesc));
end;
end; {
Please treat this as free. If you improve the component
I would be glad to get a copy.
} end.