![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
taran |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Добрый день.
Подскажите, пожалуйста, как реализуется процесс отправки почты в среде С++ Builder. Хотелось бы, чтобы при нажатии кнопки отправлялось письмо с заданной темой через почтовый клиент (например, Outlook) на уже назначенный адрес. К письму должен быть прикреплён конкретный txt-файл, сформированный программой ранее. Заранее спасибо. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Скачай Drkb , и посмотри вот по этому пути: Интернет, Сети и Протоколы -> E-mail -> Как отправить Email? -> Использование COM-объекта Outlook
Код на Дельфи, но на Билдер перенести совсем не проблема... |
taran |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Спасибо за совет, я ознакомился, но не смог окончательно перевести в Билдер или подключить модуль Delphi из-за отсутствия библиотеки OUTLOOK_TLB и файла outlk80.
Поэтому, если у кого-то есть ещё советы, прошу мне помочь. |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
С Аутлуком вполне можно работать через Ole Automation:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const int olMailItem = 0;
Variant MSOApp = CreateOleObject("Outlook.Application");
try
{
Variant myItem = MSOApp.OleFunction("CreateItem", (Variant)olMailItem);
myItem.OlePropertySet("Subject", "This is the Subject");
myItem.OlePropertyGet("Recipients").OleFunction("Add", WideString("xxx@xxx.com")); // Здесь будет адрес
myItem.OlePropertySet("Body", (WideString)memoBody->Text);
Variant myAttachments = myItem.OlePropertyGet("Attachments");
myAttachments.OleFunction("Add", WideString("F:\\fam.txt")); // Здесь будет имя файла
myItem.OleProcedure("Send");
MSOApp.OleFunction("Quit");
}
catch(...)
{
ShowMessage(L"Ошибка при отправке почты");
}
}
Вроде нигде не ошибся, компиляцию проходит (BDS 2009), но запускать - не запускал, я MSOutlook не держу... На форме - одна кнопка и Мемо, в котором набирается сам текст сообщения. Только измени адрес на свой, когда будешь тестировать...При запуске тебя MSO может спросить, хочешь ли ты дать доступ программе к Аутлуку, и на какое время (я просто помню, раньше с таким сталкивался. А вот как решал проблему - не помню. Да и на Дельфи дело было, а не на Билдере). Дай доступ, и посмотри, отсылается ли вообще письмо, для начала... |
taran |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Спасибо.
|
taran |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Как известно, письма отправляются только при открытом Outlook, поэтому скажите, пожалуйста, можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
И ещё вопрос - можно ли как-то использовать аналогичный код для других почтовых клиентов (например, The Bat)? |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата можно ли как-то принудительно открыть приложение по нажатию кнопки отправки? Это не нужно, при попытке отправки письма Аутлук и так откроется. Я, кстати, код проверил. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. А чтоб не давать доступ - так не получится, ибо: http://support.microsoft.com/kb/821679 |
taran |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Это не нужно, при попытке отправки письма Аутлук и так откроется. Я спросил как раз по той причине, что он автоматически не открывается. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. Про доступ у меня вообще ничего не спрашивает, при открытом Outlook сразу отправляет. |
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Цитата Я спросил как раз по той причине, что он автоматически не открывается. Хорошо, зайдем с другой стороны. Что происходит у тебя если Аутлук не открыт? Я сейчас за компьютером с MSO, поэтому могу сделать скрины. Итак, MSO не запущен, жму кнопку в моем приложении, получаю:![]() Ставлю галку, оставляю 1 минуту, и жму "Yes". В лучших традициях MS получаю второе предупреждение: ![]() , с бегущим ProgressBar-ом... Дождался, пока станет активной кнопка "Yes", нажал - почта отправилась... Можно теперь узнать, что происходит у тебя? |
taran |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Можно теперь узнать, что происходит у тебя? При открытом Outlook: при нажатии "Отправить" в программе письмо автоматически отправляется, без всяких разрешений добавляясь сначала в "Исходящие", а затем - в "Отправленные". При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана" |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Неправда... Согласно коду - должно быть так: Variant MSOApp = CreateOleObject("Outlook.Application"); // Пытаемся создать новый Instance Аутлука
try
{
Создать новый Instance - значит "открыть". Если это не получается - это значит, что либо у тебя что-то с системой не то, либо Аутлук не установлен... Версия MSO какая? То, что я написал точно присутствует в Outlook XP (он же - Outlook 2002), и для предотвращения этих вопросов нужно использовать Redemption: СайтЦитата Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана" Чтобы IDE Билдера правильно обрабатывала исключения, надо это настроить... Билдер у тебя какой? В BDS 2009 это делается в Tools -> Options -> Debugger Options -> CodeGear Debuggers, там ставятся галки где нужно: в Language Exceptions снимается "Notify...", а в Native OS Exceptions переключатель Handled By переводится на User Program, а не на Debugger...Вообще, если делать программу совсем правильно, то это делается вот так: Variant MSOApp;
bool isRunning = false;
try
{
// Сначала проверяем, а вдруг Outlook уже запущен? Тогда к нему подключаемся...
MSOApp = GetActiveOleObject("Outlook.Application");
isRunning = true;
}
catch(EOleSysError &e)
{
try
{
// Не был запущен... Значит, запускаем:
MSOApp = CreateOleObject("Outlook.Application");
isRunning = true;
}
catch(...)
{
ShowMessage(L"Неудача: Ошибка подключения к MS Outlook");
}
}
catch(...)
{
ShowMessage(L"Неудача: Ошибка подключения к MS Outlook");
}
if(isRunning)
{ // здесь весь тот код, который я приводил выше, кроме инициализации Аутлука
|
taran |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Версия Outlook- 2007, Билдера - 6.
Что происходит при введении проверки "isRunning": даже если Outlook не запущен, эта переменная получает значение true благодаря этому куску: try
{
// Не был запущен... Значит, запускаем:
MSOApp = CreateOleObject("Outlook.Application");
isRunning = true;
}
Это я точно проверил. Выводится сообщение "Ошибка при отправке почты", значит, идёт ошибка на этапе формирования письма, а не открытия Outlook (хотя реально Аутлук не открывается, несмотря на то, что isRunning = true). |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата даже если Outlook не запущен, эта переменная получает значение true благодаря этому куску: Хм... У тебя что, Билдер глючит? Смотри: try
{
// Попытка запуска Outlook... Если запуск не удается -
// выбрасывается исключение, и следующая строка НЕ ВЫПОЛНЯЕТСЯ,
// программа сразу переходит в блок catch, то есть isRunning остается равным false...
MSOApp = CreateOleObject("Outlook.Application");
isRunning = true;
}
catch(...)
{
// Вот сюда переходим при неудаче в CreateOleObject !!!
ShowMessage(L"Неудача: Ошибка подключения к MS Outlook");
}
Проверь перед запуском программы в Task Manager-е, может у тебя есть в процессах Outlook.EXE?Добавлено через 7 мин. Кстати, а ты пробовал запускать EXE-шник отдельно, а не из Билдера? Попробуй... |
taran |
![]()
Сообщение
#14
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Смотри: try
{
// Попытка запуска Outlook... Если запуск не удается -
// выбрасывается исключение, и следующая строка НЕ ВЫПОЛНЯЕТСЯ,
// программа сразу переходит в блок catch, то есть isRunning остается равным false...
MSOApp = CreateOleObject("Outlook.Application");
isRunning = true;
}
catch(...)
{
// Вот сюда переходим при неудаче в CreateOleObject !!!
ShowMessage(L"Неудача: Ошибка подключения к MS Outlook");
}
Я понимаю, что если Outlook не запустился, то получим сообщение "Ошибка подключения к MS Outlook", поэтому и написал, что по мнению Билдера он запустился, а реально - нет. Процесса OUTLOOK.EXE перед запуском программы нет. При нажатии на кнопку "Отправить" этот процесс появляется, как и должен, но сразу вслед за этим появляется сообщение "Ошибка при отправке почты". Последний абзац как раз относится к запуску exe-файла. Сообщение отредактировано: taran - 1.02.2010 14:49 |
taran |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 11 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Кстати, подскажите ещё, пожалуйста, как называется параметр, отвечающий за отправку копии письма?
И где вообще можно ознакомиться с параметрами OLE-объектов и функций? |
volvo |
![]()
Сообщение
#16
|
Гость ![]() |
Цитата И где вообще можно ознакомиться с параметрами OLE-объектов и функций? В MSDN, где же еще? ![]() Вот объектная модель Outlook 2007 |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 9:30 |