В прошлой статье про использование Synapse для отправки писем мы разработали простенькое приложение для отправки текстового сообщения на e-mail.  Сегодня доработаем процедуру отправки письма, а именно, сделаем возможность отпраки на e-mail любых файлов (вложений).
Вкратце напомню содержание предыдущей статьи по Synapse и SMTP. Для работы с электронной почтой мы использовали следующие модули библиотеки: smtpsend, mimemess и mimepart.
Отправка писем происходила по следующей схеме:
- Создавался объект TMimeMess для которого в заголовках указывались тема письма, адрес отправителя и адреса получателей
- Далее для объекта TMimeMess создавался корневой элемент сообщения, имеющий тип TMimePart 
- В TMimePart добавлялся либо текст, либо HTML-код
- Последовательно вызывались два метода: метод объекта 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.