Primirea de e-mailuri în Delphi
O zi bună pentru toți. Vreau să vă întreb cum puteți salva fișierele atașate la scrisoare.
procedura TForm1.Button1Click (expeditor: TObject);
var MyMessage: # xA0; TIdMessage;
# xA0; # xA0; CountMessages: Integer;
# xA0; # xA0; atașați: TIDAttachment;
începe
MyMessage: = TIdMessage.Create (zero);
IdPOP31.Connect ();
CountMessages: = IdPOP31.CheckMessages ();
în timp ce CountMessages> 0 începe
dacă IdPOP31.Retrieve (CountMessages, MyMessage) = True atunci începe
# xA0; # xA0; RichEdit1.Lines.Assign (MyMessage.Body);
# xA0; # xA0; atașați: = TIDAttachment.Create (MyMessage.MessageParts);
# xA0; # xA0; // Și apoi nu știu ce să fac (în ceea ce privește atașamentele)
# xA0; //attach.SaveToFile(const FileName: TFeliName): Boolean - cum funcționează această funcție în ajutor, nu există date și exemple despre componentele indy.
se încheie;
CountMessages: = CountMessages - 1;
se încheie;
ShowMessage (IntToStr (IdPOP31.CheckMessages ())));
MyMessage.Free;
IdPOP31.Disconnect;
se încheie;
> Cum funcționează această funcție în ajutor nu există date
Iată un citat doar din ajutor pentru această funcție:
Stochează un mesaj.
funcția SaveToFile (const FileName: TFileName): Boolean;
const NumeleName: TFileName
Numele fișierului unde este stocat mesajul.
Boolean - Adevărat când sunt stocate părțile mesajului.
SaveToFile este o funcție booleană folosită pentru a stoca atașamentul care reprezintă mesajul la fișierul specificat în numele fișierului.
Totul este simplu și clar, ce altceva este necesar?
pentru i: = 0 pentru a atașa.Count - 1 face
# xA0; dacă se atașează [i] este TIdAttachmentFile atunci
# xA0; # xA0; atașați [i] .SaveToFile (atașați [i] .FileName);
> pentru i: = 0 pentru a atașa.Count - 1 fa
> # xA0; dacă se atașează [i] este TIdAttachmentFile atunci
> # xA0; # xA0; atașați [i] .SaveToFile (atașați [i] .FileName);
Deci, nu ajuta la atașare nu are sv-va sau conteaza procedura # xA0; - când compilați, se evidențiază roșu, poate că nu folosesc toate unitățile.
> Cum nu?
pentru ce parte a acestui mesaj? Am văzut că am folosit TIdMessage și
TIDAttachment.
> pentru ce parte a acestui mesaj?
Pentru toți, la rând, evident.
Și unde ați cerut să vă interesați să salvați o parte separată într-un fișier separat?
> atașați nu are Conferința sv sau procedura
Consultați TIdMessage.MessageParts.AttachmentCount
> Consultați TIdMessage.MessageParts.AttachmentCount
Acest lucru este de înțeles sv-in conține numărul de atașamente și cum pot fi salvate fiecare individ pe hard disk?
Poate mă înșel despre asta?
DA, acesta este un nonsens
folosește. IdMessageParts.
var
# xA0; attfile: TIdAttachmentFile;
cu MyMessage.MessageParts
# xA0; pentru i: = 0 la Count - 1
# xA0; # xA0; # xA0; # xA0; dacă elementele [i] .PartType = mptAttachment atunci
# xA0; # xA0; # xA0; # xA0; # xA0; începeți
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; attfile: = Elemente [i] ca TIdAttachmentFile;
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; attfile.SaveToFile (attfile.FileName);
# xA0; # xA0; # xA0; # xA0; # xA0; se încheie;
> utilizări. IdMessageParts.
Acum, eu sunt certat [Error Fatal] Unit1.pas (8): Fișierul nu a fost găsit: "IdMessageParts.dcu"
> attfile: TIdAttachmentFile;
și aici [Error] Unit1.pas (37): Identificator nedeclarat: "TIdAttachmentFile"
> [Eroare fatală] Unit1.pas (8): Fișierul nu a fost găsit: "IdMessageParts.
> dcu "
>
Atunci e rău. Care este versiunea dvs. de Indy? Vorbesc despre al zecelea.
> Ei bine, atunci e rău. Care este versiunea dvs. de Indy? Vorbesc despre al zecelea.
Apoi totul este clar 9.00.10 :)
dar în 9-ke toate aceleași undeva este declarat tip TIdMessageParts. Căutați textul modulelor și adăugați-le utilizatorului.
TIdMessage conține MessageParts care nu are funcția SaveToFile (.), Am folosit următoarele pentru a trimite un mesaj:
TIDAttachment.Create (MainForm.MyMessage.MessageParts, "Unload.xml"); și totul este bine, și când o am, nu știu cum să ajung la datele atașate
poate că nu folosesc corect TIDAttachmentul.
> dar în 9-ke toate aceleași undeva este declarat tip TIdMessageParts.
> # xA0; Căutați în textul modulelor și adăugați-le utilizatorului.
>
Căutarea nu a dat rezultate. (
> Căutarea nu a reușit
Nu poate fi.
Dacă nu aveți probleme cu TIdMessage, atunci TIdMessageParts nu trebuie să apară - ambele id-ra sunt declarate în aceeași unitate IdMessage.pas.
Unde și cum ați "căutat" - este neclar)
> Unde și cum ați "căutat" - este neclar)
Search-> Find in Files; găsiți căutat pentru TIdMessageParts
>> Unde și cum ați "căutat" - nu este clar)
>
> Căutare-> Căutare în fișiere; Găsiți căutat pentru TIdMessageParts
Îmi pare rău, am găsit :)
> Căutați textul modulelor și adăugați unul necesar utilizatorului.
este conținut în IdMessage, dar este folosit de mine.
> Eu o folosesc
Atunci confunda ceva.
Este tocmai pe TIdMessageParts că nu ar trebui să existe "înjurături" deloc.
> Atunci, confundați ceva.
>
> "jurământul" pe TIdMessageParts nu ar trebui să fie în nici un fel.
>
și anume Scriu var: mess_parts: TIdMessageParts; și totul ar trebui să fie nishtyak.
așa scriu.
Și adevărul nu jură. )
Voi alege mai departe.
>> Atunci, confundați ceva.
>>
>> "jură" pe TIdMessageParts nu ar trebui să fie în nici un fel.
>
>>
>
> ie. Scriu var: mess_parts: TIdMessageParts; și totul ar trebui
a fi nishtyak.
> asa ca scriu.
>
> Și adevărul nu jură. )
> Voi alege mai departe.
dar apoi mess_parts nu are funcția SaveToFile
cu MyMessage.MessageParts
# xA0; pentru i: = 0 la Count - 1 nu
# xA0; # xA0; # xA0; dacă elementele [i] sunt TIdAttachment atunci
# xA0; # xA0; # xA0; # xA0; # xA0; #AAttachment (Elemente [i]) SaveToFile (TIdAttachment (Elemente [i]) .FileName);
> cu MyMessage.MessageParts face
> # xA0; pentru i: = 0 la Count - 1 nu
> # xA0; # xA0; # xA0; dacă elementele [i] sunt TIdAttachment atunci
> # xA0; # xA0; # xA0; # xA0; # xA0; #AAttachment (Elemente [i]).
> FileName);
Ca toate nishtyak - deja procesate. dar.
Scrie indicele de listă în afara limitelor (0)
Verificată - scrisă ShowMessage (IntToStr (MyMessage.MessageParts)) produce zero, deși mesajul conține două atașări. (
> Verificat - a scris ShowMessage (IntToStr (MyMessage.MessageParts))
> returnează zero, deși mesajul conține două atașări.
> :(
Poate schimbul meu primește poșta mai repede decât programul. )
Voi încerca cu o altă cutie.
> Poate că Exchange îmi ia poșta mai repede decât programul.
>. )
> Încerc cu o altă cutie.
Nu același shnyaga
Ei bine, există un proiect demo în Indy-maildemo.dpr, de ce să nu-l studiezi?
> Ei bine, există un proiect demo în Indy - maildemo.dpr, de ce
> nu o studiați?
C: \ Program Files \ Borland \ Delphi7 \ Demos \ Indy - dacă este acolo, este un fișier text care conține următoarele:
Delphi 7
Indy V9 Demos
Demo aplicații pentru Indy V9 sunt disponibile de la
descărcare pe site-ul Indy la:
Deoarece noile demonstrații sunt construite și testate în mod constant,
aceasta este cea mai actualizată locație pentru demo
download-uri.
Dacă aveți probleme cu demonstrațiile, vă rugăm să vă alăturați
"Indy Demos" la grupurile yahoo și raportați-le
acolo:
Am înțeles ce este ciclul - am un diavol știe kaoi:
CountMessages: = IdPOP31.CheckMessages ();
în timp ce CountMessages> 0 începe
# xA0; cu MyMessage.MessageParts să înceapă
# xA0; # xA0; pentru i: = 0 la Count - 1 începe
# xA0; # xA0; # xA0; dacă elementul [i] este TIdAttachment, atunci începe
# xA0; # xA0; # xA0; # xA0; # xA0; #AAttachment (Elemente [i]) SaveToFile (TIdAttachment (Elemente [i]) .FileName);
# xA0; # xA0; # xA0; se încheie;
# xA0; # xA0; se încheie;
# xA0; # xA0; sfârșitul;
# xA0; CountMessages: = CountMessages - 1;
se încheie;
MyMessage.MessageParts este întotdeauna același mesaj, adică nu există o tranziție la următoarea. Cum să-l implementeze nu-mi spune?
> MyMessage.MessageParts este întotdeauna același mesaj,
> # xA0; nu există o tranziție la următoarea. Cum să îl implementați nu este
> spune-mi?
Am înțeles totul
IdPOP31.Retrieve (CountMessages, MyMessage)
TIdAttachment (Elemente [i]). SaveToFile (TIdAttachment (Elemente [i]). NumeFile);
După această linie, acum scandarea scrie că nu poate salva.
> scrie că nu poate salva
ce și unde? textul complet al mesajului este posibil?
Eroare la salvarea atașamentului
Și dacă într-un depanator să se uite, la ceea ce este egal FileName?
Și unde credeți că va fi stocată?
Scrie - Elemente de identificare nedeclarată [i], dar după ce am scris:
SaveToFile (TIdAttachment (MyMessage.MessageParts .Items [i]). NumeFile);
Totul a funcționat! Multe mulțumiri tuturor!
> Și unde credeți că va fi stocat?
Dacă specificați numai numele din dosarul proiectului și puteți, de asemenea, "C: \ blah blah blah" + MyMessage.MessageParts.Items [i]).
> Și dacă într-un depanator să se uite, la ceea ce este egal FileName?
Și ce să arate și atât de clar că este egal cu informațiile din scrisoare, dacă este scris.
Ar trebui să fie posibilă procesarea de până la un nivel acceptabil și specificați în cazul în care pentru a salva, așa cum fac de servicii poștale și nu ca să unde și ce naiba să scrie.
> Înregistrare - Elemente de identificare nedeclarată [i], dar după
> Am scris:
După cum era de așteptat - ne-a înșelat.
> Dacă specificați numai numele din folderul proiectului,
iluzie
> Misconcepție
Dar eu încă arată modul în care să-l salveze, iar numele de fișier pe care îl am este format din fisuri, așa că nu persistă - cred că așa pare problematică în codificare.
> Așa cum era de așteptat - ne-a înșelat.
Numai aici numele fișierului nu este în întregime în limba rusă - de aici eroarea la salvare (cred că așa)
> Numai aici numele fișierului nu este în rusă - de aici
> și o eroare în timpul salvării (cred că da)
Da. Cu englezii. numele sunt foarte bune, dar numele rusesc nu sunt salvate.
> Și ce să arate și atât de clar că este egal cu informațiile din scrisoare,
> # xA0; dacă este scrisă.
> Este posibil să fie nevoie să fie procesată la o valoare acceptabilă și să specificați unde
> salvați, cum fac poștașii, și nu unde ar lua diavolul
> știe ce să scrie.
Da, ai dreptate, acum a încercat - nu salvează scrie atașamentul de salvare a eerror.
Dar despre numele de fișiere din Rusia - AttacmentEncoding. Sau altceva?
> Numai numele fișierului nu este în întregime în limba rusă
ceva de genul:
=? koi8-r? B? 09fJztjJLnJ0Zg ==? =
> ceva de genul:
> =? koi8-r? B? 09fJztjJLnJ0Zg ==? =
Da. doar extensia arată corect :)
> se afișează corect numai extensia
ceva ce nu pot să cred. Afișează dacă toate sau nimic.
> Ceva nu crede. Afișează dacă toate sau nimic.
În depanarea în Vach Windows MyMessage.MessageParts.Items [i]). FileName Value = aici este tipul acestui r? B? 09fJztjJLnJ0Zg.zip
> r? B? 09fJztjJLnJ0Zg.zip
complet prostii. acest lucru nu poate fi.
> prostii complete. acest lucru nu poate fi.
Acum voi scrie cuvânt cu cuvânt
>> Așa cum era de așteptat - ne-a înșelat.
>
> Numai aici numele fișierului nu este în rusă - de aici
> și o eroare în timpul salvării (cred că da)
Nu ai mințit aici, nu ai putea vorbi despre salvare, nici nu ai compilat programul!
>> r? B? 09fJztjJLnJ0Zg.zip
>
> prostii complete. acest lucru nu poate fi.
"=? koi8-r? B? 99nH0tXay8E =? =. xml"
numele fișierului Unload.xml
Continuă să închidă fidea pe urechi.
> Nu ai mintit aici, nu se poate vorbi despre conservare,
> # xA0; nici măcar nu ați compilat programul!
Erori, compilate și texte de eroare au fost de la RUN Time
> a fost cartografiat, iar textele de eroare au fost de la RUN Time
Aici este:
> Înregistrare - Elemente de identificare nedeclarată [i]
Nu exact de la.
> Continuă să închideți fidea pe urechi.
Fișierele mele sunt deja salvate numai în limba engleză. titluri
Nici măcar nu am întrebat despre compilație. dacă asta. Și întrebarea este cum să salvați fișierele "rusești".
Prin modul în care vă mulțumesc foarte mult pentru ceea ce a ajutat și ajută Umbra să se ocupe de această problemă, dar până în prezent se execută înainte de sfârșitul (nume rusești și nu sunt stocate). (
> nu este exact de la.
Îmi pare rău în depanator, dar la compilare nu a jurat.
Sunt 100% sigur că este numele fișierului. # xA0; conține caractere speciale (dacă fișierul atașat este în limba rusă)
> =? koi8-r? B? 99nH0tXay8E =? =
după primul semn de întrebare - codarea titlurilor
după al doilea - metoda de codare pentru transmisie, In - Base64, Q - citat - imprimabil
după a treia și până la ultima - numele în sine. Pentru a le restabili, trebuie să traduceți din Base64 - obțineți numele în koi8-r. Apoi trebuie să traducem de la koi8-r la windows-1251 (dacă este necesar)
> după primul semn de întrebare - codarea titlurilor
> după al doilea - metoda de codare pentru transfer, In-Base64,
> # xA0; Q - citat-imprimabil
> după a treia și până la ultima - numele în sine. Pentru el
> restabiliți, trebuie să traduceți din Base64 - obțineți numele
> în koi8-r. Apoi trebuie să traducem de la koi8-r la windows-1251
> (dacă este necesar)
Este posibil acest lucru în Delphi?
> Totul poate fi setat în Delphi?
Mai degrabă în ce direcție să picurăm.
pentru Base64 există, de exemplu, TIdDecoderMIME sau funcția DecodeString din modulul EncdDecd.pas
pentru koi8-r - plin de implementări pe Delphi pe Internet, și vă puteți scrie propriul dvs.
> pentru Base64 există, de exemplu, TIdDecoderMIME sau funcția DecodeString
> din modulul EncdDecd.pas
> pentru koi8-r - plin de implementări pe Delphi pe Internet și
> vă puteți scrie propriul dvs.
Vă mulțumesc foarte mult pentru ajutorul dvs. )
file_name: = IdDecoderMIME1.DecodeString (String (TIdAttachment (MyMessage.MessageParts.Items [i]) .FileName));
Dacă este posibil să faci asta, acel eronat se decolorează: Uneven # xA0; dimensiune în decodarea ToStream
> Este posibil să faceți acest lucru,
este imposibil. Numai numele în sine trebuie să fie decodificat, și nu întreaga valoare a FileName. Consultați [60]
> este imposibil. Numai numele în sine trebuie să fie decodificat, și nu toate
> valoarea FileName. Consultați [60]
Apoi, întrebarea este cum poate fi analizată această linie de către delimitatori, există o ontologie a funcției Delin din VB sau există o altă abordare necesară?
> Fie că există un onalog al funcției Delin de la VB sau altă abordare
> Aveți nevoie?
funcția analogică Delim :) izvenyayus
> este imposibil. Numai numele în sine trebuie să fie decodificat, și nu toate
> valoarea FileName. Consultați [60]
Sa dovedit, ia numele fișierului, dar atunci când decodificați totul iese fără prostii, dar acum fără caractere speciale și persistă, adică Cred că este necesar să depășim linia # xA0; windows-1251, dacă da, cum se face? Dă-le, de exemplu, te rog.
> este necesar să depășim un șir în # xA0; ferestre-1251,
must
Luați fiecare caracter în șir și, dacă codul său este mai mare de 127 ($ 79), înlocuiți-l cu caracterul dorit din ferestrele-1251
Memorie: 0,89 MB
Durată: 0,195 secunde