Добрый день. Подскажите, пожалуйста, как реализуется процесс отправки почты в среде С++ Builder.
Хотелось бы, чтобы при нажатии кнопки отправлялось письмо с заданной темой через почтовый клиент (например, Outlook) на уже назначенный адрес. К письму должен быть прикреплён конкретный txt-файл, сформированный программой ранее.
Заранее спасибо.
volvo
30.01.2010 15:09
Скачай Drkb , и посмотри вот по этому пути: Интернет, Сети и Протоколы -> E-mail -> Как отправить Email? -> Использование COM-объекта Outlook
Код на Дельфи, но на Билдер перенести совсем не проблема...
taran
31.01.2010 1:09
Спасибо за совет, я ознакомился, но не смог окончательно перевести в Билдер или подключить модуль Delphi из-за отсутствия библиотеки OUTLOOK_TLB и файла outlk80.
Поэтому, если у кого-то есть ещё советы, прошу мне помочь.
volvo
31.01.2010 1:51
С Аутлуком вполне можно работать через Ole Automation:
void __fastcall TForm1::Button1Click(TObject *Sender) { const int olMailItem = 0;
myItem.OlePropertySet("Subject", "This is the Subject"); myItem.OlePropertyGet("Recipients").OleFunction("Add", WideString("xxx@xxx.com")); // Здесь будет адрес
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
31.01.2010 12:05
Спасибо.
taran
31.01.2010 15:00
Как известно, письма отправляются только при открытом Outlook, поэтому скажите, пожалуйста, можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
И ещё вопрос - можно ли как-то использовать аналогичный код для других почтовых клиентов (например, The Bat)?
volvo
31.01.2010 22:14
Цитата
можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
Это не нужно, при попытке отправки письма Аутлук и так откроется. Я, кстати, код проверил. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. А чтоб не давать доступ - так не получится, ибо: http://support.microsoft.com/kb/821679
taran
1.02.2010 0:47
Цитата(volvo @ 31.01.2010 22:14)
Это не нужно, при попытке отправки письма Аутлук и так откроется.
Я спросил как раз по той причине, что он автоматически не открывается.
Цитата(volvo @ 31.01.2010 22:14)
Если давать доступ программе к Аутлуку, то все прекрасно отсылается.
Про доступ у меня вообще ничего не спрашивает, при открытом Outlook сразу отправляет.
volvo
1.02.2010 1:55
Цитата
Я спросил как раз по той причине, что он автоматически не открывается.
Хорошо, зайдем с другой стороны. Что происходит у тебя если Аутлук не открыт? Я сейчас за компьютером с MSO, поэтому могу сделать скрины. Итак, MSO не запущен, жму кнопку в моем приложении, получаю: Нажмите для просмотра прикрепленного файла Ставлю галку, оставляю 1 минуту, и жму "Yes". В лучших традициях MS получаю второе предупреждение: Нажмите для просмотра прикрепленного файла , с бегущим ProgressBar-ом... Дождался, пока станет активной кнопка "Yes", нажал - почта отправилась...
Можно теперь узнать, что происходит у тебя?
taran
1.02.2010 13:05
Цитата(volvo @ 1.02.2010 1:55)
Можно теперь узнать, что происходит у тебя?
При открытом Outlook: при нажатии "Отправить" в программе письмо автоматически отправляется, без всяких разрешений добавляясь сначала в "Исходящие", а затем - в "Отправленные".
При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана"
volvo
1.02.2010 13:38
Цитата
При закрытом 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
1.02.2010 14:25
Версия Outlook- 2007, Билдера - 6.
Что происходит при введении проверки "isRunning": даже если Outlook не запущен, эта переменная получает значение true благодаря этому куску:
try { // Не был запущен... Значит, запускаем: MSOApp = CreateOleObject("Outlook.Application"); isRunning = true; }
Это я точно проверил. Выводится сообщение "Ошибка при отправке почты", значит, идёт ошибка на этапе формирования письма, а не открытия Outlook (хотя реально Аутлук не открывается, несмотря на то, что isRunning = true).
volvo
1.02.2010 14:35
Цитата
даже если 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
1.02.2010 14:48
Цитата(volvo @ 1.02.2010 14:35)
Смотри:
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 15:27
Кстати, подскажите ещё, пожалуйста, как называется параметр, отвечающий за отправку копии письма? И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
volvo
1.02.2010 15:35
Цитата
И где вообще можно ознакомиться с параметрами OLE-объектов и функций?