Отримання пошти в delphi

Отримання пошти в Delphi

Добрий день всім. Хочу поцікавитися, як можна зберегти прикріплені файли до листа.
procedure TForm1.Button1Click (Sender: TObject);
var MyMessage: # XA0; TIdMessage;
# XA0; # XA0; CountMessages: Integer;
# XA0; # XA0; attach: TIDAttachment;
begin
MyMessage: = TIdMessage.Create (nil);
IdPOP31.Connect ();
CountMessages: = IdPOP31.CheckMessages ();
while CountMessages> 0 do begin
if IdPOP31.Retrieve (CountMessages, MyMessage) = True then begin
# XA0; # XA0; RichEdit1.Lines.Assign (MyMessage.Body);
# XA0; # XA0; attach: = TIDAttachment.Create (MyMessage.MessageParts);
# XA0; # XA0; // А далі я не знаю що робити (щодо прикріплених файлів)
# XA0; //attach.SaveToFile(const FileName: TFeliName): Boolean - як працює ця функція в хелпе немає ніяких даних і прикладів по indy компонентів.
end;
CountMessages: = CountMessages - 1;
end;
ShowMessage (IntToStr (IdPOP31.CheckMessages ()));
MyMessage.Free;
IdPOP31.Disconnect;
end;


> Як працює ця функція в хелпе немає ніяких даних

Ось цитата якраз з Хелп до цієї ф-ції:

Stores a message part to a disk file.
function SaveToFile (const FileName: TFileName): Boolean;

const FileName: TFileName

File name where the message part will be stored.

Boolean - True when the message parts is stored.

SaveToFile is a Boolean function used to store the attachment that represents the message part to the file specified in Filename.

Все просто і зрозуміло, що ще треба?

for i: = 0 to attach.Count - 1 do
# XA0; if attach [i] is TIdAttachmentFile then
# XA0; # XA0; attach [i] .SaveToFile (attach [i] .FileName);


> For i: = 0 to attach.Count - 1 do
> # XA0; if attach [i] is TIdAttachmentFile then
> # XA0; # XA0; attach [i] .SaveToFile (attach [i] .FileName);

Так не допомагає attach не має св-ва або процедури Count # XA0; - при компіляції виділяє червоним, може бути я не все unit використовую.


> Як це немає?

для якого це message part? Це я бачив у мене використовується TIdMessage і
TIDAttachment.


> Для якого це message part?

Для всіх підряд, очевидно.

А де ти запитав, що тебе цікавить збереження окремої частини в окремий файл?


> Attach не має св-ва або процедури Count

Див. Св-во TIdMessage.MessageParts.AttachmentCount


> Див. Св-во TIdMessage.MessageParts.AttachmentCount

Це зрозуміло св-во містить кількість прикріплень, а як кожне з них окремо зберегти на жорсткий диск?

Може я в цьому помиляюся?

ТАК, це я нісенітниця споров

uses. IdMessageParts.
var
# XA0; attfile: TIdAttachmentFile;

with MyMessage.MessageParts do
# XA0; for i: = 0 to Count - 1 do
# XA0; # XA0; # XA0; # XA0; if Items [i] .PartType = mptAttachment then
# XA0; # XA0; # XA0; # XA0; # XA0; begin
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; attfile: = Items [i] as TIdAttachmentFile;
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; attfile.SaveToFile (attfile.FileName);
# XA0; # XA0; # XA0; # XA0; # XA0; end;


> Uses. IdMessageParts.

Тепер, ИАМ лається [Fatal Error] Unit1.pas (8): File not found: "IdMessageParts.dcu"


> Attfile: TIdAttachmentFile;

і тут [Error] Unit1.pas (37): Undeclared identifier: "TIdAttachmentFile"


> [Fatal Error] Unit1.pas (8): File not found: "IdMessageParts.
> Dcu "
>

Ну тоді справи кепські. У Вас якась версія Інді? Я про 10-ту.


> Ну тоді справи кепські. У Вас якась версія Інді? Я про 10-ту.

Тоді все зрозуміло 9.00.10 :)

