easyDelphi Q&A
+5 تصويتات
123 مشاهدات
السلام عليكم ورحمة الله وبركاته،

بحثت كثيرا في الانترنيت عن حلول عملية لإرسال ايمايل من خلال تطبيق دلفي، لكن كلها لا تعمل

هل من مساعدة !!!
سُئل في تصنيف vcl بواسطة (410 نقاط)
أعيد الوسم بواسطة | 123 مشاهدات
 
مع أن التصنيف الذي أضفته إلى سؤالك هو "VCL"  و لكنك كتبت في سؤالك "من خلال تطبيق دلفي" فهل أنت تقصد (الموبايل) أم أنك تقصد (الوينداوز) ؟و شكرا.
أنا أقصد ويندوز
هل تطبيقك يعتمد على حساب gmail لارسال الايميلات ؟
نعم اعتمد على حساب gmail
أو يمكنني اعتماد اي حساب أخر، المهم امكانية الارسال من خلال التطبيق

4 إجابة

+5 تصويتات
أفضل إجابة

عذرا عن الـتأخر في الأجابة و ذلك لأسباب شخصية ...

المهم فيما يخص إرسال الأيمايل عن طريق "SMTP" و بواسطة حساب قوقل قد تفضل الأخوة الكرام بالأجابة على ما طرحت بكل ما أمكنهم ذلك ...

و قد إرتأيت أن أضيف إجابتي هنا لإضافة بعض الملاحظات ....

  • أولا و كما أشار إلى ذلك الأستاذ سامر فيما يخص كيفية إعداد حساب قوقل لأرسال "EMAIL" لكنه نسي أن يضيف عنصرا آخر و الذي هو بدوره قد يمنع من عملية الأرسال عبر "Gmail" ألا و هو عنصر التأكد الثنائي عند الدخول إلى الحساب "Validation en Deux Etapes" و هذا يجب الأشارة إليه بصور و روابط للتفصيل أكثر ..

أولا إعدادات الحساب يجب عليك أول الولوج إلى حسابك الخاص "Gmail " بواسطة Chrome ثم إذهب إلى هذا الرابط  هنا  أنظر للصورة أسفل

 

  • ثم الذهاب إلى أسفل و قم بتعطيل الخاصية التي ذكرها الأستاذ سامر أنظر إلى الصورة أسفل

أما فيما يخص الكود الصحيح فإليك هذا المثال البسيط هنا :

  • الكود كمايلي:

 

uses
.....
  // الوحدات اللازمة للعمل
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  IdHTTP,
  IdBaseComponent,
  IdMessage,
  IdExplicitTLSClientServerBase,
  IdMessageClient,
  IdSMTPBase,
  IdSMTP,
  IdIOHandler,
  IdIOHandlerSocket,
  IdIOHandlerStack,
  IdSSL,
  IdSSLOpenSSL,
  IdAttachmentFile,
  IdText;
  
  ......
  
  private
    { Private declarations }
    Function SendEmail(AUserName, APassword, ATarget_Email, ASubjectMsg_Email: string; ABodyMsg_Email: TStrings): Boolean;
    procedure SendEmail_WithThread(AProcSend: TProc);
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;
    Mail_UserName: string;
    Mail_Password: string;
    Mail_TO: string;
    Mail_Subject: string;

    Mail_Is_Sent: Boolean = False;

 implementation

{$R *.dfm}

procedure TFrmMain.SendEmail_WithThread(AProcSend: TProc);
var
  MyThread:TThread;
begin
    MyThread := TThread.CreateAnonymousThread(
      procedure
      begin
        AProcSend;
       // MyThread.Synchronize(MyThread, AProc_Sync);
      end);
   MyThread.FreeOnTerminate := True;
   MyThread.Start;
end;

Function TFrmMain.SendEmail(AUserName, APassword, ATarget_Email, ASubjectMsg_Email: string; ABodyMsg_Email: TStrings): Boolean;
var
  IdMsg   : TIdMessage;
  SMTP    : TIdSMTP;
  SSL     : TIdSSLIOHandlerSocketOpenSSL;
  IdText  : TIdText;
