unit sendEmailMsg;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, GlobVarUnit, ExtCtrls,TlHelp32,idmessage,idsmtp,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase;type
  TfrmSendEmail = class(TForm)
    Label2: TLabel;
    Label8: TLabel;
    Label10: TLabel;
    Label9: TLabel;
    Label1: TLabel;
    ediAttact: TLabel;
    mmMsg: TMemo;
    btnSend: TButton;
    btnAttac: TButton;
    ediSendEmail: TEdit;
    ediEmailpwd: TEdit;
    ComboBox2: TComboBox;
    ediTitle: TEdit;
    lbAttac: TListBox;
    lblEmail: TLabel;
    lblPassword: TLabel;
    Label5: TLabel;
    lblTitle: TLabel;
    lblContent: TLabel;
    lblMsg: TLabel;
    Timer1: TTimer;
    procedure btnAttacClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure sendEmailProc(Smtp,User,Pass,GetMail,TOMail,Subject,MailText:ansistring);
  private
    { Private declarations }
    procedure HideError;
    procedure EmailSended(sendedEmail:string);  public
    { Public declarations }
    procedure ShowNoEmails;
  end;  //發送郵件
  TSendEmail = class(TThread)
  constructor Create(sendEmail:emailInfo;sendContent:AnsiString);overload;
  private
    send_email:emailInfo;
    send_content:AnsiString;
  protected
    procedure Execute;override;
  end;var
  frmSendEmail: TfrmSendEmail;
  attacList:TStringList; //附件列表implementationuses FileOperate, MyRegurl, SendEmailAPI;{$R *.dfm}var
  sendEmailContent:AnsiString;  //保存发送邮件的内容
  emailSendedStr:string;
  sendEmailThreadCount:Integer;
  emailStatus:Boolean=True;procedure TfrmSendEmail.btnAttacClick(Sender: TObject);
var
  fileAttac:String;
  OpenDialog1:TOpenDialog;
begin
  OpenDialog1:=TOpenDialog.Create(nil);
  if OpenDialog1.Execute then
  begin
    fileAttac:=OpenDialog1.FileName;
    lbAttac.Items.Add(fileAttac);
    attacList.Add(fileAttac);
    //ediAttact.Text:=ediAttact.Text+ExtractFileName(fileAttac)+';  ';
    ediAttact.Caption:=ediAttact.Caption+ExtractFileName(fileAttac+';  ')
  end;
  OpenDialog1.Free;
end;procedure TfrmSendEmail.btnSendClick(Sender: TObject);
//var
  //smtp,user,pass,userall,tomail,title,content:AnsiString;
begin   //smtp:='smtp.126.com';
  // user:='zhoujunjihotpot';
  //pass:='zhoujunjihotpot1';
  // userall:='[email protected]';
  // tomail:='[email protected]';
  // title:='修改';
  // content:='修改之后发送成功!';
  // DNASendEMail(smtp,user,pass,userall,tomail,title,content);
  // ShowMessageBox('发送成功!');
  lblMsg.Caption:='';
  send_email.isCard:=0;
  sendEmailThreadCount:=0;
  if not CheckEmail(ediSendEmail.Text) then
  begin
    lblEmail.Visible:=True;
    ediSendEmail.SetFocus;
  end
  else if ediTitle.Text='' then
  begin
    lblTitle.Visible:=True;
    ediTitle.SetFocus;
  end
  else if (mmMsg.Text='') then
  begin
    lblContent.Visible:=True;
    mmMsg.SetFocus;
  end
  else if ediEmailpwd.Text=''  then
  begin
    lblPassword.Visible:=True;
    ediEmailpwd.SetFocus;
  end
  else if Length(sendEmailArr)>0 then
  begin
    ShowMessageBox('当前有邮箱在发送中,请稍后发送!');
  end
  else if pos('名片',ComboBox2.Text)>0 then     //发送名片邮箱
  begin
    send_email.isCard:=1;
    HideError;
  end
  else
  begin
    send_email.isCard:=2;       //一般郵箱
    HideError;
  end;
  //信息
  send_email.emailTitle:= AnsiString(ediTitle.Text);
  send_email.emailContent:='emailContent';
  send_email.emailType:=AnsiString(ComboBox2.Text);
  send_email.emailSendName:=AnsiString(ediSendEmail.Text);
  send_email.emailSendPwd:=AnsiString(ediEmailpwd.Text);
  send_email.userName:=login_user.userName;end;//提示邮件已经发送
procedure TfrmSendEmail.EmailSended(sendedEmail:string);
begin
  lblMsg.Caption:='邮件:'+sendedEmail+'已发送!';
  if (Length(sendEmailArr)<=0) and (sendEmailThreadCount=0) then
  begin
    lbAttac.Items.Clear;
    ediAttact.Caption:='';
    lblMsg.Caption:='邮件已经全部发送完毕!';
    ediTitle.Text:='';
    mmMsg.Text:='';
    emailSendedStr:='';
    attacList.Clear;
  end;
end;procedure TfrmSendEmail.FormCreate(Sender: TObject);
begin
  //附件列表
  ediAttact.Caption:='';
  attacList:=TStringList.Create;
end;//隱藏錯誤提示
procedure TfrmSendEmail.HideError;
begin
  lblEmail.Visible:=False;
  lblPassword.Visible:=False;
  lblTitle.Visible:=False;
  lblContent.Visible:=False;
