Outlook hesaplarını kullanarak mail gönderme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Outlook hesaplarını kullanarak mail gönderme

Mesaj gönderen mmg »

Merhabalar,

Aşağıda görülen kod ile mail gönderebiliyorum, bir önceki sorumda hatalarını ve eksiklerini tamamlamıştık. İki konu hakkında yardımlarınıza ihtiyacım var. Şimdiden teşekkür ediyorum.

1. Uygulamada her bir kullanıcı için mail adresi (SMTP.Username) ile birlikte şifresini de (SMTP.Password) girmek gerekiyor. Bu bilgileri tabloda saklıyorum SMTP.Password bilgisini EncodeString ile basit bir şekilde şifreliyorum fakat yine de şifreleri uygulamaya girdirmek bana çok mantıklı gelmiyor. Uygulamaya sadece SMTP.Username bilgisini girdirsek şifreyi outlook nasıl erişiyorsa bizde bir şekilde erişebilir miyiz ?

2. Aşağıdaki kod ile mail gönderiyorum fakat gönderdiğim bu mail outlook'da gönderilmiş öğeler klasöründe gözükmüyor. Gözükmesini sağlayabilir miyiz ?

Kod: Tümünü seç

var
  Attachmentfile: TIdAttachmentFile;
begin

  if MessageBox(Handle, PChar(TrimLeft(TrimRight(T_SIPARISYETKILI_ADI.Value))+' yetkilisi '+TrimLeft(TrimRight(T_SIPARISE_POSTA.Value))+' adresine e-posta gönderilecektir, devam etmek istiyor musunuz ?'),'Uyarı',mb_YESNO)= id_No then
     exit;

  // IO HANDLER SETTINGS //
  With IdSSLIOHandlerSocketOpenSSL1 do
  begin
    Destination := T_SISTEMSMTP_HOST.Value;
    Host := T_SISTEMSMTP_HOST.Value;
    MaxLineAction := maException;
    Port := T_SISTEMSMTP_PORT.Value;
    SSLOptions.Method := sslvTLSv1;
    SSLOptions.Mode := sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSLOptions.VerifyDepth := 0;
  end;

  // SETTING SMTP COMPONENT DATA //
  SMTP.Host := T_SISTEMSMTP_HOST.Value;          //.. smtp.yandex.com.tr;
  SMTP.Port := T_SISTEMSMTP_PORT.Value;          //.. 587; -->yandex giden posta için bu port numarasını kabul ediyor.
  SMTP.Username := T_SISTEMSMTP_USERNAME.Value;  //.. emailadresin@domainadi.com
  SMTP.Password := T_SISTEMSMTP_PASSWORD.Value;  //.. Kullanıcı şifresi;
  SMTP.IOHandler:= IdSSLIOHandlerSocketOpenSSL1;
  SMTP.AuthType := satDefault;
  SMTP.UseTLS := utUseExplicitTLS;

  //.. FASTREPORT İLE PDF FİLE OLUŞTURUYOR.
  try
    if not DirectoryExists('C:\Temp') Then // Klasör yoksa
       If not CreateDir('C:\Temp') Then // Oluştur
       begin
         showmessage('C:\Temp klasörü oluşturulamadı.');
         Exit;
       end;
    if not DirectoryExists('C:\Temp') Then // Klasör yoksa
       If not CreateDir('C:\Temp') Then // Oluştur
       begin
         showmessage('C:\Temp klasörü oluşturulamadı.');
         Exit;
       end;

    frxSIPARIS_RPT.Report.LoadFromFile(ExtractFilePath(ParamStr(0))+'Rapor\SIPARIS_RPT.fr3');

    frxSIPARIS_RPT.PrintOptions.ShowDialog := False;
    frxSIPARIS_RPT.PreviewOptions.AllowEdit:= False;
    frxSIPARIS_RPT.ShowProgress:= false;
    frxSIPARIS_RPT.EngineOptions.SilentMode:= True;
    frxSIPARIS_RPT.EngineOptions.EnableThreadSafe := True;
    frxSIPARIS_RPT.EngineOptions.DestroyForms := False;
    frxSIPARIS_RPT.EngineOptions.UseGlobalDataSetList:= False;

    frxPDFExport1.Background:= True;
    frxPDFExport1.ShowProgress:= False;
    frxPDFExport1.ShowDialog:= False;
    frxPDFExport1.DefaultPath:= '';

    if length(T_SISTEMLOGO.Value)>0 then
      (frxSIPARIS_RPT.FindObject('LOGO') as Tfrxpictureview).picture.LoadFromFile(ExtractFilePath(ParamStr(0))+T_SISTEMLOGO.Value)
    else
      (frxSIPARIS_RPT.FindObject('LOGO') as Tfrxpictureview).Visible:= false;
    (frxSIPARIS_RPT.FindObject('BELGE_NO') as Tfrxmemoview).Memo.Text:= T_SIPARISSERI.Value+'-'+IntToStr(T_SIPARISFIS_NO.Value);
    (frxSIPARIS_RPT.FindObject('BELGE_TAR') as Tfrxmemoview).Memo.Text:= DateToStr(date());
    (frxSIPARIS_RPT.FindObject('HESAP_ADI') as Tfrxmemoview).Memo.Text:= T_SIPARISHESAP_ADI.Value;

    frxSIPARIS_RPT.PrepareReport();
    frxPDFExport1.FileName := 'C:\Temp\'+TrimLeft(TrimRight(T_SIPARISFIS_NO.Value))+'.pdf';
    frxSIPARIS_RPT.Export(frxPDFExport1);

  except on e:Exception do
    begin
      ShowMessage(e.Message);
      exit;
    end;
  end;

  // mail gönderiliyor //
  MailMessage.Clear;
  MailMessage.CharSet:= 'utf-8';

  // alıcılar listesi //
  with MailMessage.Recipients.Add do
  begin
    Name := TrimLeft(TrimRight(T_SIPARISE_POSTA.Value));    //.. alıcı adı
    Address := TrimLeft(TrimRight(T_SIPARISE_POSTA.Value)); //.. alıcı@email.com
  end;

  // CC listesi //
  with MailMessage.CCList.Add do
  begin
    Name := '';     //.. CC alıcı adı
    Address := '';  //.. CCalıcı@email.com
  end;

  // e-postaya dosya ekleme //
  Attachmentfile := TIdAttachmentFile.Create(MailMessage.MessageParts,'C:\Temp\'+TrimLeft(TrimRight(T_SIPARISFIS_NO.Value))+'.pdf');

  MailMessage.From.Address :=  T_SISTEMSMTP_USERNAME.Value; //.. emailadresin@domainadi.com
  MailMessage.Subject := 'SİPARİŞ E-POSTA TEST';
  MailMessage.Body.Text := 'BU E-MAIL ULAŞTIYSA ARAYABİLİR MİSİN ?';

  MailMessage.Priority := mpHigh;
  TRY
    SMTP.Connect();
    SMTP.Send(MailMessage);
    ShowMessage('E-Posta gönderildi.');
    SMTP.Disconnect();
  except on e:Exception do
    begin
      ShowMessage(e.Message);
      SMTP.Disconnect();
    end;
  END;
  AttachmentFile.Free;
  
ertank
Kıdemli Üye
Mesajlar: 1662
Kayıt: 12 Eyl 2015 12:45

Re: Outlook hesaplarını kullanarak mail gönderme

Mesaj gönderen ertank »

Merhaba,

Sizin yapmak istediğiniz e-mail göndermek değil. Outlook'un e-mail göndermesini sağlamak.

OLE üzerinden outlook nesnesine erişip e-mail gönderme yapabilirsiniz. Elimin altında hazır örnek yok maalesef. Ancak internette çok örneği vardır.

1- Bu şekilde herhangi bir kullanıcı adı veya şifre saklamanıza gerek yok.
2- Outlook kapalı iken e-mail gönder yapılabilir. Ancak e-maillerin gerçekten gönderimi yanlış bilmiyor isem Outlook bir dahaki açıldığı zaman olacaktır. Farklı bir ifade ile E-mail gitti/gitmedi bilgisinin kontrolü Outlook'a bırakılmış oluyorsunuz. Dikkatsiz kullanıcılar sizin uygulamanızı suçlayabilir.
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: Outlook hesaplarını kullanarak mail gönderme

Mesaj gönderen mmg »

Merhaba,

Sorumun cevabını anladım, teşekkürler. Bu başlıkta sorduklarımı sağlayabilmek için outlook ile mail göndermem gerekiyor, outlook harici kod ile mail gönderdiğim taktirde kullanıcı adı ve şifresini saklamam gerekiyor ayrıca gönderilen e-postaları outlookta gönderilmiş öğeler kısmına düşmeyecek. Peki kullanıcı şifrelerini farklı bir yöntemle saklama şansım var mı ? Decode, encode çok kolay çözülebilir diye düşünüyorum.
ertank
Kıdemli Üye
Mesajlar: 1662
Kayıt: 12 Eyl 2015 12:45

Re: Outlook hesaplarını kullanarak mail gönderme

Mesaj gönderen ertank »

Günümüzde en çok kullanılan AES şifreleme yöntemi olsa gerek.
Ben AES-CBC256 önerebilirim. Delphi Tokyo ve sonrası için aşağıdaki ticari kullanımı ücretsiz kütüpheneler AES ve birçok diğer işlemi yapabilir. Her üçü de gereklidir.
https://github.com/Xor-el/CryptoLib4Pascal
https://github.com/Xor-el/HashLib4Pascal
https://github.com/Xor-el/SimpleBaseLib4Pascal

Ekte örnek kullanım projesi bulabilirsiniz. Proje içindeki Key ve IV bilgilerini değiştirerek kullanmanız gerekir. Onlar benim rastgele KEY ve IV üretme aracımdan elde edilen hiçbir yerde kullanmadığım değerlerdir.
Dosya ekleri
aes_demo.rar
(6.73 KiB) 54 kere indirildi
mmg
Üye
Mesajlar: 120
Kayıt: 20 Haz 2014 12:47

Re: Outlook hesaplarını kullanarak mail gönderme

Mesaj gönderen mmg »

Çok teşekkür ediyorum, örnek kod için ayrıca teşekkür ediyorum. Delphi Tokyo kullanıyorum, hemen indirip inceleyeceğim.
Cevapla