Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отправка e-mail через программу [D7, WinXP]


MAxiMum ©   (2004-01-19 19:34:00) 

Не получается отправить сообщение, используя код в программе... MAPISendMail возвращает "Неизвестная ошибка" :). Посмотрите, пожалуйста, код. Может что подскажете.
// подготовить и отправить почтовое сообщение
function MAxSendEmail(Receiver, Title, MessageText:String; AttachmentPath: String = ''): Boolean;
var MapiMessage: TMapiMessage;
 MError:    Cardinal;
 Recipient:  TMapiRecipDesc;
 File_Attachment: TMapiFileDesc;
 Originator: TMapiRecipDesc;
begin
// Подготовить информацию отправителя
FillChar(Originator, SizeOf(Originator), 0);
Originator.ulRecipClass := MAPI_ORIG;
Originator.lpszName := 'vabank@inbox.ru';

// Подготовить информацию получателя
FillChar(Recipient, SizeOf(Recipient), 0);
Recipient.ulRecipClass := MAPI_TO;
Recipient.lpszName := PChar(Receiver);

//Подготовить информацию прикрепленного файла
if Trim(AttachmentPath) <> '' then
begin
FillChar(File_Attachment, SizeOf(File_Attachment), 0);
File_Attachment.nPosition := ULONG(-1);
File_Attachment.lpszPathName := PChar(AttachmentPath);
end;

//Сформировать сообщение
with MapiMessage do
begin
ulReserved := 0;
lpszSubject := PChar(Title);
lpszNoteText := PChar(MessageText);
lpszMessageType := nil;
lpszDateReceived := nil;
lpszConversationID := nil;
flFlags := 0;
lpOriginator := nil;
nRecipCount := 1;
lpRecips := @Recipient;
if Trim(AttachmentPath) <> '' then
 begin
 nFileCount := 1;
 lpFiles := @File_Attachment;
 end
else
 begin
 nFileCount := 0;
   lpFiles := nil;
 end;
end;

//Попробовать отправить сообщение
MError := MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
Result := MError = SUCCESS_SUCCESS;
if not Result then MAxShowError('Сообщение не было отправлено!');


MAxiMum   (2004-01-26 18:42:00) [1]

Что?


127.0.0.1   (2004-01-22 19:32:00) [2]

Удалено модератором


MAxiMum   (2004-01-22 09:16:00) [3]

MapiSendDocuments не хочется использовать, т.к. невозможно использовать body и даже, по-моему, тему.. но не суть.
Надо MapiSendMail использовать! Это уже очевидно.
Есть, конечно, два других варианта (zip-овать в один и использовать свой smtp-клиент). Но мне интересно пока найти ошибку, понять. Возможно, это мое слабое звено в понимании WinAPI.
Итак привожу изменненный откод, который я сделал для отправки нескольких файлов, но что у меня не вышло (ошибка №11 - не найден файл(ы) атачмента).
/ подготовить и отправить почтовое сообщение
function MAxSendEmail(Receiver, Title, MessageText:String; AttachmentPaths: Array of String): Boolean;
var MapiMessage: TMapiMessage;
 MError:    Cardinal;
 Recipient:  TMapiRecipDesc;
 File_Attachments: array of TMapiFileDesc;  CntFileAttachments: Integer; // количество вложений
 File_Attachment: TMapiFileDesc;
 Originator: TMapiRecipDesc;
 I: Integer; P: PChar;
begin
// Подготовить информацию отправителя
FillChar(Originator, SizeOf(Originator), 0);
Originator.ulRecipClass := MAPI_ORIG;
Originator.lpszName := 'vabank@inbox.ru';

// Подготовить информацию получателя
FillChar(Recipient, SizeOf(Recipient), 0);
Recipient.ulRecipClass := MAPI_TO;
Recipient.lpszName := PChar(Receiver);

//Подготовить информацию прикрепленного файла
CntFileAttachments := Length(AttachmentPaths);
SetLength(File_Attachments, CntFileAttachments);
// подготовим структуру для каждого файла
FillChar(File_Attachment, SizeOf(File_Attachment), 0);
File_Attachment.nPosition := ULONG(-1);
for i := 0 to CntFileAttachments - 1 do
begin
File_Attachment.lpszPathName := PChar(AttachmentPaths[i]); // посылаю полный путь (правда, в стандарте Windows, ничего? Например, C:\File.txt
File_Attachments[i] := File_Attachment;
end;

//Сформировать сообщение
with MapiMessage do
begin
ulReserved := 0;
lpszSubject := PChar(Title);
lpszNoteText := PChar(MessageText);
lpszMessageType := nil;
lpszDateReceived := nil;
lpszConversationID := nil;
flFlags := 0;
lpOriginator := @Originator;
nRecipCount := 1;
lpRecips := @Recipient;
nFileCount := CntFileAttachments;
lpFiles := @File_Attachments;
end;

//Попробовать отправить сообщение
MError := MapiSendMail(0, 0, MapiMessage, MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
Result := MError = SUCCESS_SUCCESS;
if not Result then MAxShowError('Сообщение не было отправлено!');
end;


Sacha   (2004-01-21 20:57:00) [4]

1. или попробовать задать список файлов FileAttach.lpszPathName подобно lpszFileNames (в MapiSendDocuments); не забыть nFileCount := <количество файлов>;
2. не уверен (не пробовал) задать маску в FileAttach.lpszPathName


Sacha   (2004-01-21 20:52:00) [5]

function MapiSendDocuments(
 ulUIParam: Cardinal;
 lpszDelimChar: LPSTR;
 lpszFilePaths: LPSTR;
 lpszFileNames: LPSTR;
 ulReserved: Cardinal
): Cardinal;

если не ошибаюсь


MAxiMum   (2004-01-21 20:35:00) [6]

2Sacha:
Спасибо! но мне надо НЕСКОЛЬКО ФАЙЛОВ вложить!!!


Sacha   (2004-01-21 19:47:00) [7]

var
 mapiMessage: TMapiMessage;
 FileAttach: TMapiFileDesc;
begin

 with mapiMessage do begin
   ...
   FillChar(FileAttach, SizeOf(FileAttach), 0);
   FileAttach.nPosition := Cardinal($FFFFFFFF);
   FileAttach.lpszPathName := PChar(FileName);

   nFileCount := 1;
   lpFiles := @FileAttach;
   ...
 end;

 ...
end;


MAxiMum   (2004-01-20 21:14:00) [8]

Помогите! Не может найти файлов, хотя прописываю полные пути!


MAxiMum   (2004-01-20 16:26:00) [9]

Нашел в чем ошибка: надо было убрать MAPI_DIALOG :((. Непоонятно только почему....

Другой вопрос: Как отправить несколько файлов (вложить в письмо)?


Эл   (2004-01-20 07:37:00) [10]

Как вариант: используя сокеты отправь по протоколу SMTP


MAxiMum   (2004-01-19 19:57:00) [11]

Никто не знает?


Наверх

Титульная страница Поиск, карта сайта Написать письмо