2010年10月7日星期四

delphi使用idsmtp发邮件(转)

摘自:http://www.wesoho.com/article/Delphi/2800.htm

发送主要用两个控件:TIdMessage,TIdSMTP;
定义:
MailMessage: TIdMessage;
Mail: TIdSMTP;

实现举例:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Mail.Connected then Mail.Disconnect;
  Mail.Username := ''; //发件人用户名
  Mail.Password := ''; // 发件人密码
  Mail.Host := ''; //SMTP地址 这个地址要设置正确
  Mail.Port := 25; //端口
  Mail.AuthenticationType := atLogin;
  MailMessage.Subject := 'test标题'; //标题
  MailMessage.Body.Text := 'test内容'; //内容
  MailMessage.From.Name := ''; //发件人姓名
  MailMessage.From.Address := ''; //发件人地址
  MailMessage.ReplyTo.EMailAddresses := '';  //发件人地址
  MailMessage.Priority := TIdMessagePriority(1); //身份验证类型
  TIdAttachment.Create(MailMessage.MessageParts, 'C:\Documents and Settings\Administrator\桌面\mail.txt'); //附件地址
  MailMessage.Recipients.EMailAddresses := ''; // 收件人地址
  MailMessage.From.Address := '';    //发件人地址
  try
    Mail.Connect;
    Mail.Authenticate;
    Mail.Send(MailMessage);
  finally
    Mail.Disconnect;
  end;
end;
 ===============================================

对于需要认证的服务器应该这样做

procedure TForm1.Button2Click(Sender: TObject);
begin
begin
   MemoInfo.Clear;
//1:对所必须要的信息进行进行检验

  //校验服务器属性
  if (Trim(HostName.Text)='') or  (Trim(HostPort.Text)='') then
    begin
    ShowMessage('请设置所要连接的SMTP服务器属性!');
    HostPort.Text:='25';
    HostName.SetFocus;
    Exit;
    end;
   //检测地址信息
  if (Trim(EditFrom.Text)='') or (Trim(EditTo.Text)='') then
     begin
     ShowMessage('请输入收信人或者发信人地址!');
     EditFrom.SetFocus ;
     Exit;
     end;
   //用户账号检验
  if (Trim(EditUser.Text)='') or (Trim(EditPass.Text)='') then
     begin
     ShowMessage('请正确输入用户登录帐号和密码!');
     EditUser.SetFocus;
     Exit;
     end;
   //对MailMessage属性进行赋值
    with MailMessage do
    begin
      Subject := 'test'; //邮件主题
      Body.Assign(MemoMesg.Lines);//邮件正文
      From.Address:=Trim(EditFrom.Text);     //发信人地址
      Recipients.EMailAddresses := Trim(editTo.Text); //收件人地址
      //CCList.EMailAddresses :=EditCC.Text;
      //BCCList.EMailAddresses:=EditBCC.Text;
    //  for indexnum:=0 to AttachmentList.Items.Count  do
     //     TIdAttachment.Create(MailMessage.MessageParts,);

    end;

    //设置连接到服务器属性
   with  IdSMTP do
    begin
    Host:=Trim(HostName.Text);   //SMTP服务器地址
    Port:=StrToInt(Trim(HostPort.Text));     //SMTP服务器端口
    UserName:=Trim(EditUser.Text);           //用户账号
    Password:=Trim(EditPass.Text);           // 用户密码
    end;
    //连接到服务器
    MemoInfo.Lines.Add('准备连接到服务器!'+HostName.Text);
    try
      IdSMTP.Connect();  //调用 Connect连接服务器
      except             //连接失败
         begin
          MemoInfo.Lines.Add('无法连接到服务器!'+HostName.Text);
          Exit;
        end ;
      end;
     //身份验证
     //检测SMTP服务器是否需要验证
      if (IdSMTP.AuthSchemesSupported.IndexOf ( 'LOGIN' ) <> -1)   then
         begin   //服务器要求验证
          MemoInfo.Lines.Add('服务器要求验证');
          IdSMTP.AuthenticationType:=atlogin;
           end
       else
           begin  //服务器不要求验证
               MemoInfo.Lines.Add('服务器不需要验证');
           end;
        MemoInfo.Lines.Add('开始验证');
      try
          if IdSMTP.Authenticate then    //验证通过
             MemoInfo.Lines.Add('服务器验证通过')
          else
             MemoInfo.Lines.Add('服务器验证失败'); //验证失败
    except
        begin
            MemoInfo.Lines.Add('服务器验证失败');
            IdSMTP.Disconnect;

            exit;
         end;
      end;
      //发送信件
       try
        IdSMTP.Send(MailMessage);
      
       except
          MemoInfo.Lines.Add('发送失败');
          end;
          IdSMTP.Disconnect;
       //发送完成
 end;
 end;

===================================================

另外一个例子

在做mes系统时,利用D7 IdMessage&IdSMTP发送邮件,由于电脑中病毒,程序出异常,后调试ok,实现效果,初次接触D7时,从盒子上学习了不少的东西,自己整理了一下,想share给新手,学习参考 !

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, IdBaseComponent, IdMessage, IdComponent,
  IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP;

