В прошлой статье про использование 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.