ďťż

Ładny brzuch

Witam,
Mam następujący problem:
Chciałbym wysłać 3 e-maile ale jeden z nich jest tylko z załącznikiem (nie wiem który) - wiem dopiero wtedy gdy odczytam dane z bazy danych. Samo wysyłanie e-maili działa bez problemu, ale gdy dołączam załącznik do e-maila który faktycznie powinien go mieć załącznik, załącznik zostaje dołączony do wszystkich e-maili wysłanych później.
Przesyłam kod, proszę o pomoc.
//polaczenie z bd i parametry skrzynki pocztowej IDSMTP1.Connect; for i:=1 to ile_mail do begin IdMessage1.Subject :=MySQLResult.FieldValue(0); IdMessage1.Body.Clear; IdMessage1.Body.Text:=MySQLResult.FieldValue(1); if MySQLResult.FieldValue(2)<>'' then //sprawdzam, czy jest zalacznik (nazwa pliku) begin with TIdAttachmentFile.Create(IdMessage1.MessageParts, 'c:\'+MySQLResult.FieldValue(2)) do begin ContentID := MySQLResult.FieldValue(2); ContentType := 'application/msword'; FileNme := MySQLResult.FieldValue(2); end; IDSMTP1.Send(IdMessage1); end; MySQLResult.Next; end; IDSMTP1.Disconnect;
Pozdrawiam, Paweł



Nie mam delphi żeby sprawdzić, ale przeanalizuj dokładnie w którym miejscu wysyłasz maila. Wysyłasz go tylko wtedy gdy jest załącznik
Myslę że poniższa modyfikacja powinna pomóc.
for i:=1 to ile_mail do begin IdMessage1.Subject :=MySQLResult.FieldValue(0); IdMessage1.Body.Clear; IdMessage1.Body.Text:=MySQLResult.FieldValue(1); if MySQLResult.FieldValue(2)<>'' then //sprawdzam, czy jest zalacznik (nazwa pliku) begin with TIdAttachmentFile.Create(IdMessage1.MessageParts,'c:\\'+MySQLResult.FieldValue(2)) do begin ContentID := MySQLResult.FieldValue(2); ContentType := 'application/msword'; FileNme := MySQLResult.FieldValue(2); end; IDSMTP1.Send(IdMessage1);//--> Wysyłasz maila tylko jeśli ma załącznik. Przenieś ta linijkę za poniższego end-a end; //--> Czyli tutaj MySQLResult.Next; end;
Użytkownik imcpan edytował ten post 19 maj 2010, 12:57
Dziękuję, faktycznie, ale nie rozwiązało mojego problemu, że wysyła każdego e-maila z załącznikiem (zawsze z tym samym) mimo, że powinien wysyłać e-maila bez załącznika.
PawelD.


Dziękuję, faktycznie, ale nie rozwiązało mojego problemu, że wysyła każdego e-maila z załącznikiem (zawsze z tym samym) mimo, że powinien wysyłać e-maila bez załącznika.
PawelD.

Ten kod będzie wysyłał ten sam załącznik ale nie z każdym mailem ( Ustaw załącznik tylko dla maila nr. 2 i zobacz co się stanie). Nie znam Delphi ale wydaje mi się, że jeżeli dwa kolejne wysyłane maile będą miały załączniki, to pierwszy powinien być wysłany z jednym, a drugi z dwoma załącznikami, ale to zależy od tego jak działa TIdAttachmentFile.Create(..).
Przeanalizuj kod dokładnie:
1. Przed pętlą masz obiekt IdMessage1 oraz TIdAttachmentFile.
2. W pętli obiektowi IdMessage1 przypisujesz odpowiednie parametry (Subject, Body, itd.)
3. Jeśli mail ma załącznik to go dodajesz (TIdAttachmentFile.Create(IdMessage1.MessageParts...).
4. Wysyłasz maila
5. Następny mail jaki tworzysz znów dajesz Subject !!! Czyścisz Body !!! (poprawnie), ale ponieważ operujesz na tym samym obiekcie IdMessage1, to on cały czas ma powiązany z nim w poprzednim kroku załącznik (patrz pkt 3), którego nie usunąłeś
6. Jeżeli funkcja TIdAttachmentFile.Create(IdMessage1.MessageParts... dodaje kolejne części maila, to według mnie, jeżeli dwa kolejne wysyłane maile będą miały załączniki, to pierwszy powinien być wysłany z jednym, a drugi z dwoma załącznikami.

Rozwiązanie:

Po wysłaniu mejla, jeśli miał on załącznik, musisz ten załącznik z obiektu IdMessage1 usunąć.

Zajrzałem do opisu klasy TIdAttachmentFile. Wydaje mi się, że po wysłaniu maila powinieneś wywołać TIdAttachmentFile.Destroy.
Użytkownik imcpan edytował ten post 20 maj 2010, 07:54



Ten kod będzie wysyłał ten sam załącznik ale nie z każdym mailem ( Ustaw załącznik tylko dla maila nr. 2 i zobacz co się stanie). Nie znam Delphi ale wydaje mi się, że jeżeli dwa kolejne wysyłane maile będą miały załączniki, to pierwszy powinien być wysłany z jednym, a drugi z dwoma załącznikami, ale to zależy od tego jak działa TIdAttachmentFile.Create(..).
Przeanalizuj kod dokładnie:
1. Przed pętlą masz obiekt IdMessage1 oraz TIdAttachmentFile.
2. W pętli obiektowi IdMessage1 przypisujesz odpowiednie parametry (Subject, Body, itd.)
3. Jeśli mail ma załącznik to go dodajesz (TIdAttachmentFile.Create(IdMessage1.MessageParts...).
4. Wysyłasz maila
5. Następny mail jaki tworzysz znów dajesz Subject !!! Czyścisz Body !!! (poprawnie), ale ponieważ operujesz na tym samym obiekcie IdMessage1, to on cały czas ma powiązany z nim w poprzednim kroku załącznik (patrz pkt 3), którego nie usunąłeś
6. Jeżeli funkcja TIdAttachmentFile.Create(IdMessage1.MessageParts... dodaje kolejne części maila, to według mnie, jeżeli dwa kolejne wysyłane maile będą miały załączniki, to pierwszy powinien być wysłany z jednym, a drugi z dwoma załącznikami.

Rozwiązanie:

Po wysłaniu mejla, jeśli miał on załącznik, musisz ten załącznik z obiektu IdMessage1 usunąć.

Zajrzałem do opisu klasy TIdAttachmentFile. Wydaje mi się, że po wysłaniu maila powinieneś wywołać TIdAttachmentFile.Destroy.


Witam,
Dzięki, przypuszczałem, że muszę "czyścić" część związaną z załącznikiem, ale nie wiem jak.
Sprawdziłem, TIdAttachmentFile.Destroy; ale wyświetlił mi:
[Error] mail.pas(116): E2076 This form of method call only allowed for class methods
Co z tym zrobić?
Ja mam: Delphi 2005 + Indy 10
Pozdrawiam
PawełD.


[Error] mail.pas(116): E2076 This form of method call only allowed for class methods
Przejrzałem trochę googli i wygląda na to, że musisz trochę zmienić swój kod. Moge się mylić, ale wydaje mi się, że:

Polecenie TIdAttachmentFile.Create dodaje kolejny załącznik do obiektu IdMessage1. Jeżeli zatem utworzyłeś obiekt IdMessage1 przed pętlą i każdy z wysyłanych maili będzie miał załącznik, to ostatni mail powinien zawierać wszystkie załączniki.
Po przejrzeniu googli nie znalazłem możliwości wyczyszczenia załącznika raz do maila dodanego. Zatem:

Proponuję przed pętlą utworzyć tablicę obiektów IdMessage taką, która pomieści w sobie wszystkie maile, które zamierzasz wysłać a pętlę zapisać jakoś tak:
for i:=1 to ile_mail do begin IdMessage[i].Subject :=MySQLResult.FieldValue(0); IdMessage[i].Body.Text:=MySQLResult.FieldValue(1); if MySQLResult.FieldValue(2)<>'' then //sprawdzam, czy jest zalacznik (nazwa pliku) begin with TIdAttachmentFile.Create(IdMessage[i].MessageParts,'c:\\'+MySQLResult.FieldValue(2)) do begin ContentID := MySQLResult.FieldValue(2); ContentType := 'application/msword'; FileNme := MySQLResult.FieldValue(2); end; end; IDSMTP1.Send(IdMessage[i]); MySQLResult.Next; end;

Być może jest to jedyne rozwiązanie Twojego problemu. Może nie do końca eleganckie, ale powinno działać.
Użytkownik imcpan edytował ten post 20 maj 2010, 12:53

Przejrzałem trochę googli i wygląda na to, że musisz trochę zmienić swój kod. Moge się mylić, ale wydaje mi się, że:

Polecenie TIdAttachmentFile.Create dodaje kolejny załącznik do obiektu IdMessage1. Jeżeli zatem utworzyłeś obiekt IdMessage1 przed pętlą i każdy z wysyłanych maili będzie miał załącznik, to ostatni mail powinien zawierać wszystkie załączniki.
Po przejrzeniu googli nie znalazłem możliwości wyczyszczenia załącznika raz do maila dodanego. Zatem:

Proponuję przed pętlą utworzyć tablicę obiektów IdMessage taką, która pomieści w sobie wszystkie maile, które zamierzasz wysłać a pętlę zapisać jakoś tak:
for i:=1 to ile_mail do begin IdMessage[i].Subject :=MySQLResult.FieldValue(0); IdMessage[i].Body.Text:=MySQLResult.FieldValue(1); if MySQLResult.FieldValue(2)<>'' then //sprawdzam, czy jest zalacznik (nazwa pliku) begin with TIdAttachmentFile.Create(IdMessage[i].MessageParts,'c:\\'+MySQLResult.FieldValue(2)) do begin ContentID := MySQLResult.FieldValue(2); ContentType := 'application/msword'; FileNme := MySQLResult.FieldValue(2); end; end; IDSMTP1.Send(IdMessage[i]); MySQLResult.Next; end;

Być może jest to jedyne rozwiązanie Twojego problemu. Może nie do końca eleganckie, ale powinno działać.


Witam,
Dzięki, muszę chwilowo to zostawić (w pracy mam urwanie głowy).
Pozdrawiam
PawełD.

ja bym to zrobił trochy inaczej:
w sekcji var dodaj:
idmsg: TIdMessage;
a niżej:
for i:=1 to ile_mail do begin idmsg := TIdMessage.Create();//nie pamiętam, czy tu wrzuca się jakiś parametr, piszę z pamięci:D idmsg.Subject :=MySQLResult.FieldValue(0); idmsg.Body.Text:=MySQLResult.FieldValue(1); if MySQLResult.FieldValue(2)<>'' then //sprawdzam, czy jest zalacznik (nazwa pliku) begin with TIdAttachmentFile.Create(idmsg.MessageParts,'c:\\'+MySQLResult.FieldValue(2)) do begin ContentID := MySQLResult.FieldValue(2); ContentType := 'application/msword'; FileNme := MySQLResult.FieldValue(2); end; end; IDSMTP1.Send(idmsg); MySQLResult.Next; idmsg.Free; end;


ja bym to zrobił trochy inaczej:
Rozwiązanie bezwzględnie lepsze. Znacznie mniej pamięciożerne.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •