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

Библиотека Synapse в Delphi
image_pdfimage_print

Здравствуйте, дорогие посетители! Сегодня поговорим про отправку сообщений средствами 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' + '" <' + '[email protected]' + '>',
        '"' + 'ot_kogo' + '" <' + '[email protected]' + '>',
        'Содержимое письма в текстовом формате',
        '',
        'login_smtp', 'password_smtp') 
end;


Этот блог читают уже много людей
- читай и ТЫ!

0 ответы
  1. Паша
    Паша says:

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

    Ответить
  2. softmaker
    softmaker says:

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

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

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

    Ответить
  4. Softmaker
    Softmaker says:

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

    Msg.AddPartBinaryFromFile(FileName,MIMEPart);

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

    Ответить
  5. Косстантин
    Косстантин says:

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

    Ответить
  6. Константин
    Константин says:

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

    Ответить
  7. Николай
    Николай says:

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

    Ответить
  8. Softmaker
    Softmaker says:

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

    Ответить
  9. Константин
    Константин says:

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

    Ответить
  10. Николай
    Николай says:

    Да) Действительно забыл… После того как прописал в 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, как указано в статье. Но, думаю, вряд ли в этом дело.

    Ответить
  11. Константин
    Константин says:

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

    Ответить
  12. Николай
    Николай says:

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

    Ответить
  13. Константин
    Константин says:

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

    Ответить

Ответить

Want to join the discussion?
Feel free to contribute!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *