Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Outlook Express


Автор: mrBlood 4.6.2002, 09:48
Здравствуйте!

При написании своей программы столкнулся со следующей проблемой. Нужно из программы отправить письмо с прицепленным к нему файлом через установленный по умолчанию почтовый клиент. Эта функция должна работать по возможности через любые почтовые программы.
Через ShellExecute насколько я понимаю прицепить файл нельзя.
Пробовал через MAPI. Долго переписывался с Еленой Филиповой из Королевства Делфи по этому поводу. В конце концов выяснилось, что через MAPI Outlook Express работать не хочет.

Не подскажет ли кто как решить мою проблему? Если можно то пришлите пример.

Автор: Song 4.6.2002, 09:52
Фигня всё это.. Ещё как хочет и может.

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988622975&n=14
http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988621410&n=20

Автор: Vit 4.6.2002, 15:45
Outlook Express ты использовать на прямую не сможешь, это точно, у него нет ни COM интерфейса(как у Outlook), ни API. У тебя есть следующие фарианты:
1) Использовать MAPI (пример привел Song в предыдущем сообщении)
2) Использовать SMTP - там все просто
3) Использовать COM интерфейс Outlook - там тоже все просто, я даже постил где-то пример
4) Писать свой SMTP Relay сервер и отсылать email напрямую, минуя любые сервера.

Автор: Vit 4.6.2002, 17:43
Пример с delphi.mastak.ru мне понравился(который нашел song), я решил его сюда скопировать, может кому понадобится:


Код

unit Email;
interface
uses Windows, SusUtils, Classes;
function SendEmail(const RecipName, RecipAddress, Subject, Attachment: string): Boolean;
function IsOnline: Boolean;
implementation
uses Mapi;
function SendEmail(const RecipName, RecipAddress, Subject, Attachment: string): Boolean;
var
 MapiMessage: TMapiMessage;
 MapiFileDesc: TMapiFileDesc;
 MapiRecipDesc: TMapiRecipDesc;
 i: integer;
 s: string;
begin
 with MapiRecipDesc do begin
     ulRecerved:= 0;
     ulRecipClass:= MAPI_TO;
     lpszName:= PChar(RecipName);
     lpszAddress:= PChar(RecipAddress);
     ulEIDSize:= 0;
     lpEntryID:= nil;
 end;
 with MapiFileDesc do begin
     ulReserved:= 0;
     flFlags:= 0;
     nPosition:= 0;
     lpszPathName:= PChar(Attachment);
     lpszFileName:= nil;
     lpFileType:= nil;
 end;
 with MapiMessage do begin
     ulReserved := 0;
     lpszSubject := nil;
     lpszNoteText := PChar(Subject);
     lpszMessageType := nil;
     lpszDateReceived := nil;
     lpszConversationID := nil;
     flFlags := 0;
     lpOriginator := nil;
     nRecipCount := 1;
     lpRecips := @MapiRecipDesc;
     if length(Attachment) > 0 then begin
         nFileCount:= 1;
         lpFiles := @MapiFileDesc;
     end else begin
         nFileCount:= 0;
         lpFiles:= nil;
     end;
   end;
 Result:= MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG
or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0) = SUCCESS_SUCCESS;
end;
function IsOnline: Boolean;
var
 RASConn: TRASConn;
 dwSize,dwCount: DWORD;
begin
 RASConns.dwSize:= SizeOf(TRASConn);
 dwSize:= SizeOf(RASConns);
 Res:=RASEnumConnectionsA(@RASConns, @dwSize, @dwCount);
 Result:= (Res = 0) and (dwCount > 0);
end;
end.

Автор: Song 4.6.2002, 18:20
Вы его в фак скопируйте или ссылу на мастаков.

Автор: Vit 4.6.2002, 18:55
Цитата(Song @ 04.6.2002, 10:20)
Вы его в фак скопируйте или ссылу на мастаков.

Я копирую все регулярно, но даю "отлежаться" кодам и ответам несколько недель в форуме на случай если кто найдет ошибки или предложит какие варианты. А по поводу прошивания ссылок на другие ресурсы - это не ко мне, это к хозяивам форума, все-таки реклама чужих ресурсов вопрос деликатного свойства. Впрочем даже если не учитывать рекламу, я за то чтобы копировать сюда полезности, вместо хранения ссылок - надежнее, ресурс в сети может исчезнуть, поменяться, поменять хостинг, URL  и т.п...

Автор: neutrino 4.6.2002, 20:00
А я, кастати, поместил на некоторых ответах (на которых, был явный автор) ссылки на места, откуда они были взяты. Уж точно ничего рекламировать не хотел. Правда некоторые авторы (тот же известный SunTexx [Song его точно знает]) просят, чтоб поместили ссылку на исходное место. Так что выбор таков: или помешать ссылку, или не помешать вообше. Если я сделал ошибку, поместив эти ссылки, то могу удалить все сообшения их содержашие.

Автор: Vit 4.6.2002, 20:05
Если я что-то понимаю в копирайте, то на защищенной копирайтом странице должно быть указано, что информация защищена авторским правом и не может быть опубликована без ведома автора, в противном случае по-моему ссылки на источник должно быть достаточно для возможности копирования или я не прав?

Автор: mrBlood 5.6.2002, 09:10
Спасибо всем, кто прислал ответы на мой вопрос.

По поводу примера, который нашел song. Я попробовал его использовать.
Во-первых, нашел в нем несколько мелких ошибок: SusUtils вместо SysUtils, ulRecerved вместо ulReserved.
Во-вторых, мне не понятно назначение функции IsOnline, ее что нужно вызывать перед вызовом функции SendEmail? Кроме того на строку
RASConn: TRASConn;
компилятор выдает ошибку, что не знает такого класса TRASConn. Нет ли здесь тоже какой ошибки и где этот класс описан?
В-третьих, попробовал наконец использовать саму функцию SendEmail:
SendEmail('Фирма', '[email protected]', 'заказ', 'D:\order.txt')
и получил при ее выполнении ошибку MAPI_USER_ABORT.

Нашел в Инете исходники компонента для отправки e-mail через MAPI, с ним вылазиет та же самая ошибка.

Что я делаю не правильно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)