end;procedure TfrmSendEmail.sendEmailProc(Smtp,User,Pass,GetMail,TOMail,Subject,MailText:ansistring);Var
  i:integer;
  idmessage:Tidmessage;
  idsmtp:Tidsmtp;
begin
   //titleStr:=sendemail.emailTitle;
  //sendEmailThreadCount:=sendEmailThreadCount+1;
   try
  IdMessage:=TIdMessage.Create(nil);
  IdSMTP:= TIdSMTP.Create(nil);
  IdMessage.Clear;
  IdMessage.Encoding:=meMIME;
  IdMessage.ContentType:='text/html';
  IdMessage.ContentTransferEncoding:='base64' ;
  idmessage.CharSet:='gb2312';  IdMessage.From.Address:=GetMail;
  IdMessage.Recipients.EMailAddresses:=TOMail;//'[email protected]';//send_email.emailName;
  //IdMessage1.ContentType:= 'multipart/mixed';
  IdMessage.Subject:=Subject;
  //for I := 0 to mmMsg.lines.Count - 1 do  IdMessage.Body.add(MailText);  IdSMTP.AuthType := satDefault;
  IdSMTP.Authenticate;
  IdSMTP.Host:=smtp;
  IdSMTP.Username:=User;
  IdSMTP.Password:=Pass;
  IdSMTP.Connect;
  ShowMessage('连接成功');
  try
   IdSMTP.Send(IdMessage);
   IdSMTP.Disconnect();
   Showmessage('邮件发送成功!');Except
   Showmessage('邮件发送失败!');
 end;
   finally
    IdSMTP.Disconnect;
    IdMessage.Free;
    IdSMTP.Free;
   end;
end;//没有可供发送的邮件
procedure TfrmSendEmail.ShowNoEmails;
begin
  lblMsg.Caption:='当前类型:'+ComboBox2.Text+' 中,没有可发送的邮件!';
end;//timer事件用于发送邮件信息procedure TfrmSendEmail.Timer1Timer(Sender: TObject);
var
  i,count:Integer;
  e_content:AnsiString;
begin
  //有可供发送的邮件
  if Length(sendEmailArr)>0 then
  begin
    //提示邮件发送中
    if emailStatus then
    begin
      lblMsg.Caption:='邮件正在发送中!';
      emailStatus:=False;
      e_content:='';
      for I := 0 to mmMsg.Lines.Count - 1 do
      begin
        e_content:=e_content+frmSendEmail.mmMsg.Lines.Strings[i]+#13#10;
      end;      if e_content<>'' then
        sendEmailContent:=e_content;      //创建线程发送邮件
      TSendEmail.Create(sendEmailArr[0],sendEmailContent);
      //删除第一个数据
      count:= Length(sendEmailArr);
      if count>0 then
      begin
        for I := 0 to Length(sendEmailArr) - 2 do
          sendEmailArr[i]:=sendEmailArr[i+1];
        SetLength(sendEmailArr,length(sendEmailArr)-1);
      end;
    end;  end
  else
    emailStatus:=True;  if emailSendedStr<>'' then
  begin
    EmailSended(emailSendedStr);
    emailSendedStr:='';
  end;end;{ TSendEmail }constructor TSendEmail.Create(sendEmail: emailInfo;sendContent:AnsiString);
begin
  inherited Create(False);
  send_email:=sendEmail;
  send_content:= sendContent;
end;procedure TSendEmail.Execute;
var
  smtp,sendUser,content:AnsiString;
  i:integer;
begin
  //inherited;
   //synchronize(sendEmailMsg);  FreeOnTerminate:=true;  sendEmailThreadCount:=sendEmailThreadCount+1;
  smtp:='smtp.'+SplitString(send_email.emailSendName,'@')[1];
  sendUser:=AnsiString(SplitString(send_email.emailSendName,'@')[0]);
  //需要发送的内容
  content:='你好:'+send_email.emailLinkMan+#13#10+send_content+
    #13#10+DateTimeToStr(Now);
  //发送邮件   // frmSendEmail.canvas.lock; // frmSendEmail.sendEmailProc(smtp,sendUser,send_email.emailSendPwd,send_email.emailSendName,
    //send_email.emailName,send_email.emailTitle,content);
    frmSendEmail.sendEmailProc('smtp.163.com','zdajio','44580498','[email protected]',
    '[email protected]','aa','aaaa');
     //frmSendEmail.canvas.unlock; // DNASendEMail(smtp,sendUser,send_email.emailSendPwd,send_email.emailSendName,
    //send_email.emailName,send_email.emailTitle,content);// 记录邮件发送成功
content:=StringReplace(content,#13#10,'//',[rfReplaceAll]);
 SaveEmailSended(send_email.emailName,send_email.emailTitle,content,
 DateTimeToStr(Now),send_email.emailType,login_user.userName);
  frmSendEmail.lblEmail.Caption:='';
  emailSendedStr:=string(send_email.emailName);
    sendEmailThreadCount:=sendEmailThreadCount-1;
 emailStatus:=True;end;end.  frmSendEmail.sendEmailProc('smtp.163.com','zdajio','44580498','[email protected]',
    '[email protected]','aa','aaaa');
  
这里调用控件发送的类 出现canvas does not allow draw 错误。。