Не работает отправка почты с Indy 10

  • Автор темы alex2000
  • Дата начала
A

alex2000

#1
Добрый день!
Помогите, уже не знаю что и делать!

Не работает INDY10 отпрака почты
Использую IDSMTP и IDMESSAGE

По форумам гуляет пример:
Код:
IdSMTP1.Host := 'Host';
IdSMTP1.Username :='UserName';
IdSMTP1.Password:='Password';
Message := TIdMessage.Create( nil );
try
Date := Now;
message.Body := Memo1.Lines;
message.From.Text := 'From';
message.Recipients.EMailAddresses := 'EMailAddresses ';
message.Subject := 'Subject';
message.From.Name := 'Name';
message.From.Address := 'Adress@adr.ru';
TIdAttachmentFile.Create( Message.MessageParts, 'c:\файл.расширение' );
IdSMTP1.Connect;
try
IdSMTP1.Send(Message);
finally
IdSMTP1.Disconnect;
end;
finally
FreeAndNil( Message );
end;

Все работает без вложеного файла, а только включаеш строку
TIdAttachmentFile.Create( Message.MessageParts, 'c:\файл.расширение' );

выдается ошибка
[DCC Error] Unit1.pas(184): E2066 Missing operator or semicolon
Такое как у команды есть только один параметер
Как присоединить файл к письму?

пробовал и так:
message.MessageParts.Add.FileName := 'с:\file.txt';
ошибка тоже...

CodeGear™ Delphi® 2009
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Добрый день!
Помогите, уже не знаю что и делать!
...
выдается ошибка
[DCC Error] Unit1.pas(184): E2066 Missing operator or semicolon
Такое как у команды есть только один параметер
Как присоединить файл к письму?
...
пробовал и так:
message.MessageParts.Add.FileName := 'с:\file.txt';
ошибка тоже...
Ну... во-первых. "Missing operator or semicolon" (в переводе с английского) означает что в строчке 184 юнита Unit1.pas у вас имеется синтаксическая ошибка...
А именно: компилятор ожидал там встратить оператор либо знак ";" точка с запятой...
Поскольку экстрасенсов тут у нас нет (по четвергам отдыхают), Вы или весь код "в студию" выдавайте, либо уж сами както там разберитесь орфографией и правописанием...
Во-вторых если компонетну TIdMessage Вы уже положили на форму... (А вы должны это сделать и ктому же правильно заполнить его свойства), то к чему тогда у вас в коде вот эта строчка?
Код:
Message := TIdMessage.Create( nil );
:)
Ну и последнее. Почему бы вам не использовать код проекта MailClient из оффициального демо-набора от Indy? Их можно найдти в сети.
Вот, тут у меня "под рукой" есть ссылка на демо от 9-й версии http://www.projectindy.org/DemoDownloads/I...mos_26Oct04.zip
По идее в 10-й версии тоже должно работать. Если нет... Google все еще работает... :please:
Ну... в самом тяжелом случае зарегистрируйтесь вот тут: http://groups.yahoo.com/group/Indy-Demos/
Там этих примеров... ну просто немеряно... B)

Вот... в догонку... Собственно сам MailClient для 10-го Indy Indy_10_MailClient.zip
 
A

alex2000

#3
Спасибо за ссылочку на пример INDY10 - почерпнул много нового.

работает так:
TIdAttachmentfile.Create(Idmessage1.MessageParts, 'c:\outf.txt');
и добавляем в unit IdAttachmentfile

И теперь вложения вкладываются и отправляются, но называются почему-то "Часть.att" вместо "inform.doc". И еще тема письма отображается "?????" вместо русских букв. Где поменять кодировку. Принимаються письма в основном The Bat!
 

sinkopa

Well-known member
17.06.2009
344
4
#7
Бат выкинуть нельзя, а где кодировку поменять
Бат выкидывать никуда не надо. Это как раз хорошо что именно БАТ.
Проводим эксперимент. B)
Делаем следующее:
1. Запускаем бат, жмем создать письмо.
2. Заполняем поля
Код:
					ОТ: Вася <vasya@vasya.vv>
Обратный адрес: Вася <vasya@vasya.vv>
Кому: Вася <vasya@vasya.vv>
Тема: Привет от Васи
3. В теле письма пишем:
Код:
Привет Вася,
--
Вася						 mailto:vasya@vasya.vv
4. Жмем "Прикрепить файл" (выбираем vasya.jpg)
5. Сохраняем письмо, выбираем его (в исходящих). Жмем "Сохранить как" (Выбираем формат "Привет Васе.MSG").
6. Открываем файл в блокноте. Видим следующее:
Код:
Date: Thu, 24 Jun 2010 20:17:18 +0400
From: =?windows-1251?B?wuDx/w==?= <vasya@vasya.vv>
X-Mailer: The Bat! (v3.98.4) Professional
Reply-To: =?windows-1251?B?wuDx/w==?= <vasya@vasya.vv>
X-Priority: 3 (Normal)
Message-ID: <1712527875.20100624201718@mail.ru>
To: =?windows-1251?B?wuDx/w==?= <vasya@vasya.vv>
Subject: =?windows-1251?B?z/Do4uXyIO7yIMLg8eg=?=
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----------64E82289F5CD7"

------------64E82289F5CD7
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit

Привет Вася,
--
Вася						 mailto:vasya@vasya.vv
------------64E82289F5CD7
Content-Type: image/jpeg;
name="vasya.jpg"
Content-transfer-encoding: base64
Content-Disposition: attachment;
filename="vasya.jpg"

/9j/4AAQSkZJRgABAQAAAQABAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJ
SkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwADAgIDAgIDAwMDBAMDBAUIBQUEBAUK
BwcGCAwKDAwLCgsLDQ4SEA0OEQ4LCxAWEBETFBUVFQwPFxgWFBgSFBUU/9sAQwEDBAQFBAUJ
>... тут вырезано ...<
bfcqRoSBynJPPXmuuu+WSj0ehHmcyPE9w2lvYylUhP75Ay5aNh8pAPcFcZz/AHRTf7Qm/wCg
kP8Avg1oahYQtpttKU+dxgn8SP5Cuf8As6/3m/Ot4RjLVI7aEKTu5q5//9k=
------------64E82289F5CD7--
Комментарии:
1. Данный текст вы можете напрямую скормить SMTP серверу (например через socket соединение) и письмо успешно дойдет вместе с аттачем.
2. На то что находится у вас в теле письма SMTP серверу глубоко наплевать, а вот из заголовочных полей все потенциально опасные (как SMTP считает) символы он сконвертит в безопасные. Во что именно сконвертит - зависит от "модели" сервера и операционной системы на которой этот сервер стоит.
Поскольку MSG "чистый" mail формат - делаем выводы:
1. Все что в заголовках по русски кодируем MIME (Base64).
2. Чтобы почтовый клиент смог прочитать то что закодировано - добавляем управляющие операторы:
Код:
Кодированная строка Subject:
=?windows-1251?B?z/Do4uXyIO7yIMLg8eg=?=
<=?> - начали кодирование
<windows-1251?> - исходная кодировка текста
<B?> - спрособ кодировки (B - значит base64)
<z/Do4uXyIO7yIMLg8eg=> сам кодированный текст
<?=> - конец кодированию (дальше идут некодированные символы)
Вот. Осталось только реализовать выше сказанное.
Реализуем:
Код:
//...
implementation
uses
IdCoderMIME;

function MimeEncode(const STR: string; const SourceCodePage: string): string;
begin
with TIdEncoderMIME.Create(nil) do
begin
FillChar := '=';
Result := '=?'+SourceCodePage+'?B?'+EncodeString(STR)+'?=';
Free;
end;
end;
Проверяем:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdMessage1.From.Text := MimeEncode('Вася','windows-1251') + ' <vasya@vasya.vv>';
with IdMessage1.Recipients.Add do
begin
Text := MimeEncode('Вася','windows-1251') + ' <vasya@vasya.vv>';
end;
IdMessage1.Subject := MimeEncode('Привет от Васи','windows-1251');

ShowMessage(IdMessage1.Subject);
ShowMessage(IdMessage1.From.Text);
ShowMessage(IdMessage1.Recipients.Items[0].Text);
end;
Уф... все... Чувствую себя лектором... блин... чуть ли не ганнибалом... :facepalm:
 
A

alex2000

#8
procedure TForm1.Button1Click(Sender: TObject);
begin
IdMessage1.From.Text := MimeEncode('Вася','windows-1251') + ' <vasya@vasya.vv>';
with IdMessage1.Recipients.Add do
begin
Text := MimeEncode('Вася','windows-1251') + ' <vasya@vasya.vv>';
end;
IdMessage1.Subject := MimeEncode('Привет от Васи','windows-1251');

ShowMessage(IdMessage1.Subject);
ShowMessage(IdMessage1.From.Text);
ShowMessage(IdMessage1.Recipients.Items[0].Text);
end;
Да, все отправляется, но результат неутешительный. Приходит письмо с сабжем
LUI+IEI1QUI+Mj41ID84QUw8Pg==
Выходит Бат его назад не перекодирует, или в самом письме не указан тип перекодировки.
Ладно - буду использовать транслит.
 
E
#9
Бату место в корзине.
Надо указывать правильную кодировку в теме сообщения, и да будет счастье.
 

sinkopa

Well-known member
17.06.2009
344
4
#10
Да, все отправляется, но результат неутешительный. Приходит письмо с сабжем
LUI+IEI1QUI+Mj41ID84QUw8Pg==
Выходит Бат его назад не перекодирует, или в самом письме не указан тип перекодировки.
Ладно - буду использовать транслит.
Зачем же сразу транслит? :)
Можно глянуть на текст приходящего "глючносабжевого" письма (слитого в MSG формат)?
Похоже у вас действительно конфликт кодировок. (в заголовке письма указана одна, а на самом деле другая).