您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

Delphi中利用Web Services编写一个邮件发送程序

时间:2011/9/3 15:12:41 点击:

  核心提示:很多书上都介绍这个服务的概念,简单的说就是将现在的http服务提升一个层次,提供各种跨平台和跨语言的服务,你不要关心给你服务的服务器是MS系统还是Unix系统,更不要去关心提供服务的程序是用什么语言来...
很多书上都介绍这个服务的概念,简单的说就是将现在的http服务提升一个层次,提供各种跨平台和跨语言的服务,你不要关心给你服务的服务器是MS系统还是Unix系统,更不要去关心提供服务的程序是用什么语言来编写的。它们都是依靠SOAP(简单对象访问协议,现在很流行的一个协议)-一个以XML和HTTP为基础的简单协议来通信的!但我们怎么知道别人提供的服务要哪些参数和怎么样的参数呢?这就要依靠SOAP中提出的WSDL(网络服务定义语言)脚本了。好了简单将这么多吧!下面我们来做一个发送邮件的客户程序吧!
我们平时发送邮件的程序都是使用INDY的idsmtp和idmessage组件配合编写,现在我们利用网络上别人做好的服务来编写一个非常简单的利用WebServices的程序!(WebServices提倡的就是网络服务的共享)
第一步:我们要查找我们需要的服务究竟谁可以提供!现在提供网络上WebServices服务的不算多,但以后就会多了(毕竟WebServices发展没有多久),就象现在的HTTP服务一样!
第二步:得到服务提供者的WSDL,这是我们要求服务的方法和参数调用的封装格式说明。(有点象SDK中的函数申明,不过它是基于网络的,远程调用)
第三步:将WSDL转化为你所使用开发语言的对应单元,这样才好在你的开发语言中使用。这里我们使用delphi7.0,里面有一个专门的工具(WSDL Importer)来智能完成转换,我们基本上不要做什么^_^
第四步:在自己的程序中使用由WSDL映射到我们使用语言的接口来完成整个工作。经过简单的四步,我们完成了一个真正意义上的WebServices客户端程序。
下面分布介绍:
第一步:我们要使用的是发送e-mail的服务,到网上你可以找到很多,我这里使用的是由http://www.abysal.com/soap/soapmaildemo.html提供的;
第二步:找到它的开发接口WSDL:http://www.abysal.com/soap/AbysalEmail.wsdl
第三步:打开自己的Delphi7.0添加一个窗体和6个labeledEdit一个按钮和一个memo就可以了。然后打开file-new-other-webservices-wdsl importer在URL中填入刚才找到的WSDL网络地址,然后单击NEXT就可以生成我们使用的接口单元了!
第四步:在主窗体中再添加一个THTTPRIO组件(它来完成发送数据的包装),并且为它的WSDLLocation属性配上我们使用的WSDL的URL就可以使用了!下面是所有的源码:
-----主窗体代码-----
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, InvokeRegistry, Rio, SOAPHTTPClient,smtpserver{WSDL映射的单元}, StdCtrls,Types{SOAP常用结构的申明},
  ExtCtrls;
type
  TForm1 = class(TForm)
    HTTPRIO1: THTTPRIO;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit3: TLabeledEdit;
    LabeledEdit4: TLabeledEdit;
    LabeledEdit5: TLabeledEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Button1: TButton;
    LabeledEdit6: TLabeledEdit;
    LabeledEdit7: TLabeledEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
  services:SendEmailPortType;
begin
  services:=HTTPRIO1 as SendEmailPortType;
  services.SendEmail(LabeledEdit3.Text,LabeledEdit6.Text,
  LabeledEdit7.Text,LabeledEdit4.Text,LabeledEdit5.Text,
  memo1.Lines.Text,'','');
end;
end.
-----WSDL映射的单元-----
unit smtpserver;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
  SendEmailPortType = interface(IInvokable)
  ['{704E446C-ACD4-AFAE-FA0A-385FA6001580}']
    function  SendEmail(const From: WideString; const FromAddress: WideString; const To_: WideString; const ToAddress: WideString; const Subject: WideString; const MsgBody: WideString; const Acknowledgement: WideString; const Priority: WideString): integer; stdcall;
  end;
function GetSendEmailPortType(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): SendEmailPortType;

implementation

function GetSendEmailPortType(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SendEmailPortType;
const
  defWSDL = '  defURL  = 'http://www.abysal.com/soap/abysal_webdtp';
  defSvc  = 'SendEmailService';
  defPrt  = 'SendEmailPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as SendEmailPortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(SendEmailPortType)' target=_blank>http://www.abysal.com/soap/AbysalEmail.wsdl';
  defURL  = 'http://www.abysal.com/soap/abysal_webdtp';
  defSvc  = 'SendEmailService';
  defPrt  = 'SendEmailPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as SendEmailPortType);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

initialization
  InvRegistry.RegisterInterface(TypeInfo(SendEmailPortType), '  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SendEmailPortType), 'http://www.abysal.com/soap#abysal_program=soapmail');
  InvRegistry.RegisterExternalParamName(TypeInfo(SendEmailPortType), 'SendEmail', 'To_', 'To');

end.
以上单元是由WSDL Importer自动生成的' target=_blank>http://www.abysal.com/Abysal-webDTP', 'UTF-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(SendEmailPortType), 'http://www.abysal.com/soap#abysal_program=soapmail');
  InvRegistry.RegisterExternalParamName(TypeInfo(SendEmailPortType), 'SendEmail', 'To_', 'To');

end.
以上单元是由WSDL Importer自动生成的,我们只要注意其中的接口中的方法就可以了。Web Services倡导的简单使用的确真实,我只是知道方法接口,其他的我们一无所知,但是通过SOAP我们一样可以使用这些服务!
好了,编译后试试。我这里发送成功,不知道你做的发送成功了么?
开发环境:WindowsXP+Delphi7.0

作者:网络 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号