begin
  Mail_Is_Sent := False;
  // At RunTime // إنشاء المكونات اللازمة للعمل
  SMTP   := TIdSMTP.Create(nil);
  IdMsg  := TIdMessage.Create(nil);
  SSL    := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  try
    try
      // "SSL" تجهيز إعدادات
      SSL.SSLOptions.Method := sslvSSLv23;
      SSL.SSLOptions.Mode   := sslmClient;

      // الأولية و الخاصة بالمرسل "IdMsg" تجهيز إعدادات
      IdMsg.CharSet                   := 'utf-8';
      IdMsg.Encoding                  := meMIME;
      IdMsg.Priority                  := mpNormal;
      IdMsg.From.Name                 := Edt_MyName.Text;
      IdMsg.From.Address              := AUserName;  // إيمايل المرسل
      IdMsg.subject                   := ASubjectMsg_Email; // موضوع الرسالة

      // "IdMsg" إظافة المرسل إليه في إعدادات
      IdMsg.Recipients.Add;
      IdMsg.Recipients.EMailAddresses  := ATarget_Email; // إبمايل المرسل إليه
//      IdMsg.CCList.EMailAddresses      := 'AEmail@Gmail.com'; //يمكن الأستغناء عنها
//      IdMsg.BccList.EMailAddresses     := 'BEmail@Gmail.com';  //يمكن الأستغناء عنها
//      IdMsg.BccList.EMailAddresses     := 'CEmail@Gmail.com'; //يمكن الأستغناء عنها
       // IdMsg.body.text                 := ABodyMsg_Email; // هذا غير كافي
      // تجهيز محتوى الإيمايل المرسل
      IdText := TIdText.Create(IdMsg.MessageParts);
      IdText.Body.Add(ABodyMsg_Email.Text);
      IdText.ContentType := 'text/html; text/plain; charset=iso-8859-1';

      // "SMTP" تجهيز إعدادات
      SMTP.IOHandler := SSL;
      SMTP.UseTLS    := utUseImplicitTLS;
      SMTP.AuthType  := satDefault;
      SMTP.Host      := Edt_Host_SMTP.Text;
      SMTP.Port      := StrToInt(Edt_Port.Text);
      SMTP.username  := AUserName;
      SMTP.password  := APassword;
      SMTP.AuthType  := satDefault;

      // البدأ في الأرسال
        SMTP.Connect;
        SMTP.Authenticate;

		// إعدادات الأتاشمنت
        if Edt_AttachedFilePath.Text <> EmptyStr then
        begin
          if FileExists(Edt_AttachedFilePath.Text) then
          begin
             TIdAttachmentFile.Create(IdMsg.MessageParts, Edt_AttachedFilePath.Text);
          end;
        end;

      //إذا نجح الاتصال ، فأرسل الرسالة
       if SMTP.Connected then
       begin
         try
           SMTP.Send(IdMsg);
         except on E:Exception do
           begin
             ShowMessage(': '+'خطأ في محاولة الإرسال' +#10+#13+ E.Message);
           end;
         end;
       end;

      // "SMTP" بعد الانتهاء من كل شيء ، افصل من خادم
      while SMTP.Connected do
      begin
        SMTP.Disconnect;
        Mail_Is_Sent := True; // "True" في حالة النجاح أعطي نتيجة
      end;
	  
	  IdText.Free;
    finally
      UnLoadOpenSSLLibrary;  // "SSL" تفريغ محتوى
      // تحربر مختلف المكونات التي إنشأنتها سابقا
      SMTP.Free;
      IdMsg.Free;
      SSL.Free;
    end;

  except on e:Exception do // غي حالة الخطأ أظهر نتيجة الجطأ
    begin
      ShowMessage(': '+'خطأ في محاولة الأتصال' +#10+#13+ E.Message);
    end;
  end;
 Result := Mail_Is_Sent;
end;

procedure TFrmMain.Btn_GetAttachedClick(Sender: TObject);
begin
  with TOpenDialog.Create(Self) do
    if Execute then
      Edt_AttachedFilePath.Text := FileName;
end;

procedure TFrmMain.Btn_SendEmailClick(Sender: TObject);
begin
  Mail_UserName := Edt_UserName.text;
  Mail_Password := Edt_Password.text;
  Mail_TO       := Edt_Email_TO.text;
  Mail_Subject  := Edt_SubjectMsg.text;
  SendEmail_WithThread(
      procedure
      begin
        Btn_SendEmail.Enabled := False;
	    Pnl_Wait.Visible := True;
        ActivityInd_Wait.Animate := True;
        if SendEmail(Mail_UserName, Mail_Password, Mail_TO, Mail_Subject, Memo_Msg.Lines) then
        begin
         ShowMessage('لقد تم إرسال رسالتك بنجاح');
        end else
        begin
          ShowMessage('عذرا لقد حصل خطأ أثناء الأرسال');
        end;
        ActivityInd_Wait.Animate := False;
        Pnl_Wait.Visible := False;
		Btn_SendEmail.Enabled := True;
      end);

end;

and.  

رابط المثال كاملا مع الكود سورس   هنا   الباسورد لفك الضغط هو "EasyDelphi.com/qa"  من دون "" ويرجى إستعمال الوينرار نسخة 5 فما فوق.

تم الرد عليه بواسطة (14,010 نقاط)
عُدل بواسطة
–1 تصويت
تم الرد عليه بواسطة (8,180 نقاط)
هذا المثال قمت بتجربته سابقا، لكن لم يرسل شيء
+4 تصويتات
بما انك تستخدم حسابك gmail لارسال الرسائل :

المشكلة ليست في طريقة ارسال الايميل . فاغلب الموجود في النت يعمل بشكل سليم . ما حدث هو ان جوجل قامت بتغير واضافة بعض الامور المتعلقة بالامان .
ولان تطبيقك سيرسل ايميل هذا يعني انه سيقوم باستخدام حساب جوجل الخاص بك .
بشكل افتراضي جوجل ستمنع اي تطبيق مجهول او غير معروف من استخدام حسابك  دون موافقتك . بالاضافة ان كل هذه التطبيقات تتعامل مع جوجل بالطريقة العادية ( والتي يسميها جوجل ـ تطبيقات اقل امانا ـ )
الحل :
ادخل اعدادات حسابك في جوجل ( جوجل وليس gmail ) . صفحة Sign in and Security  . ستجد فيها خيار اسمها Allow less secure apps . اجعله YES .

هذا كل شيء .

قم بالتجربة . ولا تنسى ان تختار الاجابة الافضل بعد ان تتاكد من الجواب وانه هو ما تبحث عنه
تم الرد عليه بواسطة (18,170 نقاط)
مازال نفس المشكل، إذا ممكن وضع مثال تطبيقي
اذا ضبط الاعدادات كما اخبرتك . معناها مشكلتك في الكود واعتقد في smtp . اعطنا الكود الذي استخدمته حتى نحدد المشكلة . واخبرنا عن اصدار الدلفي والمكونات التي تستخدمها .
تمت عملية ارسال الايمايل بنجاح بعد اضافة الملفين : libeay32.dll و ssleay32.dll
هذا رابط الكود :
https://up.top4top.net/downloadf-9244duf11-rar.html

إذا ممكن مساعدة لاضافة ملف مرفق عند الارسال.
مبروك . لكن لا تلغي خيار Allow less secure apps في حسابك . لانه لن يعمل بدونه .
بالنسبة لكيفية اضافة مرفق . فهذا متعلق بكودك وطريقتك في ارسال الايميل والمكونات المستخدم . لذلك اكتب سؤال جديد . وضع جزء الكود الذي استخدمته . حتى نتمكن من اجابتك .
اكتبه سؤال جديد مستقل . لن استطيع اجابتك في التعليقات .
+2 تصويتات

تفقد اعدادات السيرفر

اذا كان Gmail :


 

Google Apps / Gmail

SMTP

SMTP HOST: smtp.gmail.com

PORT: 587

POP3

POP3 Host: pop.gmail.com
Port: 995

IMAP

POP3 Host: imap.gmail.com
POP3 Port: 993

 

 

 
قبل الارسال ببرنامج من الدلفي تأكد من السرفر وبيانات الدخول في برنامج خارجي مثل
Mozilla Thunderbird
 
 
ملاحظة الارسال باستعمال برنامج خارجي قد يتأخر نوعا ما .. عليك بالانتظار قليلا .

 

 
 
تم الرد عليه بواسطة (8,180 نقاط)

اسئلة متعلقة

+2 تصويتات
1 إجابة
سُئل أغسطس 6 في تصنيف vcl بواسطة KHALED (6,350 نقاط) | 52 مشاهدات
+4 تصويتات
1 إجابة
0 تصويتات
0 إجابة
سُئل منذ 1 يوم في تصنيف Delphi بواسطة SamerAssil (18,170 نقاط) | 5 مشاهدات
+4 تصويتات
1 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

267 سؤال
476 إجابة
833 تعليق
163 مستخدم