![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Распознование вложения в письме [D6, Win2k, WinXP]
Progh © (2005-02-06 20:46:00)Вот получаю с помощью idPOP3 письмо, в котором есть вложение, далее пытаюсь найти это вложение(if idMessage.MessageParts.Items[j] is TIdAttachment then). Но условие не выполняется не разу, в чем дело ? Ведь в письме 100% есть вложение. Вот полный код ф-ии получения письма :
var
mc, i, j: integer;
idMessage: TidMessage;
_Attach: TIdAttachment;
fname: string;
begin
try
idPop3.Username := User;
idPop3.Password := Password;
idPop3.Host := Host;
idPop3.Port := 110;
if gm = false then
begin
if idPOP3.Connected = true then
idPOP3.Disconnect;
idPOP3.Connect;
gm := true;
mc := idPOP3.CheckMessages;
Result.InMailBox := mc;
Result.Recived := 0;
if mc > 0 then
Log.Lines.Add(DateTimeToStr(now) + IntToStr(mc) + ' новых пичсем');
idMessage := TidMessage.Create(nil);
for i := 1 to mc do
begin
IdMessage.Clear;
idPOP3.Retrieve(i, IdMessage);
Result.Recived := Result.Recived + 1;
if SaveToDir[Length(SaveToDir)] <> '\' then
SaveToDir := SaveToDir + '\';
ForceDirectories(SaveToDir);
// TIdAttachment TIdText
for j := 0 to idMessage.MessageParts.Count - 1 do
begin
if idMessage.MessageParts.Items[j] is TIdAttachment then
begin
fName := SaveToDir + (idMessage.MessageParts.Items[j] as TIdAttachment).FileName;
CopyFile(pchar(idMessage.MessageParts.Items[j].StoredPathName), pchar(fName), false);
end
end;
if idPOP3.Delete(i) = true then
Log.Lines.Add('Удалили письмо');
end;
end;
finally
idPOP3.Disconnect;
gm := false;
end
end;
Zloy (2005-03-31 14:16:00) [1]Так все фуричит, но если файл находится где нить:
Document and setting\user\file.txt
То он кричит, что файл не найдет по такому пути, если путь c:\user\file.txt то нормально.
единственный вариант который я вижу, это при выборе файла, програ копирует его к себе в каталог, но все равно будет косяк если потом прога будет стоять по пути: program files\
Slym (2005-03-31 04:35:00) [2]У тебя исходники перед глазами... Смотри где не фурычит
Zloy (2005-03-30 17:40:00) [3]Ну не уж то ни кто не может деально подсказать, как прикрепить любой файл из любой дирректории... я уже вест инет облазил, и нахожу только такой вариант, который описан выше
Zloy (2005-03-30 15:06:00) [4]Снова поднял эту тему, может кто подскажет. Последний код
TIdAttachment.Create(IdMessage1.MessageParts,MainForm.StaticText2.Caption);
удачно справляется с отсылкой файлов, если они находятся в каталогах где нет пробелов, и если файл не кириллицей написан, а как сделать чтобы он любой мой схватить, из любого пути
(2005-02-14 12:06:00) [5]Удалено модератором
Progh (2005-02-13 16:40:00) [6]
> [7] Eraser © (13.02.05 16:34)
У меня и так 10-е стоят
Progh (2005-02-13 16:39:00) [7]В цикле
for i := 0 to idMessage.MessageParts.Count-1 do
idMessage.MessageParts.Items[i].ClassName всегда равно TidText. Почему ? Где же тогда аттач ? В яндексе же нормально показывает прикрепленный файл !
Eraser (2005-02-13 16:34:00) [8]Progh
Попробуй Indy 10 установить...
Progh (2005-02-13 11:43:00) [9]Нежели никто не занет ??
Progh (2005-02-09 14:40:00) [10]Народ, ну помогите же, горю !
Progh (2005-02-07 16:51:00) [11]Кстати нераспознование приложение происходит, только когда я шлю письмо из своей программы, когда шлю посредством веб интерфейса яндекса, то приложение распознается,, шлю так :
function TMain.SendMail(_to, smtp, from, Subject, text, Attach: string): Boolean;
var
m: TIdMessage;
_Attach: TIdAttachment;
begin
try
idSMTP.Port := StrToInt(edtSMTPPort.Text);
idSMTP.Host := edtSMTP.Text;
idSMTP.Username := edtSMTPMail.Text;
idSMTP.Password := edtSMTPMailPass.Text;
m := TIdMessage.Create(nil);
m.ContentType := 'text/plain';
m.CharSet := 'windows-1251';
m.Encoding := meMIME;
m.ContentTransferEncoding := 'quoted-printable';
m.From.address := from;
m.Recipients.EMailAddresses := from;
m.Subject := Subject;
m.Body.text := Text;
if Attach <> '' then
_Attach := TIdAttachment.Create(m.MessageParts, Attach);
idSMTP.Connect();
idSMTP.Send(m);
idSMTP.Disconnect;
Result := true;
except
if idSMTP.Connected then
idSMTP.Disconnect;
Result := false;
end;
end;
В чем дело ?
Progh (2005-02-07 16:40:00) [12]Весь яндекс облазил, и везде пишут, что для выдирания приложения из письма надо делать так :
for j := 0 to idMessage.MessageParts.Count - 1 do
begin
if idMessage.MessageParts.Items[j] is TIdAttachment then
begin
fName := SaveToDir + (idMessage.MessageParts.Items[j] as TIdAttachment).FileName;
CopyFile(pchar(idMessage.MessageParts.Items[j].StoredPathName), pchar(fName), false);
end
end;
Но у меня не разу не выполняется условие : if idMessage.MessageParts.Items[j] is TIdAttachment then Хотя приложение в письме 100% есть, почему так ?
Progh (2005-02-07 16:26:00) [13]Чето я мало че понял...
Помню что раньше данные код работал, почему он неработает сейчас, как сделать чтобы он работал ?
Slym (2005-02-07 05:43:00) [14]CopyFile(pchar(idMessage.MessageParts.Items[j].StoredPathName), pchar(fName), false);
1 - TIdAttachment(idMessage.MessageParts.Items[j]).StoredPathName
2- А вдруг они уберут StoredPathName? (я например убираю сразу! MessageParts хранятся в MemoryStream, минимальная переделка исходника) а SaveToFile оставят...
3- Первый MessagePart текстовый! т.е. само тело письма. Так устроен IDMessage.
И вообще ради эксперимента сделай
Message.SaveToFile('c:\message.msg');
Message.LoadFromFile('c:\message.msg');
Message.SaveToFile('c:\message2.msg');
файлы message и message2 получатся разные! message2 больше!
А если сделать в цикле- Not free Space on volume c:
Message.SaveToFile('c:\message.msg');
Message.LoadFromFile('c:\message.msg');
Избавится от этого можно тоже минимальными переделками исходника