Synapse в Delphi. Отправка писем с вложениями

Источник: webdelphi

В прошлой статье про использование Synapse для отправки писем мы разработали простенькое приложение для отправки текстового сообщения на e-mail.  Сегодня доработаем процедуру отправки письма, а именно, сделаем возможность отпраки на e-mail любых файлов (вложений).

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

Отправка писем происходила по следующей схеме:

  1. Создавался объект TMimeMess для которого в заголовках указывались тема письма, адрес отправителя и адреса получателей
  2. Далее для объекта TMimeMess создавался корневой элемент сообщения, имеющий тип TMimePart
  3. В TMimePart добавлялся либо текст, либо HTML-код
  4. Последовательно вызывались два метода: метод объекта TMimeMess для кодирования письма - EncodeMessage и метод SendToRaw для отправки сообщения.

Сегодня немного расширим функциональность нашего приложения и отправим на почту вместе с текстом любой файл.

Для добавления в тело сообщения файлов в Synapse предусмотрены следующие методы объекта TMimeMess:

1
function AddPartBinary(const Stream: TStream; const FileName: string; const PartParent: TMimePart): TMimepart;
 

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

1
function AddPartBinaryFromFile(const FileName: string; const PartParent: TMimePart): TMimepart;
 

Также добавляет вложение как и AddPartBinary, но, в отличие от предыдущего метода не требует указания потока с данными. MIME-тип определяется автоматически.

Воспользуемся вторым методом, т.е. AddPartBinaryFromFile и отправим на почту, например, изображение.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Procedure SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
    var tmpMsg : TMimeMess;
        tmpStringList : TStringList;
        tmpMIMEPart : TMimePart;
begin
    tmpMsg := TMimeMess.Create;
    tmpStringList := TStringList.Create;
    try
        // Headers
        tmpMsg.Header.Subject := pSubject;
        tmpMsg.Header.From := pFrom;
        tmpMsg.Header.ToList.Add(pTo);
 
        // MIMe Parts
        tmpMIMEPart := tmpMsg.AddPartMultipart('alternate',nil);
 
        if length(pTextBody)>0 then
           begin
             tmpStringList.Text := pTextBody;
             tmpMsg.AddPartText(tmpStringList, tmpMIMEPart);
           end
        else
          begin
            tmpStringList.Text := pHTMLBody;
            tmpMsg.AddPartHTML(tmpStringList, tmpMIMEPart);
          end;
 
        if Form1.Edit1.Text<>'' then
            tmpMsg.AddPartBinaryFromFile(Form1.Edit1.Text,tmpMIMEPart)
        // кодируем и отправляем
        tmpMsg.EncodeMessage;
        smtpsend.SendToRaw(pFrom, pTo, pHost, tmpMsg.Lines, 'login', 'password');
 
    finally
        tmpMsg.Free;
        tmpStringList.Free;
    end;
end;

Мы добавили в процедуру всего две строки кода:

1
2
if Form1.Edit1.Text<>'' then
tmpMsg.AddPartBinaryFromFile(Form1.Edit1.Text,tmpMIMEPart)

Для того, чтобы отправить на почту файл. При этом указали корневой элемент tmpMIMEPart: TMimePart.
Аналогичным образом в письмо можно добавить любое количество, любых файлов. Остается только добавить, что в Synapse автоматически распознаются следующие MIME-типы и подтипы (по расширению файла):

Расширение  Тип  Подтип 
AU audio basic
MP2 mpeg
MP3 mpeg
RA x-realaudio
SND basic
WAV x-wav
MID midi
AVI video x-msvideo
MOV quicktime
MPEG MPEG
MPG MPEG
QT quicktime
DOC application MSWord
EPS Postscript
PS Postscript
RTF RTF
PDF PDF
WPD Wordperfect5.1
ZIP ZIP
BMP image BMP
GIF GIF
JPEG JPEG
JPG JPEG
PNG PNG
TIF TIFF
TIFF TIFF

Для всех остальных файлов выставляется тип application с подтипом octet-stream. Если есть желание добавить в библиотеку распознавание других типов файлов, то дополните массив констант MimeType в модуле mimepart.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=23721