Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Вниз

Получение почты в Delphi   Найти похожие ветки 

 
DimOk ©   (2007-08-27 12:23) [0]

Добрый день всем. Хочу поинтересоваться, как можно сохранить прикрепленные файлы к письму.
procedure TForm1.Button1Click(Sender: TObject);
var MyMessage:  TIdMessage;
   CountMessages: Integer;
   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
   RichEdit1.Lines.Assign(MyMessage.Body);
   attach := TIDAttachment.Create(MyMessage.MessageParts);
   //А дальше я не знаю что делать (касательно прикрепленных файлов)
  //attach.SaveToFile(const FileName: TFeliName): Boolean - как работает эта функция в хелпе нет ни каких данных и примеров по indy компонентам.
end;
CountMessages := CountMessages - 1;
end;
ShowMessage(IntToStr(IdPOP31.CheckMessages()));
MyMessage.Free;
IdPOP31.Disconnect;
end;


 
Сергей М. ©   (2007-08-27 12:29) [1]


> как работает эта функция в хелпе нет ни каких данных


Как это нет ?

Вот цитата как раз из хэлпа к этой ф-ции:

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

Parameters

const FileName: TFileName

File name where the message part will be stored.

Return Value

Boolean - True when the message parts is stored.

Description

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



Все просто и понятно, что еще надо ?


 
umbra ©   (2007-08-27 13:13) [2]

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


 
DimOK ©   (2007-08-27 14:47) [3]


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


Так не помогает attach не имеет св-ва или процедуры Count  - при компиляции выделяет красным, может быть я не все unit использую.....?


 
DimOK ©   (2007-08-27 14:50) [4]


> Как это нет ?

для какого это message part? Это я видел у меня используется TIdMessage и
TIDAttachment....


 
Сергей М. ©   (2007-08-27 14:56) [5]


> для какого это message part?


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

А где ты спросил, что тебя интересует сохранение отдельной части в отдельный файл ?

Не было такого)


> attach не имеет св-ва или процедуры Count


См. св-во TIdMessage.MessageParts.AttachmentCount


 
DimOK ©   (2007-08-27 15:05) [6]


> См. св-во TIdMessage.MessageParts.AttachmentCount

Это понятно св-во содержит количество прикреплений, а как каждое из них по отдельности сохранить на жесткий диск?


 
DimOK ©   (2007-08-27 15:07) [7]

attach := TIDAttachment.Create(MyMessage.MessageParts);

Может я в этом ошибаюсь?


 
umbra ©   (2007-08-27 15:36) [8]

ДА, это я чушь спорол

uses ..., IdMessageParts, ....
var
 attfile: TIdAttachmentFile;
{.................................}
with MyMessage.MessageParts do
  for i := 0 to Count - 1 do
       if Items[i].PartType = mptAttachment then
         begin
           attfile := Items[i] as TIdAttachmentFile;
           attfile.SaveToFile(attfile.FileName);
          end;


 
DimOK ©   (2007-08-27 15:59) [9]


> uses ..., IdMessageParts, ....

Теперь, иам ругается [Fatal Error] Unit1.pas(8): File not found: "IdMessageParts.dcu"


 
DimOK ©   (2007-08-27 16:03) [10]


> attfile: TIdAttachmentFile;

и здесь [Error] Unit1.pas(37): Undeclared identifier: "TIdAttachmentFile"


 
umbra ©   (2007-08-27 16:04) [11]


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


Ну тогда дело плохо. У Вас какая версия Инди? Я про 10-ую.


 
DimOK ©   (2007-08-27 16:06) [12]


> Ну тогда дело плохо. У Вас какая версия Инди? Я про 10-ую.

Тогда все понятно 9.00.10 :)


 
umbra ©   (2007-08-27 16:17) [13]

но в 9-ке все равно где-то объявлен тип TIdMessageParts. Поищите поиском по тексту модулей и добавьте нужный в юзесы.


 
DimOK ©   (2007-08-27 16:41) [14]

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


 
DimOK ©   (2007-08-27 16:43) [15]


> но в 9-ке все равно где-то объявлен тип TIdMessageParts.
>  Поищите поиском по тексту модулей и добавьте нужный в юзесы.
>

Поиск не дал результата.....:(


 
Сергей М. ©   (2007-08-27 16:47) [16]


> Поиск не дал результата


Быть того не может.

Если у тебя не возникли проблемы с ид-ром TIdMessage, то и с TIdMessageParts тоже не должны возникнуть - оба ид-ра объявлены в одном и том же юните IdMessage.pas.

Где и как ты "искал" - непонятно)


 
DimOK ©   (2007-08-27 16:55) [17]


> Где и как ты "искал" - непонятно)

Search->Find in Files;Find искал TIdMessageParts


 
DimOK ©   (2007-08-27 16:57) [18]


> > Где и как ты "искал" - непонятно)
>
> Search->Find in Files;Find искал TIdMessageParts

Сорри ступи, нашел :)


 
DimOK ©   (2007-08-27 17:00) [19]


> Поищите поиском по тексту модулей и добавьте нужный в юзесы.

содержиться в IdMessage, но он у меня используется.


 
Сергей М. ©   (2007-08-27 17:04) [20]


> он у меня используется


ТОгда ты что-то путаешь.

"ругани" именно на TIdMessageParts быть никак не должно.


 
DimOK ©   (2007-08-27 17:08) [21]


> ТОгда ты что-то путаешь.
>
> "ругани" именно на TIdMessageParts быть никак не должно.
>

т.е. я пишу var: mess_parts: TIdMessageParts; и все должно быть ништяк.....
так пишу......

И правда не ругается...:)
Буду ковырять дальше.


 
DimOK ©   (2007-08-27 17:24) [22]


> > ТОгда ты что-то путаешь.
> >
> > "ругани" именно на TIdMessageParts быть никак не должно.
>
> >
>
> т.е. я пишу var: mess_parts: TIdMessageParts; и все должно
> быть ништяк.....
> так пишу......
>
> И правда не ругается...:)
> Буду ковырять дальше.

но тогда у mess_parts нету функции SaveToFile


 
umbra ©   (2007-08-27 18:02) [23]

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


 
DimOk ©   (2007-08-28 09:28) [24]


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

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


 
DimOk ©   (2007-08-28 09:33) [25]


> Проверил - написал ShowMessage(IntToStr(MyMessage.MessageParts))
> выдает нуль, хотя сообщение содержит два прикрепления...
> :(

Может быть у меня Exchange забирает почту быстрее чем программа...? :)
Попробую с другим ящиком....


 
DimOk ©   (2007-08-28 09:41) [26]


> Может быть у меня Exchange забирает почту быстрее чем программа.
> ..? :)
> Попробую с другим ящиком....

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


 
Сергей М. ©   (2007-08-28 09:44) [27]


> DimOk ©   (28.08.07 09:41) [26]


Ну есть же демо-проект в составе Инди - maildemo.dpr, почему не изучить его ?


 
DimOk ©   (2007-08-28 10:01) [28]


> Ну есть же демо-проект в составе Инди - maildemo.dpr, почему
> не изучить его ?

C:\Program Files\Borland\Delphi7\Demos\Indy - если это там, то это текстовый фай в котором содержиться следующее:

Delphi 7
Indy V9 Demos

===========================

Indy V9 Demos

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

http://www.nevrona.com/indy

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:

http://groups.yahoo.com/group/Indy-Demos/

http://www.nevrona.com/indy - на этот ресурс я заходил но что там скачевать так и не понял...


 
DimOk ©   (2007-08-28 10:03) [29]

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


 
DimOk ©   (2007-08-28 10:09) [30]


> MyMessage.MessageParts - это постоянно одно и тоже сообщение,
>  т.е. нет перехода к следующему. Как его осуществить не
> подскажите?

Все понял
IdPOP31.Retrieve(CountMessages,MyMessage)


 
DimOk ©   (2007-08-28 10:20) [31]

TIdAttachment(Items[i]).SaveToFile(TIdAttachment(Items[i]).FileName);
После этой строки теперь ругается пишет что не может сохранить.


 
umbra ©   (2007-08-28 10:33) [32]


> пишет что не может сохранить

что и куда? полный текст сообщения можно?


 
DimOk ©   (2007-08-28 10:38) [33]

Error saving Attachment


 
umbra ©   (2007-08-28 10:45) [34]

а если в отладчике посмотреть, чему равно FileName?


 
Anatoly Podgoretsky ©   (2007-08-28 10:50) [35]

> DimOk  (28.08.2007 10:20:31)  [31]

И куда по твоему он будет сохранять?


 
DimOk ©   (2007-08-28 10:52) [36]

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


 
DimOk ©   (2007-08-28 10:53) [37]


> И куда по твоему он будет сохранять?

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


 
Anatoly Podgoretsky ©   (2007-08-28 10:53) [38]


> а если в отладчике посмотреть, чему равно FileName?

А чего смотреть и так ясно, что он равен информации в письме, если она прописана.
Его возможно надо обработать до допустимого и указать куда сохранять, как это делают почтовики, а не а бы куда и черт знает что записать.


 
Anatoly Podgoretsky ©   (2007-08-28 10:54) [39]


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

Как и предполагалось - обманывал нас.


 
Anatoly Podgoretsky ©   (2007-08-28 10:55) [40]


> Если указать только имя то в папку с проектом,

Заблуждение


 
DimOk ©   (2007-08-28 11:00) [41]


> Заблуждение

Но я все равно указываю путь куда его сохранять, а имя файла у меня состоит из кракозябр, поэтому он и не сохраняется - я так думаю, видимо проблемма в кодировке.....


 
DimOk ©   (2007-08-28 11:02) [42]


> Как и предполагалось - обманывал нас.

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


 
DimOk ©   (2007-08-28 11:07) [43]


> Только вот имя файла не совсем на русском языке - отсюда
> и ошибка при сохранении (я так думаю)

Да. С англ. названиями все просто замечательно, а вот русские имена не сохраняет.


 
DimOk ©   (2007-08-28 11:13) [44]


> А чего смотреть и так ясно, что он равен информации в письме,
>  если она прописана.
> Его возможно надо обработать до допустимого и указать куда
> сохранять, как это делают почтовики, а не а бы куда и черт
> знает что записать.

Да вы правы, сейчас попробовал - не сохраняет пишет eerror saving attachment.
Но как быть с русскими названиями файлов - AttacmentEncoding...? Или что то другое?


 
umbra ©   (2007-08-28 11:15) [45]


> Только вот имя файла не совсем на русском языке

что-то наподобие этого:
=?koi8-r?B?09fJztjJLnJ0Zg==?=


 
DimOk ©   (2007-08-28 11:16) [46]


> что-то наподобие этого:
> =?koi8-r?B?09fJztjJLnJ0Zg==?=

Да. только расширение правильно показывает :)


 
umbra ©   (2007-08-28 11:19) [47]


> только расширение правильно показывает

что-то не верится. Показывает или все или ничего.


 
DimOk ©   (2007-08-28 11:21) [48]


> что-то не верится. Показывает или все или ничего.

В отладчекн в Вач Виндов MyMessage.MessageParts.Items[i]).FileName Value = вот типо этого r?B?09fJztjJLnJ0Zg.zip


 
umbra ©   (2007-08-28 11:24) [49]


> r?B?09fJztjJLnJ0Zg.zip

полный бред. такого быть не может.


 
DimOk ©   (2007-08-28 11:26) [50]


> полный бред. такого быть не может.

Сейчас дословно напишу


 
Anatoly Podgoretsky ©   (2007-08-28 11:28) [51]


> > Как и предполагалось - обманывал нас.
>
> Только вот имя файла не совсем на русском языке - отсюда
> и ошибка при сохранении (я так думаю)

Ты не здесь обманывал, речи о сохранение и быть не могло, у тебя даже программа не компилировалась!


 
DimOk ©   (2007-08-28 11:29) [52]


> > r?B?09fJztjJLnJ0Zg.zip
>
> полный бред. такого быть не может.

"=?koi8-r?B?99nH0tXay8E=?=.xml"
имя файла Выгрузка.xml


 
Anatoly Podgoretsky ©   (2007-08-28 11:30) [53]

> umbra  (28.08.2007 11:24:49)  [49]

Продолжает лапшу на уши вешать.


 
DimOk ©   (2007-08-28 11:31) [54]


> Ты не здесь обманывал, речи о сохранение и быть не могло,
>  у тебя даже программа не компилировалась!

Ошибаетесь, компилировалась и текты ошибок были из RUN Time


 
umbra ©   (2007-08-28 11:33) [55]


> омпилировалась и текты ошибок были из RUN Time

вот это:


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

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


 
DimOk ©   (2007-08-28 11:33) [56]


> Продолжает лапшу на уши вешать.

У меня файлы уже сохраняются только с англ. названиями
По поводу компиляции я даже и не спрашивал..... если что. А вопрос как "русские" файлы сохранить.


 
DimOk ©   (2007-08-28 11:38) [57]

К стати большое спасибо umbra за то что помог и помогает разбираться с этой задачей, но пока она выполняется до конца (русские имена так и не сохраняются)........:(


 
DimOk ©   (2007-08-28 11:43) [58]


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

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


 
DimOk ©   (2007-08-28 11:46) [59]

Я уже на 100% уверен что дело в имени файла т.к.  оно содержит спецсимволы (если прикрепленный файл на русском языке)


 
umbra ©   (2007-08-28 12:05) [60]


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

после первого знака вопроса - кодировка названия
после второго - способ кодировки для передачи, В - Base64, Q - quoted-printable
после третьего и до последнего - само название. Чтобы его восстановить, надо перевести из Base64 - получится название в koi8-r. Затем надо из koi8-r перевести в windows-1251 (если надо)


 
DimOk ©   (2007-08-28 12:10) [61]


> после первого знака вопроса - кодировка названия
> после второго - способ кодировки для передачи, В - Base64,
>  Q - quoted-printable
> после третьего и до последнего - само название. Чтобы его
> восстановить, надо перевести из Base64 - получится название
> в koi8-r. Затем надо из koi8-r перевести в windows-1251
> (если надо)

Это все можно зделать в Delphi?


 
DimOk ©   (2007-08-28 12:30) [62]


> Это все можно зделать в Delphi?

Вернее в каком направлении капать.


 
umbra ©   (2007-08-28 12:45) [63]

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


 
DimOk ©   (2007-08-28 12:50) [64]


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

Большое спасибо за помощь. :)


 
DimOk ©   (2007-08-28 13:28) [65]

file_name := IdDecoderMIME1.DecodeString(String(TIdAttachment(MyMessage.MessageParts.Items[i] ).FileName));
Можно ли так делать, что то ошибочка вылетает: Uneven  size in decode ToStream


 
umbra ©   (2007-08-28 13:31) [66]


> Можно ли так делать,

нельзя. декодировать надо только само название, а не все значение FileName. См. [60]


 
DimOk ©   (2007-08-28 13:34) [67]


> нельзя. декодировать надо только само название, а не все
> значение FileName. См. [60]

Тогда вопрос, как эту строку можно разобрать по разделителям, есть ли оналог функции Delin из VB или здесь другой подход нужен?


 
DimOk ©   (2007-08-28 13:37) [68]


> есть ли оналог функции Delin из VB или здесь другой подход
> нужен?

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


 
DimOk ©   (2007-08-28 15:03) [69]


> нельзя. декодировать надо только само название, а не все
> значение FileName. См. [60]

Получилось, достать имя файла, но при декодировании всеравно выходит чушь, но теперь без спец символов и сохраняеся, т.е. я так думаю надо перегнать строку в  windows-1251, если это так, то как это зделать? Дайте напрвление пожалуйсто.


 
umbra ©   (2007-08-28 15:09) [70]


> надо перегнать строку в  windows-1251,

надо


> Дайте напрвление пожалуйсто.

http://ru.wikipedia.org/wiki/%D0%9A%D0%9E%D0%98-8

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


 
DimOk ©   (2007-08-28 15:18) [71]


> http://ru.wikipedia.org/wiki/%D0%9A%D0%9E%D0%98-8
>
> Берете каждый символ строки и, если его код больше 127 ($79),
>  заменяете на нужный символ из windows-1251

Спасибо.
Всем большое спасибо. Если эта тема больше ни каму не интересна предлогаю ее закрыть.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.63 MB
Время: 0.08 c
15-1187758204
de.
2007-08-22 08:50
2007.09.23
PHP and MS SQL Server


15-1187947154
sample01
2007-08-24 13:19
2007.09.23
Explorer


15-1187882160
Joan
2007-08-23 19:16
2007.09.23
SQL


8-1164002284
ka1n
2006-11-20 08:58
2007.09.23
как подключить визуальные плагины от Winamp?


2-1188548482
Sonia
2007-08-31 12:21
2007.09.23
RadioGroup





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский