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

Тема в разделе "Delphi - Сети", создана пользователем alex2000, 23 июн 2010.

  1. alex2000

    alex2000 Гость

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

    Не работает 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
     
  2. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ну... во-первых. "Missing operator or semicolon" (в переводе с английского) означает что в строчке 184 юнита Unit1.pas у вас имеется синтаксическая ошибка...
    А именно: компилятор ожидал там встратить оператор либо знак ";" точка с запятой...
    Поскольку экстрасенсов тут у нас нет (по четвергам отдыхают), Вы или весь код "в студию" выдавайте, либо уж сами както там разберитесь орфографией и правописанием...
    Во-вторых если компонетну TIdMessage Вы уже положили на форму... (А вы должны это сделать и ктому же правильно заполнить его свойства), то к чему тогда у вас в коде вот эта строчка?
    Код (Delphi):
    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
     
  3. alex2000

    alex2000 Гость

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

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

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

    etc Гость

    кодировку поменять в теме, бат выкинуть.
     
  5. alex2000

    alex2000 Гость

    Бат выкинуть нельзя, а где кодировку поменять
     
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Бат выкидывать никуда не надо. Это как раз хорошо что именно БАТ.
    Проводим эксперимент. B)
    Делаем следующее:
    1. Запускаем бат, жмем создать письмо.
    2. Заполняем поля
    Код (Text):
                        ОТ: Вася <vasya@vasya.vv>
    Обратный адрес: Вася <vasya@vasya.vv>
    Кому: Вася <vasya@vasya.vv>
    Тема: Привет от Васи
    3. В теле письма пишем:
    Код (Text):
    Привет Вася,
    --
    Вася                         mailto:vasya@vasya.vv
    4. Жмем "Прикрепить файл" (выбираем vasya.jpg)
    5. Сохраняем письмо, выбираем его (в исходящих). Жмем "Сохранить как" (Выбираем формат "Привет Васе.MSG").
    6. Открываем файл в блокноте. Видим следующее:
    Код (Text):
    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. Чтобы почтовый клиент смог прочитать то что закодировано - добавляем управляющие операторы:
    Код (Text):
    Кодированная строка Subject:
    =?windows-1251?B?z/Do4uXyIO7yIMLg8eg=?=
    <=?> - начали кодирование
    <windows-1251?> - исходная кодировка текста
    <B?> - спрособ кодировки (B - значит base64)
    <z/Do4uXyIO7yIMLg8eg=> сам кодированный текст
    <?=> - конец кодированию (дальше идут некодированные символы)
    Вот. Осталось только реализовать выше сказанное.
    Реализуем:
    Код (Delphi):
    //...
    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;
    Проверяем:
    Код (Delphi):
    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:
     
  7. alex2000

    alex2000 Гость

    Да, все отправляется, но результат неутешительный. Приходит письмо с сабжем
    LUI+IEI1QUI+Mj41ID84QUw8Pg==
    Выходит Бат его назад не перекодирует, или в самом письме не указан тип перекодировки.
    Ладно - буду использовать транслит.
     
  8. etc

    etc Гость

    Бату место в корзине.
    Надо указывать правильную кодировку в теме сообщения, и да будет счастье.
     
  9. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Зачем же сразу транслит? :)
    Можно глянуть на текст приходящего "глючносабжевого" письма (слитого в MSG формат)?
    Похоже у вас действительно конфликт кодировок. (в заголовке письма указана одна, а на самом деле другая).
     
Загрузка...

Поделиться этой страницей