[Delphi] Создать в почтовой программе письмо и вложить файл.



А вообще пусть сходит на www.drkb.ru и скачает FAQ.
Вообще несколько кривовато сделано, но идея думаю ясна.
Автор: Eddie Shipman
Пример использует VB Script для Outlook, который позволяет произвести такую операцию.
Создаётся OLE-объект - 'Outlook.Application' и в него передаётся скрипт.
Совместимость: все версии Delphi
Измените recipirecipienthost.com на Ваш собственный e-mail
адресс. У Вас должен быть проинсталирован Outlook,
{Я не уверен, что это будет работать в Outlook Express.}
Примечание Vit: Это точно не будет работать в Outlook Express
uses ComObj; {Delphi 5}
procedure TForm1.Button1Click(Sender: TObject);
Const
// константы OlItemType
olMailItem = 0;
olAppointmentItem = 1;
olContactItem = 2;
olTaskItem = 3;
olJournalItem = 4;
olNoteItem = 5;
olPostItem = 6;
// константы OlAttachmentType
olByValue = 1;
olByReference = 4;
olEmbeddedItem = 5;
olOLE = 6;
var
myOlApp, myItem, myRecipient, myAttachments: OleVariant;
begin
// файл VBScript для создания почтового сообщения и прикрепления к нему файла
myOlApp := CreateOLEObject('Outlook.Application');
myItem := myOlApp.CreateItem(olMailItem);
myItem.Subject := 'This is the Subject';
myRecipient := myItem.Recipients.Add('recipirecipienthost.com');
myItem.Body := #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + 'Hello,' + #13;
myItem.Body := myItem.Body + 'This code created this message and '+
' sent it and I didn''t even have' + #13;
myItem.Body := myItem.Body + 'to click the send button!' + #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + 'If you have any more problems, let me know' +
#13;
myItem.Body := myItem.Body + 'rename to blah.vbs and run like this:' + #13;
myItem.Body := myItem.Body + 'wscript c:\blah.vbs' + #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + 'Eddie' + #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + 'const'+ #13;
myItem.Body := myItem.Body + ' // константы OlItemType'+ #13;
myItem.Body := myItem.Body + ' olMailItem = 0;'+ #13;
myItem.Body := myItem.Body + ' olAppointmentItem = 1;'+ #13;
myItem.Body := myItem.Body + ' olContactItem = 2;'+ #13;
myItem.Body := myItem.Body + ' olTaskItem = 3;'+ #13;
myItem.Body := myItem.Body + ' olJournalItem = 4;'+ #13;
myItem.Body := myItem.Body + ' olNoteItem = 5;'+ #13;
myItem.Body := myItem.Body + ' olPostItem = 6;'+ #13;
myItem.Body := myItem.Body + ' // OlAttachmentType constants'+ #13;
myItem.Body := myItem.Body + ' olByValue = 1;'+ #13;
myItem.Body := myItem.Body + ' olByReference = 4;'+ #13;
myItem.Body := myItem.Body + ' olEmbeddedItem = 5;'+ #13;
myItem.Body := myItem.Body + ' olOLE = 6;'+ #13;
myItem.Body := myItem.Body + #13;
myItem.Body := myItem.Body + 'var'+ #13;
myItem.Body := myItem.Body + ' myOlApp, myItem, myRecipient, myAttachments:
OleVariant;'+ #13;
myItem.Body := myItem.Body + 'begin'+ #13;
myItem.Body := myItem.Body + ' myOlApp :=
CreateObject(''Outlook.Application'')' + #13;
myItem.Body := myItem.Body + ' myItem := myOlApp.CreateItem(olMailItem)' +
#13;
myItem.Body := myItem.Body + ' myItem.Subject := ''This is the Subject''' +
#13;
myItem.Body := myItem.Body + ' myItem.Body := ''This is the body''' + #13;
myItem.Body := myItem.Body + ' myRecipient := myItem.Recipients.Add
('recipirecipienthost.com')' + #13;
myItem.Body := myItem.Body + ' myAttachments := myItem.Attachments' + #13;
myItem.Body := myItem.Body + ' // Теперь прикрепим файлы...' + #13;
myItem.Body := myItem.Body + ' myAttachments.Add ''C:\blah.txt'', olByValue,
1, ''Blah.txt Attachment''' + #13;
myItem.Body := myItem.Body + ' myItem.Send' + #13;
myItem.Body := myItem.Body + ' myOlApp := VarNull;' + #13;
myItem.Body := myItem.Body + ' myItem := VarNull;' + #13;
myItem.Body := myItem.Body + ' myRecipient := VarNull;' + #13;
myItem.Body := myItem.Body + ' myAttachments := VarNull;' + #13;
myItem.Body := myItem.Body + 'end;' + #13;
// Теперь прикрепим файлы...
myAttachments := myItem.Attachments;
myAttachments.Add('C:\blah.txt', olByValue, 1, 'Blah.txt Attachment');
myItem.Send
myOlApp := VarNull;
myItem := VarNull;
myRecipient := VarNull;
myAttachments := VarNull;
End;
Здесь конечно завязка на OutLook. У меня с ним беседа ушла в сторону создания письма назвисимо от почтового клиента.
Хотя особой проблемы с OutLook нет. В компании это клиент ставится всем по умолчанию.
Хотя сам бы через MAPI наверно писал или вообще через сокеты - разумеется при наличии времени.
1. OLE - как правило ненадежная технология
2. Жесткая привязка только к одному из клиентов.
Лови исходник из моих архивов, правда без атача. но я думаю несколько строчек можно и самому написать
function SendEMail(ParentWND: HWND;
const MailAddress, MailSubject, MailBody: string): UInt;
var
MAPIMsg: TMapiMessage;
MAPIFiles: TMapiFileDesc;
MAPIRecip: TMapiRecipDesc;
S, RecipName, RecipAddr: string;
I, NItems: integer;
//MError: UInt;
MAPIFlags: Uint;
AttachedFiles: string;
ResStr : String;
begin
//Result:= false;
MAPIFlags := MAPI_LOGON_UI; // to create account if needed;
{ MAPIFlags := MAPIFlags or MAPI_NEW_SESSION;}
MAPIFlags := MAPIFlags or MAPI_DIALOG; // display new message window (default)
FillChar(MAPIMsg, SizeOf(MAPIMsg #0);
with MAPIMsg do
begin
lpszNoteText := PChar(MailBody);
lpszSubject := PChar(MailSubject);
end;
//Fill addresses
if MailAddress <> '' then
begin
FillChar(MAPIRecip, SizeOf(MAPIRecip 0);
MAPIRecip.ulRecipClass:= MAPI_TO;
MAPIRecip.lpszName:= PChar(MailAddress);
end;
MAPIMsg.nRecipCount:= 1;
MAPIMsg.lpRecips:= @MAPIRecip;
try
Result := MapiSendMail(0, Application.Handle
{ID:17363; - not HWindow(Self)!
otherwise Outlook Express is not functioning properly!},
MAPIMsg, MAPIFlags, 0);
except
Result := MAPI_E_FAILURE;
end;
case Result of
MAPI_E_AMBIGUOUS_RECIPIENT : ResStr := 'A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set. No message was sent.';
MAPI_E_ATTACHMENT_NOT_FOUND : ResStr := 'The specified attachment was not found; no message was sent.';
MAPI_E_ATTACHMENT_OPEN_FAILURE : ResStr := 'The specified attachment could not be open; no message was sent.';
MAPI_E_BAD_RECIPTYPE : ResStr := 'The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.';
MAPI_E_FAILURE : ResStr := 'One or more unspecified errors occurred; no message was sent.';
MAPI_E_INSUFFICIENT_MEMORY : ResStr := 'There was insufficient memory to proceed. No message was sent.';
MAPI_E_LOGIN_FAILURE : ResStr := 'There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed. No message was sent.';
MAPI_E_TEXT_TOO_LARGE : ResStr := 'The text in the message was too large to sent; the message was not sent.';
MAPI_E_TOO_MANY_FILES : ResStr := 'There were too many file attachments; no message was sent.';
MAPI_E_TOO_MANY_RECIPIENTS : ResStr := 'There were too many recipients; no message was sent.';
MAPI_E_UNKNOWN_RECIPIENT : ResStr := 'A recipient did not appear in the address list; no message was sent.';
MAPI_E_USER_ABORT : ResStr := 'The user canceled the process; no message was sent.';
SUCCESS_SUCCESS : ResStr := 'MAPISendMail successfully sent the message.';
end;
if Result <> SUCCESS_SUCCESS then
Application.MessageBox(PChar(GS('sRegisterClientError')+
+ ResStrPChar(sVer MB_OK+MB_ICONERROR);
end;
ShellExecute(Handle,"open","mailto:microsoft.com?Subject=Bug report&Body=description&Attach=c:\\autoexec.bat",0,0,SW_SHOWDEFAULT);
1. OLE - как правило ненадежная технология1. Ну фиг знает. Сам для OLE программил тока на WSH - технология понравилась.
2. Жесткая привязка только к одному из клиентов.
2. Ну поскольку пишем под Windows, то OutlookExpress почти всегда есть

Кстати внимательно присмотрелся к ТЗ - проблемма действительно есть в том, что надо использовать клиента по умолчанию (а это может быть что угодно) - Bat и Lotus через OLE я думаю сделаны, так что и под них можно написать. Создание письма с текстом в проге по умолчанию - действительно не вопрос - это просто вызов через напр ShellExecute 'malto:bla-bla-bla'
2. 4erez OLE pridetsya delat' svoi kod dlya kazhogo clienta
3. MAPI ispol'zuet clienta po umol4aniu i sovmestim s bol'shinsntom clientov

code:ShellExecute(Handle,"open","mailto:microsoft.com?Subject=Bug report&Body=description&Attach=c:\\autoexec.bat",0,0,SW_SHOWDEFAULT);Программисты - народ ленивый. Он, скорее всего, выберет этот вариант.

ботай MAPI
http://www.delphipages.com/threads/thread.cfm?ID=163734&...
юзать через ОЛЕ - отстой
Спасибо за ссылку.
ShellExecute(Handle,"open","mailto:microsoft.com?Subject=Bug report&Body=description&Attach=c:\\autoexec.bat",0,0,SW_SHOWDEFAULT);
Уверен, что так вот просто можно файл приложить?
У тебя это где-нибудь работает?
&Attachments=c:\\autoexec
У меня Lotus - это не работает.
По идее это только для OutLook должно работать.
Прекрасно отрабатыет и в Lotus

1. Dlya Outlook mozhno sdelat' attach 4erez ShellExecute(..mailto:...) - sm. vyzhe
Подождем автора этих строк.
вложение через командную строку поддерживается только для outlook только для версии office 2000
вложение через командную строку поддерживается только для outlook только для версии office 2000Да уж... тогда предложенный вариант решением назвать сложно.
Оставить комментарий
Boris1980
Хочется чтоб по кнопке в программе (разрабатывается на Delphi) в почтовой программе по умолчанию на машине клиента создавалось (открывалось) новое письмо и в него был вложен файл. Програмист утверждает, что письмо создать и заполнить можно без проблем. А вот вложить в него файл никак нельзя.Вроде такая вещь, на мой взгляд, простая. Неужели нет никаких библиотек по работе с почтой в этом ключе?
ps: Поясню. Программирую не я, я ставлю ТЗ.