type
  TSMTPForm = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    btnSend: TButton;
    AttachAdd: TButton;
    GroupBox6: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    HostName: TEdit;
    HostPort: TEdit;
    EditFrom: TEdit;
    EditTo: TEdit;
    EditUser: TEdit;
    EditSubject: TEdit;
    MemoMesg: TMemo;
    AttachmentList: TListBox;
    MemoInfo: TMemo;
    EditPass: TMaskEdit;
    MailMessage: TIdMessage;
    IdSMTP: TIdSMTP;
    AddAttachDlg: TOpenDialog;
    Label9: TLabel;
    EditCC: TEdit;
    Label10: TLabel;
    EditBCC: TEdit;
    procedure btnSendClick(Sender: TObject);
    procedure IdSMTPConnected(Sender: TObject);
    procedure IdSMTPDisconnected(Sender: TObject);
    procedure AttachAddClick(Sender: TObject);
    procedure AttachmentListKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure IdSMTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure IdSMTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure IdSMTPWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  SMTPForm: TSMTPForm;

implementation

{$R *.dfm}

procedure TSMTPForm.btnSendClick(Sender: TObject);

begin
   MemoInfo.Clear;
//1:對所必須要的信息進行進行檢驗

  //校驗服務器屬性
  if (Trim(HostName.Text)='') or  (Trim(HostPort.Text)='') then
    begin
    ShowMessage('請設置所要連接的SMTP服務器屬性!');
    HostPort.Text:='25';
    HostName.SetFocus;
    Exit;
    end;
   //檢測地址信息
  if (Trim(EditFrom.Text)='') or (Trim(EditTo.Text)='') then
     begin
     ShowMessage('請輸入收信人或者發信人地址!');
     EditFrom.SetFocus ;
     Exit;
     end;
   //用戶賬號檢驗
  if (Trim(EditUser.Text)='') or (Trim(EditPass.Text)='') then
     begin
     ShowMessage('請正確輸入用戶登錄帳號和密碼!');
     EditUser.SetFocus;
     Exit;
     end;
   //對MailMessage屬性進行賦值
    with MailMessage do
    begin
      Subject := EditSubject.Text; //郵件主題
      Body.Assign(MemoMesg.Lines);//郵件正文
      From.Address:=Trim(EditFrom.Text);     //發信人地址
      Recipients.EMailAddresses := Trim(editTo.Text); //收件人地址
      CCList.EMailAddresses :=EditCC.Text;
      BCCList.EMailAddresses:=EditBCC.Text;
    //  for indexnum:=0 to AttachmentList.Items.Count  do
     //     TIdAttachment.Create(MailMessage.MessageParts,);

    end;

    //設置連接到服務器屬性
   with  IdSMTP do
    begin
    Host:=Trim(HostName.Text);   //SMTP服務器地址
    Port:=StrToInt(Trim(HostPort.Text));     //SMTP服務器端口
    UserName:=Trim(EditUser.Text);           //用戶賬號
    Password:=Trim(EditPass.Text);           // 用戶密碼
    end;
    //連接到服務
    MemoInfo.Lines.Add('準備連接到服務器!'+HostName.Text);
    try
      IdSMTP.Connect();  //調用 Connect連接服務
      except             //連接失敗
         begin
          MemoInfo.Lines.Add('無法連接到服務器!'+HostName.Text);
          Exit;
        end ;
      end;
     //身份驗證
     //檢測SMTP服務器是否需要驗證
      if (IdSMTP.AuthSchemesSupported.IndexOf ( 'LOGIN' ) <> -1)   then
         begin   //服務器要求驗證
          MemoInfo.Lines.Add('服務器要求驗證');
          IdSMTP.AuthenticationType:=atlogin;
           end
       else
           begin  //服務器不要求驗證
               MemoInfo.Lines.Add('服務器不需要驗證');
           end;
        MemoInfo.Lines.Add('開始驗證');
      try
          if IdSMTP.Authenticate then    //驗證通過
             MemoInfo.Lines.Add('服務器驗證通過')
          else
             MemoInfo.Lines.Add('服務器驗證失敗'); //驗證失敗
    except
        begin
            MemoInfo.Lines.Add('服務器驗證失敗');
            IdSMTP.Disconnect;

            exit;
         end;
      end;
      //發送信件
       try
        IdSMTP.Send(MailMessage);
      
       except
          MemoInfo.Lines.Add('發送失敗');
          end;
          IdSMTP.Disconnect;
       //發送完成

end;

procedure TSMTPForm.IdSMTPConnected(Sender: TObject);
begin
 MemoInfo.Lines.Add('已經連接到服務器!'+HostName.Text)
end;

procedure TSMTPForm.IdSMTPDisconnected(Sender: TObject);
begin
    MemoInfo.Lines.Add('斷開連接');
end;

procedure TSMTPForm.AttachAddClick(Sender: TObject);
begin
if AddAttachDlg.Execute then
      begin
       AttachmentList.Items.Add(AddAttachDlg.FileName);
       TIdAttachment.Create(MailMessage.MessageParts, AddAttachDlg.FileName);

      end;
end;

procedure TSMTPForm.AttachmentListKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var
   index:Integer;
  begin
   //有效性檢查
   if AttachmentList.ItemIndex=-1 then
      exit;
   //如果按Delete鍵,則刪除該附件
   if Key<>VK_Delete then
   exit;
   index:=AttachmentList.ItemIndex;
   AttachmentList.Items.Delete(index);  //刪除列表中項
   MailMessage.MessageParts.Delete(index);
end;

procedure TSMTPForm.IdSMTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
 MemoInfo.Lines.Add('發送信件成功');
end;

procedure TSMTPForm.IdSMTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
 MemoInfo.Lines.Add('開始發送信件');
end;

procedure TSMTPForm.IdSMTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
 MemoInfo.Lines.Add('正在發送信件');
end;

end.


没有评论: