Как отправить письмо, используя 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;
Оправка писем всегда у меня вызывало большое затруднение. И я признаюсь честно мучился больше недели, пока сам пытался что то написать, отправить письмо. После того, как результат быль нулевым, стал искать ответ. Ваш пример мне помог.
Здравствуйте, Павел! Да, так бывает, что хочешь сам разобраться с Delphi и synapse, но не выходит. Хорошо, что этот материал был полезен вам!
А как мне сформировать и отправить письмо, в котором есть картинка? Или еще того пуще, анимация? Таким же способом не получится это сделать? Подскажите, если знаете ответ на этот вопрос. Буду сильно благодарна.
Светлана, можно это сделать добавив такой код:
MIMEPart := Msg.AddPartMultipart(‘alternate’,nil);
Msg.AddPartBinaryFromFile(FileName,MIMEPart);
FileName — путь к вашему файлу, MIMEPart — корневой элемент типа TMimePart. При этом MIME-тип для вложения определяется автоматически по расширению файла (FileName).
пытаюсь отправить многострочное сообщение, но он все переводит в одну строку.
Как с этим бороться?
Попробуйте отправить в HTML формате HTMLBody.
поковырялся немного сам, скорее всего у вас ошибка в исходнике:
в условии формат HTML пишется как текст и наоборот, то есть HTML в процедуру AddPartText, а TEXT в процедуру AddPartHTML.
Если не затруднит, исправьте пожалуйста, что бы последующие читатели не имели проблем. Спасибо ОГРОМНОЕ! Статья Ваша очень помогла.
Спасибо, Константин! Уже поменял местами методы AddPartText и AddPartHTML.
А на делфи 2010 работает? Добавил библиотеку через Browsing path, и всё равно при подключении вышеуказанных модулей не вилит их.
Николай, на 2010 Delphi не пробывал, на Delphi 7 точно работает, по крайней мере у меня.
Николай, Library Path прописать не забыли? Если нужно, могу протестировать на RAD Delphi XE7. На Delphi 7 у меня тоже замечательно работало.
Да) Действительно забыл… После того как прописал в 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, как указано в статье. Но, думаю, вряд ли в этом дело.
не должно иметь, но попробуйте прописать не прямые пути, а через переменные RAD. В Вашем случае без кавычек \$(BDS)\source\Win32. В качестве совета: Не используйте папки делфи, а создайте в папке 7.0 свою, предположим Components, а внутри нее Synapse, и туда положите все файлы. Тогда путь будет \$(BDS)\Components\Synapse. Если все равно ничего не выйдет, попробуйте запустить среду с правами Администратора. О результате просьба отписаться.
Только что запустил делфи от имени администратора, ничего не меняя — екзешник скомпилировался и запустился, но письмо не отправляется… Пробывал через mail и через яндекс.
Тут уже проблема в коде, нужно разбираться с исходником. Возможно не верно авторизуетесь. Последние 2 параметра внимательно проверьте, там где логин и пароль от почты. логин должен быть без домена, то есть без @mail.ru. Если ничего не выйдет — присылайте исходники на kooooos@mail.ru, посмотрим что можно поправить…