але в 9-ке все одно десь оголошений тип TIdMessageParts. Пошукайте пошуком по тексту модулів і додайте потрібний в Юзес.

TIdMessage містить MessageParts у якого немає функції SaveToFile (.), Для відправки повідомлення я використовував наступне:
TIDAttachment.Create (MainForm.MyMessage.MessageParts, "Вигрузка.xml"); і все нормально проходить, а при отриманні я не знаю як дістатися саме до прикріплених даних
можливо я не правильно використовую TIDAttachment.


> Але в 9-ке все одно десь оголошений тип TIdMessageParts.
> # XA0; Пошукайте пошуком по тексту модулів і додайте потрібний в Юзес.
>

Пошук не дав результату. (


> Пошук не дав результату

Бути того не може.

Якщо у тебе не виникли проблеми з ід-ром TIdMessage, то і з TIdMessageParts теж не повинні виникнути - обидва ід-ра оголошені в одному і тому ж юніте IdMessage.pas.

Де і як ти "шукав" - незрозуміло)


> Де і як ти "шукав" - незрозуміло)

Search-> Find in Files; Find шукав TIdMessageParts


>> Де і як ти "шукав" - незрозуміло)
>
> Search-> Find in Files; Find шукав TIdMessageParts

Соррі ступи, знайшов :)


> Пошукайте пошуком по тексту модулів і додайте потрібний в Юзес.

міститься у IdMessage, але він у мене використовується.


> Він у мене використовується

Тоді ти щось плутаєш.

"Лайки" саме на TIdMessageParts бути ніяк не повинно.


> Тоді ти щось плутаєш.
>
> "Лайки" саме на TIdMessageParts бути ніяк не повинно.
>

тобто я пишу var: mess_parts: TIdMessageParts; і все повинно бути ніштяк.
так пишу.

І правда не лається. )
Буду колупати далі.


>> Тоді ти щось плутаєш.
>>
>> "лайки" саме на TIdMessageParts бути ніяк не повинно.
>
>>
>
> Тобто я пишу var: mess_parts: TIdMessageParts; і все повинно
> Бути ніштяк.
> Так пишу.
>
> І правда не лається. )
> Буду колупати далі.

але тоді у mess_parts немає функції SaveToFile

with MyMessage.MessageParts do
# XA0; for i: = 0 to Count - 1 do
# XA0; # XA0; # XA0; if Items [i] is TIdAttachment then
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; TIdAttachment (Items [i]). SaveToFile (TIdAttachment (Items [i]). FileName);


> With MyMessage.MessageParts do
> # XA0; for i: = 0 to Count - 1 do
> # XA0; # XA0; # XA0; if Items [i] is TIdAttachment then
> # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; TIdAttachment (Items [i]). SaveToFile (TIdAttachment (Items [i]).
> FileName);

Начебто все ніштяк - вже обрабовался. але.
Пише List index out of bounds (0)
Перевірив - написав ShowMessage (IntToStr (MyMessage.MessageParts)) видає нуль, хоча повідомлення містить два прикріплення. (


> Перевірив - написав ShowMessage (IntToStr (MyMessage.MessageParts))
> Видає нуль, хоча повідомлення містить два прикріплення.
> :(

Може бути у мене Exchange забирає пошту швидше ніж програма. )
Спробую з іншим ящиком.


> Може бути у мене Exchange забирає пошту швидше ніж програма.
>. )
> Спробую з іншим ящиком.

Немає така ж шняга

Ну є ж демо-проект в складі Інді - maildemo.dpr, чому не вивчити його?


> Ну є ж демо-проект в складі Інді - maildemo.dpr, чому
> Не вивчити його?

C: \ Program Files \ Borland \ Delphi7 \ Demos \ Indy - якщо це там, то це текстовий фай в якому міститься наступне:

Delphi 7
Indy V9 Demos

Demo applications for Indy V9 are available from the
downloads section on the Indy site at:

As new demos are constantly being built and tested,
this is the most up to date location for demo
downloads.

If you have any problems with demos please join the
"Indy Demos" group at yahoo groups, and report them
there:

Зрозумів у чому справа цикл - у мене виходить казна каой:
CountMessages: = IdPOP31.CheckMessages ();
while CountMessages> 0 do begin
# XA0; with MyMessage.MessageParts do begin
# XA0; # XA0; for i: = 0 to Count - 1 do begin
# XA0; # XA0; # XA0; if Items [i] is TIdAttachment then begin
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; TIdAttachment (Items [i]). SaveToFile (TIdAttachment (Items [i]). FileName);
# XA0; # XA0; # XA0; end;
# XA0; # XA0; end;
# XA0; # XA0; end;
# XA0; CountMessages: = CountMessages - 1;
end;
MyMessage.MessageParts - це постійно одне і теж повідомлення, тобто немає переходу до наступного. Як його здійснити не підкажіть?


> MyMessage.MessageParts - це постійно одне і теж повідомлення,
> # XA0; тобто. немає переходу до наступного. Як його здійснити не
> Підкажіть?

Все зрозумів
IdPOP31.Retrieve (CountMessages, MyMessage)

TIdAttachment (Items [i]). SaveToFile (TIdAttachment (Items [i]). FileName);
Після цього рядка тепер лається пише що не може зберегти.


> Пише що не може зберегти

що і куди? повний текст повідомлення можна?

Error saving Attachment

а якщо в отладчике подивитися, чому дорівнює FileName?

І куди на твою він буде зберігати?

Пише - ундекларе ідентіфер Items [i], але після того як я написав:
SaveToFile (TIdAttachment (MyMessage.MessageParts .Items [i]). FileName);
Все запрацювало! Всім велике спасибі!


> І куди на твою він буде зберігати?

Якщо вказати тільки ім'я то в папку з проектом, а можна і "C: \ бла бла бла" + MyMessage.MessageParts.Items [i]). FileName


> А якщо в отладчике подивитися, чому дорівнює FileName?

А чого дивитися і так ясно, що він дорівнює інформації в листі, якщо вона прописана.
Його можливо треба обробити до допустимого і вказати куди зберігати, як це роблять поштовики, а не а би куди і казна-що записати.


> Пише - ундекларе ідентіфер Items [i], але після того як
> Я написав:

Як і передбачалося - обманював нас.


> Якщо вказати тільки ім'я то в папку з проектом,

Омана


> Помилка

Але я все одно вказую шлях куди його зберігати, а ім'я файлу у мене складається з кракозябри, тому він і не зберігається - я так думаю, мабуть проблемма в кодуванні.


> Як і передбачалося - обманював нас.

Тільки ось ім'я файлу не зовсім російською мовою - звідси і помилка при збереженні (я так думаю)


> Тільки ось ім'я файлу не зовсім російською мовою - звідси
> І помилка при збереженні (я так думаю)

Так. З англ. назвами все просто чудово, а ось російські імена не зберігає.


> А чого дивитися і так ясно, що він дорівнює інформації в листі,
> # XA0; якщо вона прописана.
> Його можливо треба обробити до допустимого і вказати куди
> Зберігати, як це роблять поштовики, а не а би куди і чорт
> Знає що записати.

Так ви маєте рацію, зараз спробував - не зберігається пише eerror saving attachment.
Але як бути з російськими назвами файлів - AttacmentEncoding. Або щось інше?


> Тільки ось ім'я файлу не зовсім російською мовою

щось на зразок цього:
=? Koi8-r? B? 09fJztjJLnJ0Zg ==? =


> Щось на зразок цього:
> =? Koi8-r? B? 09fJztjJLnJ0Zg ==? =

Так. тільки розширення правильно показує :)


> Тільки розширення правильно показує

щось не віриться. Показує або все або нічого.


> Щось не віриться. Показує або все або нічого.

У отладчекн в Вач Віндов MyMessage.MessageParts.Items [i]). FileName Value = ось нібито цього r? B? 09fJztjJLnJ0Zg.zip


> R? B? 09fJztjJLnJ0Zg.zip

повна маячня. такого бути не може.


> Повна маячня. такого бути не може.

Зараз дослівно напишу


>> Як і передбачалося - обманював нас.
>
> Тільки ось ім'я файлу не зовсім російською мовою - звідси
> І помилка при збереженні (я так думаю)

Ти не тут обманював, мови про збереження і бути не могло, у тебе навіть Програма не компілювати!


>> r? B? 09fJztjJLnJ0Zg.zip
>
> Повна маячня. такого бути не може.

"=? Koi8-r? B? 99nH0tXay8E =? =. Xml"
ім'я файлу Вигрузка.xml

Продовжує локшину на вуха вішати.


> Ти не тут обманював, мови про збереження і бути не могло,
> # XA0; у тебе навіть Програма не компілювати!

Помиляєтеся, компілювати і ТЕКТ помилок були з RUN Time


> Омпіліровалась і ТЕКТ помилок були з RUN Time

ось це:


> Пише - ундекларе ідентіфер Items [i]

точно не з рантайм.


> Продовжує локшину на вуха вішати.

У мене файли вже зберігаються тільки з англ. назвами
З приводу компіляції я навіть і не питав. якщо що. А питання як "російські" файли зберегти.

До речі велике спасибі umbra за те що допоміг і допомагає розбиратися з цим завданням, але поки вона виконується до кінця (російські імена так і не зберігаються). (


> Точно не з рантайм.

Извеняюсь в отладчике, але при компіляції не лаявся.

Я вже на 100% впевнений що справа в імені файлу тому # XA0; воно містить спецсимволи (якщо прикріплений файл російською мовою)


> =? Koi8-r? B? 99nH0tXay8E =? =

після першого знака питання - кодування назви
після другого - спосіб кодування для передачі, В - Base64, Q - quoted-printable
після третього і до останнього - сама назва. Щоб його відновити, треба перевести з Base64 - вийде назва в koi8-r. Потім треба з koi8-r перевести в windows-1251 (якщо треба)


> Після першого знака питання - кодування назви
> Після другого - спосіб кодування для передачі, В - Base64,
> # XA0; Q - quoted-printable
> Після третього і до останнього - сама назва. щоб його
> Відновити, треба перевести з Base64 - вийде назва
> В koi8-r. Потім треба з koi8-r перевести в windows-1251
> (Якщо треба)

Це все можна здолати в Delphi?


> Це все можна здолати в Delphi?

Вірніше в якому напрямку капати.

для Base64 є, наприклад, TIdDecoderMIME або функція DecodeString з модуля EncdDecd.pas
для koi8-r - повно реалізацій на Делфі в інтернеті, та й свою написати можна.


> Для Base64 є, наприклад, TIdDecoderMIME або функція DecodeString
> З модуля EncdDecd.pas
> Для koi8-r - повно реалізацій на Делфі в інтернеті, та й
> Свою написати можна.

Велике дякую за допомогу. )

file_name: = IdDecoderMIME1.DecodeString (String (TIdAttachment (MyMessage.MessageParts.Items [i]) .FileName));
Чи можна так робити, що то помилочка вилітає: Uneven # XA0; size in decode ToStream


> Чи можна так робити,

не можна. декодувати треба тільки сама назва, а не всі значення FileName. Див. [60]


> Не можна. декодувати треба тільки сама назва, а не всі
> Значення FileName. Див. [60]

Тоді питання, як цей рядок можна розібрати по розділювачам, чи є оналог функції Delin з VB або тут інший підхід потрібен?


> Чи є оналог функції Delin з VB або тут інший підхід
> Потрібен?

аналог функції Delim :) извеняюсь


> Не можна. декодувати треба тільки сама назва, а не всі
> Значення FileName. Див. [60]

Вийшло, дістати ім'я файлу, але при декодуванні всерівно виходить нісенітниця, але тепер без спец символів і зберігати, тобто я так думаю треба перегнати рядок в # XA0; windows-1251, якщо це так, то як це зделать? Дайте напрвление пожалуйсто.


> Треба перегнати рядок в # XA0; windows-1251,

треба

Берете кожен символ рядка і, якщо його код більше 127 ($ 79), замінюєте на потрібний символ з windows-1251

Пам'ять: 0.89 MB
Час: 0.195 c

Схожі статті