delphi 2010 线程控制indy发邮件问题、、代码如下

路口xia车 2011-11-15 12:10:01
unit sendEmailMsg;

interface

uses
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; //附件列表

implementation

uses 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:='zhoujunjihotpot@126.com';
// tomail:='416457703@qq.com';
// 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;//'415403242@qq.com';//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','zdajio@163.com',
'415403242@qq.com','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','zdajio@163.com',
'415403242@qq.com','aa','aaaa');

这里调用控件发送的类 出现canvas does not allow draw 错误。。
...全文
211 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2011-11-24
  • 打赏
  • 举报
回复
山东蓝鸟贵薪 2011-11-24
  • 打赏
  • 举报
回复
呵呵,那就分享一下吧
山东蓝鸟贵薪 2011-11-24
  • 打赏
  • 举报
回复
呵呵,那就结帖子吧,发发分吧
路口xia车 2011-11-24
  • 打赏
  • 举报
回复
这个问题早解决了。。老大。
山东蓝鸟贵薪 2011-11-24
  • 打赏
  • 举报
回复
跟踪测试时,最好能设置一个“断点”,并检测参数在传递时
是不是有问题吧
山东蓝鸟贵薪 2011-11-24
  • 打赏
  • 举报
回复
建议跟踪测试一下,也可能是参数不对吧

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