Как отправить письмо, используя Delphi с помощью библиотеки Synapse?

Здравствуйте, дорогие посетители! Сегодня поговорим про отправку сообщений средствами Delphi. До этого была написана заметка о том, как с помощью Delphi получить значения всех элементов Edit диалога формы. В двух статьях было описано, как получить с помощью Delphi IP-адрес тут и тут. А теперь перейдем к нашему вопросу.

Начнём с того, что скачаем библиотеку Synapse отсюда: synapse.ararat.cz/doku.php. Распакуем библиотеку во временный каталог. Создадим каталог D:\Delphi\Synapse\. Будет лучше, если названия каталогов содержат латинские символы и без пробелов. Скопируем содержимое каталога source\lib из распакованного архива в каталог D:\Delphi\Synapse\. Теперь установим библиотеку Synapse.

Если у Вас Delphi 5-7, тогда:

  • File -> Close All.
  • Tools -> Enviroment Options. В появившемся диалоге находим закладку Library.
  • Найдём надпись Browsing path. Нажимаем на кнопку с тремя точками […] справа от него.
  • В появившемся диалоге находим кнопку с тремя точками […]. Нажимаем на эту кнопку, выйдет окно для выбора каталога, находим наш каталог D:\Delphi\Synapse\, выбираем его и нажимаем на кнопку OK.
  • Добавим выбранный каталог, нажав Add и ОК для закрытия окна.
  • Теперь для надписи Library Path.
  • Найдём надпись Library Path. Нажимаем на кнопку с тремя точками […] справа от него.
  • В появившемся диалоге находим кнопку с тремя точками […]. Нажимаем на эту кнопку, выйдет окно для выбора каталога, находим наш каталог D:\Delphi\Synapse\, выбираем его и нажимаем на кнопку OK.
  • Добавим выбранный каталог, нажав Add и ОК для закрытия окна.

Для Delphi 2006-2007 это делается так:

  • File -> Close All.
  • Tools -> Options. В появившемся диалоге в дереве слева находим
    Environment options -> Delphi Options -> Library – Win32.
  • Найдём надпись Browsing path. Нажимаем на кнопку с тремя точками […] справа от него.
  • В появившемся диалоге находим кнопку с тремя точками […]. Нажимаем на эту кнопку, выйдет окно для выбора каталога, находим наш каталог D:\Delphi\Synapse\, выбираем его и нажимаем на кнопку OK.
  • Добавим выбранный каталог, нажав Add и ОК для закрытия окна.
  • Теперь для надписи Library Path.
  • Найдём надпись Library Path. Нажимаем на кнопку с тремя точками […] справа от него.
  • В появившемся диалоге находим кнопку с тремя точками […]. Нажимаем на эту кнопку, выйдет окно для выбора каталога, находим наш каталог D:\Delphi\Synapse\, выбираем его и нажимаем на кнопку OK.
  • Добавим выбранный каталог, нажав Add и ОК для закрытия окна.

Приступим к написанию кода по отправке почтового сообщения. Создадим новый проект. Для того, чтобы отправить письмо необходимо использовать протокол smtp. В библиотеке Synapse есть необходимые для этого модули smtpsend, mimemess, mimepart. Подключим эти библиотеки:

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, httpsend, mimemess, mimepart, smtpsend;

Напишем следующую процедуру:

Procedure SendMail (Host, Subject, pTo, From , TextBody, 
				HTMLBody, login,password : string);
var Msg : TMimeMess; // сообщение
    StringList : TStringList; // содержимое письма
    MIMEPart : TMimePart; // части сообщения (на будущее)
begin
  Msg := TMimeMess.Create; // создаем новое сообщение
  StringList := TStringList.Create;
  try
	// Добавляем заголовки
    Msg.Header.Subject := Subject;// тема сообщения
    Msg.Header.From := From; // имя и адрес отправителя
    Msg.Header.ToList.Add(pTo); // имя и адрес получателя
	// создаем корневой элемент
    MIMEPart := Msg.AddPartMultipart('alternative', nil);
    if length(TextBody)=0 then 
	// если формат HTML
      begin 
        StringList.Text := HTMLBody;
        Msg.AddPartHTML(StringList, MIMEPart);
      end
    else
	// если текстовый формат
      begin 
        StringList.Text := TextBody;
        Msg.AddPartText(StringList, MIMEPart);
      end;
	// Кодируем и отправляем
    Msg.EncodeMessage;
	// Отправляем.
    if smtpsend.SendToRaw(From,pTo,Host,Msg.Lines,login,password) then 
        ShowMessage('Письмо отправлено')
    else
        ShowMessage('Письмо не отправлено'); 
 finally
   Msg.Free;
   StringList.Free;
 end;
end;

Бросим на форму кнопку и пропишем в обработчике события следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
    SendMail('smtp.yandex.ru',
        'Тема тестового письма',
        '"' + 'komu_pismo' + '" <' + 'komu@pismo.com' + '>',
        '"' + 'ot_kogo' + '" <' + 'otkogo@pismo.ru' + '>',
        'Содержимое письма в текстовом формате',
        '',
        'login_smtp', 'password_smtp') 
end;
  1. Паша говорит:

    Оправка писем всегда у меня вызывало большое затруднение. И я признаюсь честно мучился больше недели, пока сам пытался что то написать, отправить письмо. После того, как результат быль нулевым, стал искать ответ. Ваш пример мне помог.

  2. softmaker говорит:

    Здравствуйте, Павел! Да, так бывает, что хочешь сам разобраться с Delphi и synapse, но не выходит. Хорошо, что этот материал был полезен вам!

  3. Орехова Светлана говорит:

    А как мне сформировать и отправить письмо, в котором есть картинка? Или еще того пуще, анимация? Таким же способом не получится это сделать? Подскажите, если знаете ответ на этот вопрос. Буду сильно благодарна.

  4. Softmaker говорит:

    Светлана, можно это сделать добавив такой код:
    MIMEPart := Msg.AddPartMultipart(‘alternate’,nil);

    Msg.AddPartBinaryFromFile(FileName,MIMEPart);

    FileName — путь к вашему файлу, MIMEPart — корневой элемент типа TMimePart. При этом MIME-тип для вложения определяется автоматически по расширению файла (FileName).

  5. Косстантин говорит:

    пытаюсь отправить многострочное сообщение, но он все переводит в одну строку.
    Как с этим бороться?

  6. Softmaker говорит:

    Попробуйте отправить в HTML формате HTMLBody.

  7. Константин говорит:

    поковырялся немного сам, скорее всего у вас ошибка в исходнике:
    в условии формат HTML пишется как текст и наоборот, то есть HTML в процедуру AddPartText, а TEXT в процедуру AddPartHTML.
    Если не затруднит, исправьте пожалуйста, что бы последующие читатели не имели проблем. Спасибо ОГРОМНОЕ! Статья Ваша очень помогла.

  8. Softmaker говорит:

    Спасибо, Константин! Уже поменял местами методы AddPartText и AddPartHTML.

  9. Николай говорит:

    А на делфи 2010 работает? Добавил библиотеку через Browsing path, и всё равно при подключении вышеуказанных модулей не вилит их.

  10. Softmaker говорит:

    Николай, на 2010 Delphi не пробывал, на Delphi 7 точно работает, по крайней мере у меня.

  11. Константин говорит:

    Николай, Library Path прописать не забыли? Если нужно, могу протестировать на RAD Delphi XE7. На Delphi 7 у меня тоже замечательно работало.

  12. Николай говорит:

    Да) Действительно забыл… После того как прописал в library pas папку со скаченной библиотекой synapse модули подключились. Только экзешник не компилируется — пишет невозможно создать файл:
    [DCC Fatal Error] synafpc.pas(151): F2039 Could not create output file ‘C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32\synalist-code-192-trunk\synafpc.dcu’
    И открывает мне на новой вкладк этот файл: synafpc.dcu
    Папку со скаченной библиотекой я поместил в папку с другими библиотеками Win 32 делфи:
    C:\Program Files (x86)\Embarcadero\RAD Studio\7.0\source\Win32. А не в D:\Delphi\Synapse, как указано в статье. Но, думаю, вряд ли в этом дело.

  13. Константин говорит:

    не должно иметь, но попробуйте прописать не прямые пути, а через переменные RAD. В Вашем случае без кавычек \$(BDS)\source\Win32. В качестве совета: Не используйте папки делфи, а создайте в папке 7.0 свою, предположим Components, а внутри нее Synapse, и туда положите все файлы. Тогда путь будет \$(BDS)\Components\Synapse. Если все равно ничего не выйдет, попробуйте запустить среду с правами Администратора. О результате просьба отписаться.

  14. Николай говорит:

    Только что запустил делфи от имени администратора, ничего не меняя — екзешник скомпилировался и запустился, но письмо не отправляется… Пробывал через mail и через яндекс.

  15. Константин говорит:

    Тут уже проблема в коде, нужно разбираться с исходником. Возможно не верно авторизуетесь. Последние 2 параметра внимательно проверьте, там где логин и пароль от почты. логин должен быть без домена, то есть без @mail.ru. Если ничего не выйдет — присылайте исходники на kooooos@mail.ru, посмотрим что можно поправить…