PDA

View Full Version : سوال: نمایش ارسال ایمیل به صورت Progress



loo30fer
جمعه 21 مرداد 1390, 23:46 عصر
با سلام
میخواستم بدونم میشه برای ارسال ایمیل Progress پیاده کرد یعنی میزان ارسال اطلاعات رو متوجه شد ؟ اگه با کامپوننت Indy بشه که عالی میشه.

vcldeveloper
شنبه 22 مرداد 1390, 03:12 صبح
کامپوننت IdSmtp رویداد های OnWorkBegin, OnWork و OnWorkEnd داره.

loo30fer
شنبه 22 مرداد 1390, 04:17 صبح
ممنون از جوابتون جناب کشاورز
حالا میخواستم بدونم کامپوننت ICS هم این قابلیت رو داره؟
و البته با توجه به تجربتون بدونم که قدرت Indy از ICS یا سایر کامپوننتها در این زمینه بیشتر هست ؟ چون هرجا که بحث میشه و اکثرا کامپوننت Indy رو معرفی میکنن.
به نظر شما هم بهترین کامپوننت برای ارسال ایمیل چی هست ؟ البته مانند Indy نیازی به OpenSSL و اون دوتا Dll نباشه. با تشکر از کمک همیشگیتون
عذرخواهی هم میکنم که تاپیک رو تو پست نامربوط ایجاد کردم حواسم نبود یکجورایی خیال میکردم تخصصش مربوط به قسمت مباحث عمومی دلفی و پاسکال میشه.

vcldeveloper
شنبه 22 مرداد 1390, 19:05 عصر
حالا میخواستم بدونم کامپوننت ICS هم این قابلیت رو داره؟
نمیدونم. باهاش کار نمیکنم.


و البته با توجه به تجربتون بدونم که قدرت Indy از ICS یا سایر کامپوننتها در این زمینه بیشتر هست ؟
هر دو کارکردهای خودشون رو دارند، و زیر ساخت کارشان یکسان هست. کار کردن با Indy ساده تر هست، و البته به طور پیش فرض هم به همراه دلفی نصب میشه، و نیازی به نصب چیز اضافی نداره.


البته مانند Indy نیازی به OpenSSL و اون دوتا Dll نباشه.
ICS هم مثل Indy از OpenSSL استفاده میکنه، پس از این جهت فرقی با Indy نداره. توی این کامپوننت های کار با سوکت که من دیدم، فقط IP Works پیاده سازی خودش از SSL رو داره.

loo30fer
سه شنبه 25 مرداد 1390, 16:03 عصر
کامپوننت IdSmtp رویداد های OnWorkBegin, OnWork و OnWorkEnd داره.
جناب کشاورز من این توی رویداد OnWork بدین شکل تعریف کردم که میزان ارسال رو نشون بدم ولی فقط در آخر یک عدد 7 رو برمیگردونه البته این رو توی یک Thread پیاده کردم تا فریز شدن هنگام ارسال باعث نشه که مقداری که به Label ارسال میشه رو نتونه تا آخر کار نمایش بده. مشکل کار فکر میکنم که از منه ؟
procedure TForm1.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
Label1.Caption:= IntToStr(AWorkCount);
end;

vcldeveloper
چهارشنبه 26 مرداد 1390, 01:49 صبح
البته این رو توی یک Thread پیاده کردم تا فریز شدن هنگام ارسال باعث نشه که مقداری که به Label ارسال میشه رو نتونه تا آخر کار نمایش بده.
کدی که برای اون Thread نوشتید رو اینجا بذارید.

loo30fer
چهارشنبه 26 مرداد 1390, 03:54 صبح
کدی که برای اون Thread نوشتید رو اینجا بذارید. بفرمایید جناب کشاورز اینم کدی رو که نوشتم:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdMessage, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdMessageClient, IdSMTP, StdCtrls, ExtCtrls;

type
Thread = class(TThread)
private
{ Private declarations }
protected
procedure SendMail;
procedure Execute; override;
end;

type
TForm1 = class(TForm)
IdSMTP1: TIdSMTP;
IdSSLIOHandlerSocket1: TIdSSLIOHandlerSocket;
IdMessage1: TIdMessage;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure Thread.SendMail;
var
Attachment: String;
begin
Form1.Label1.Caption:= '';
Form1.IdSMTP1.Host:= 'smtp.gmail.com';
Form1.IdSMTP1.Port:= 465;
Form1.IdSMTP1.Username:= '********';
Form1.IdSMTP1.Password:= '***********';
Form1.IdSMTP1.Connect;
with Form1.IdMessage1 do begin
Recipients.EMailAddresses:= 'MyEmail@gmail.com';
Subject:= 'MySubjecy';
CCList.EMailAddresses := '';
BccList.EMailAddresses := '';
Body.Text:= 'Memo1';
end;
Form1.IdMessage1.MessageParts.Clear;
if (Attachment<>'') then
TIdAttachment.Create(Form1.IdMessage1.MessageParts , Attachment);
Form1.IdSMTP1.Send(Form1.IdMessage1);
Form1.Label1.Caption:= 'Sent Finish';
end;

procedure Thread.Execute;
begin
SendMail;
end;

procedure TForm1.IdSMTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
Label2.Caption:= IntToStr(AWorkCount);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
th: Thread;
begin
th:= Thread.Create(True);
th.Priority:= tpNormal;
th.Resume;
end;

end.

Felony
چهارشنبه 26 مرداد 1390, 17:57 عصر
وقت ندارم کدتون رو کامل بخونم ، اولین و مهمترین ایرادی که میشه بهش گرفت این هست که تو Thread مستقیم با کنترل های روی فرم تعامل دارید که خلاف قوانین Multi Threading در دلفی هست !
یا باید از تابع Synchronize برای صدا زدن اون تابع SendMail استفاده کنید که در این صورت عملیات در Context ترد اصلی برنامه ( Main Thread ) انجام میشه و ترد شما بی معنی میشه ( فریز شدن ... ) یا باید روند دیگه ای پیاده کنید تا اطلاعات رو بین Main Thread و ترد خودتون تبادل کنه ( استفاده از پیغام ها و ... که قبلا در موردش بحث شده ) .

loo30fer
شنبه 05 شهریور 1390, 02:17 صبح
باید روند دیگه ای پیاده کنید تا اطلاعات رو بین Main Thread و ترد خودتون تبادل کنه ( استفاده از پیغام ها و ... که قبلا در موردش بحث شده ) .
در این مورد جستجویی کردم به پست شما رسیدم که در این مورد توضیح داده بودین و چیزهایی دستگیرم شد و فکر میکنم نشه بدین شکل تو پلاگین پیادش کرد درسته ؟ شما چه روشی رو پیشنهاد میکنید ؟ با تشکر از توضیحاتتون

Emdad2001
جمعه 08 دی 1391, 10:49 صبح
از اخر چی شد چجوری باید Progress رو موقه ارسال نمایش داد من این Gauge1.MaxValue:=AWorkCountMax; کد رو گذاشتم ولی مقداری که برمیگردونه 0 هستش ؟!!

Mask
یک شنبه 17 دی 1391, 15:26 عصر
شما باید از AWorkCount: Int64 قسمت onWork استفاده کنید.