Indy ile Ekli mail alma ve eki kaydetme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Indy ile Ekli mail alma ve eki kaydetme

Mesaj gönderen vkamadan »

Merhaba ,
yapmak istediğim aldığım eklentili mailin eklentisini kaydettirme
indy demosunda TidAttachmentFile aında bir nesne kullanıyor ama o yok bende hangi unitin içinde olduğunu bulamadım.
indy ile eklentili mesajın eklentisi nasıl kaydedildiğne dair bir örnek varsa memnun olurum iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

TIdAttachment olmasın,
Indy 9 Help inde baktıgımda
TIdAttachment
Hierarchy, Properties, Methods, Events, See Also, Unit: IdMessage
Encapsulates a MIME-encoded attachment or inline graphic.
TIdAttachment = class(TIdMessagePart)
Unit
IdMessage
Description
TIdAttachment is a TIdMessagePart descendant that encapsulates a MIME-encoded attachment or inline graphic. TIdAttachment and TIdText are used as collection items in a TIdMessageParts collection.
TIdAttachment provides methods and properties relevant to Internet Message attachments including ContentDisposition, FileName, and SaveToFile. TIdAttachment also reintroduces the Create constructor to specify the owner Collection and the file used to store the attachment. TIdAttachment also provides an Encode method to allow encoding of a message part to a TStream descendant
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

evet , bende aynı fikirdeyim ama örnekte geçen kodda TIdAttachmentFile yazıyor şimdi şu şekilde kullanmaya çalıştım bir örnek yaptım ve FileSAve hatası aldım

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
eklenti:TIdAttachment;
begin
 IdPOP31.Host:='mail.**********';
 IdPOP31.Username:='***********';
 IdPOP31.Password:='***********';

 IdPOP31.Connect;

 ShowMessage(IntToStr(IdPOP31.CheckMessages));
 IdPOP31.RetrieveHeader(1,IdMessage1);

 ListBox1.items.add(IdMessage1.From.Address);

 IdPOP31.Retrieve(1,IdMessage1);
 Memo1.Lines:=IdMessage1.Body;
 if IdMessage1.MessageParts.Count >0 then
    begin
       try
         eklenti:=TIdAttachment.Create(IdMessage1.MessageParts,'deneme.zip');
         eklenti.SaveToFile('c:\deneme.zip');
       finally
         eklenti.free;
       end;
    end;

 IdPOP31.Disconnect;

end;
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

http://ksajadi.com/dflat/archives/000009.html
sunu bir incelesene, pek fazla indy ile ugrasmadıgım icin birsey diyemeyecegim.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Kod: Tümünü seç

procedure TfrmMain.Button1Click(Sender: TObject);
var
   intIndex: integer;
   fname: string;
   intMSGIndex: integer;
begin
  // Find selected
   for intIndex := 0 to lvMessageParts.Items.Count - 1 do
      if lvMessageParts.Items[intIndex].Selected then
         begin
            //now find which TIdAttachment it is in MSG
            intMSGIndex := FindAttachment(lvMessageParts.Items[intIndex].caption);
            if intMSGIndex > 0 then
               begin
                  fname := FAttachPath + TIdAttachment(Msg.MessageParts.Items[intMSGIndex]).filename;
                  SaveDialog1.FileName := fname;
                  if SaveDialog1.Execute then
                     begin
                        Showbusy(true);
                        TIdAttachment(Msg.MessageParts.Items[intMSGIndex]).SaveToFile(SaveDialog1.FileName);
                        Showbusy(false);
                     end;
               end;
         end;
end;
hocam böyle br kod var ama işinize yararmı.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
teşekkür ederim kod işimi çözecek ama şöyle bir sorun var TIdAttachment e cast etme sırasında Access violation at adress.... yaratılmamış nesneye erişim sorunu yaşıyorum bu TIdAttachment i bir şekilde yaratmak gerekiyor.
olayı çözemedim henüz
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Kod: Tümünü seç

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  // read the configuration from ini file
  ReadConfiguration;

   name := 'frmMain';

   //setup path to put attachments into
   FAttachPath := IncludeTrailingBackSlash(ExtractFileDir(Application.exename)); //starting directory
   FAttachPath := FAttachPath + 'Attach\';
   if not DirectoryExists(FAttachPath) then ForceDirectories(FAttachPath);

   FMsgCount := 0; FMailBoxSize := 0;
   Showbusy(false);
end;
Evet kodu eksik göndermişim, özür dilerim hocam kusura bakmayın..kolay gelsin.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba @vedatkaba ,
öncelikle ilgin için teşekkür ederim.
fakat sorun bunlarla iligili değil, Sorun TIdAttachment sınıfına CASTING işlemi yapılırken ortaya çıkıyor mesela,

Kod: Tümünü seç

TIdAttachment(Msg.MessageParts.Items[intMSGIndex]).filename;
satırında bellek erişim hatası alıyorum yani yaratılamamış bir nesneye erişmek istiyorum,
TIdAttachment ın Create kurucusuna baktığımızda
IdMessageParts ve FileName:String tipinde parametre geçmemizi istiyor tamam çok güzel geçiyorum parametreyi ama SaveToFile metodunu çağırdığımda bana derleyici ,Error Save File hatasını üretiyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

...
...
...

  for intIndex2 := 0 to Pred(idMessage2.MessageParts.Count) do
  begin
    if (idMessage2.MessageParts.Items[intIndex2] is TIdAttachment) then
    begin
      DosyaAdi :=TIdAttachment(idMessage2.MessageParts.Items[intIndex2]).Filename;

 Kaydet := DosyaPath+DosyaAdi;

      If Not  TIdAttachment(idMessage2.MessageParts.Items[intindex2]).SaveToFile(Kaydet) Then

...
...
...
eski bir projede bu şekilde kullanmışım.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

çok teşekkür ederim
sorun belirttiğiniz şekilde çözülmüştür.
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba ,
şöyle bir durum var,
sunucudan çektiğim mailerin silinmesini istiyorum bunun için neyapabilirm şu an POP3 sunucusunda kalıyor outook ta olduğu gibi silinmiyor.
Teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Kod: Tümünü seç

procedure TfrmMain.DeleteExecute(Sender: TObject);
begin
   if lvHeaders.Selected <> nil then
      begin
         Showbusy(true);
         POP.Delete(lvHeaders.Selected.Index + 1);
         lvHeaders.Selected.ImageIndex := 3;
         Showbusy(false);
      end;
end;
Hocam zannedersem bu kod silmesi gerek,denemedim ama ..sonucu bildirirseniz sevinirim.
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

ilgilenen herkese teşekkürler.
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

merhaba arkadaşlar,
bu eklentili maillerle başım tekrar derde düştü ,
aşağıdaki gibi bir yapıyla belirttiğim MailAdresinden gelen mailllerin eklentilerinin olup olmadığına bakıyorum varsa belirttiğim konuma kaydına sağlamaya çalışıyorum ama gönderdiğim mailde eklenti olmasına rağmen aşağıdaki koda bakacak olursak ,

Kod: Tümünü seç

procedure Txmlmenu.RetriveMessagesOnMailBox;
var
i,k:integer;
begin
   Application.ProcessMessages;
   MailSayisi:=XMLKutu.CheckMessages;
   ProgressBar1.Max:=MailSayisi;
   ProgressBar1.Position:=0;
   for i:=1 to MailSayisi do
     begin
       XMLMesaj.Clear;
       XMLKutu.RetrieveHeader(i,XMLMesaj);
       if XMLMesaj.From.Address=mail then
         begin
           XMLMesaj.Clear;
           XMLKutu.Retrieve(i,XMLMesaj);
           for k:=0 to XMLMesaj.MessageParts.Count-1 do
             begin
                if (XMLMesaj.MessageParts.Items[k] is TIdAttachment) then
                    TIdAttachment(XMLMesaj.MessageParts.Items[k]).SaveToFile(gelkonum+'\'+TIdAttachment(XMLMesaj.MessageParts.Items[k]).FileName);
             end;
         end;
         ProgressBar1.Position:=i;
     end;

if (XMLMesaj.MessageParts.Items[k] is TIdAttachment) then satırında eklentili maillerde MessagePart.Count bana 2 döndürüyor ama 0 ve 1 indislerdeki MessagePartların ikisindede yukarıdaki Karşılaştırma TIdAttachment olmadığını söylüyor herhangi bir hata almıyorum ama mesajlardaki eklentileri anlayamıyor.
teşekkürler.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
vedatkaba
Kıdemli Üye
Mesajlar: 866
Kayıt: 06 Oca 2004 06:50
Konum: DARICA/GEBZE

Mesaj gönderen vedatkaba »

Kod: Tümünü seç

//Setup attachments list
   ShowStatus('Decoding attachments (' + IntToStr(Msg.MessageParts.Count) + ')');
   for intIndex := 0 to Pred(Msg.MessageParts.Count) do
      begin
         if (Msg.MessageParts.Items[intIndex] is TIdAttachment) then
            begin //general attachment
               li := lvMessageParts.Items.Add;
               li.ImageIndex := 8;
               li.Caption := TIdAttachment(Msg.MessageParts.Items[intIndex]).Filename;
    //         li.SubItems.Add(TIdAttachment(Msg.MessageParts.Items[intIndex]).ContentType);
            end
         else
            begin //body text
               if Msg.MessageParts.Items[intIndex] is TIdText then
                  begin
                     Memo1.Lines.Clear;
                     Memo1.Lines.AddStrings(TIdText(Msg.MessageParts.Items[intIndex]).Body);
                  end
            end;
hocam burda gelen mailleri ekli dosyayla beraber okuyor şu anda deneme şansım yok kolay gelsin.
li
Tlistitem;
intindex
İnteger ;
***********************************
Kamil odur ki; koya dünyada bir eser,
Eseri olmayanın, yerinde yeller eser.

***********************************
Cevapla