1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Добрый день. Подскажите, пожалуйста, как реализуется процесс отправки почты в среде С++ Builder.
Хотелось бы, чтобы при нажатии кнопки отправлялось письмо с заданной темой через почтовый клиент (например, Outlook) на уже назначенный адрес. К письму должен быть прикреплён конкретный txt-файл, сформированный программой ранее.
Спасибо за совет, я ознакомился, но не смог окончательно перевести в Билдер или подключить модуль Delphi из-за отсутствия библиотеки OUTLOOK_TLB и файла outlk80.
Поэтому, если у кого-то есть ещё советы, прошу мне помочь.
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 может спросить, хочешь ли ты дать доступ программе к Аутлуку, и на какое время (я просто помню, раньше с таким сталкивался. А вот как решал проблему - не помню. Да и на Дельфи дело было, а не на Билдере). Дай доступ, и посмотри, отсылается ли вообще письмо, для начала...
Как известно, письма отправляются только при открытом Outlook, поэтому скажите, пожалуйста, можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
И ещё вопрос - можно ли как-то использовать аналогичный код для других почтовых клиентов (например, The Bat)?
можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
Это не нужно, при попытке отправки письма Аутлук и так откроется. Я, кстати, код проверил. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. А чтоб не давать доступ - так не получится, ибо: http://support.microsoft.com/kb/821679
Я спросил как раз по той причине, что он автоматически не открывается.
Хорошо, зайдем с другой стороны. Что происходит у тебя если Аутлук не открыт? Я сейчас за компьютером с MSO, поэтому могу сделать скрины. Итак, MSO не запущен, жму кнопку в моем приложении, получаю: Ставлю галку, оставляю 1 минуту, и жму "Yes". В лучших традициях MS получаю второе предупреждение: , с бегущим ProgressBar-ом... Дождался, пока станет активной кнопка "Yes", нажал - почта отправилась...
При открытом Outlook: при нажатии "Отправить" в программе письмо автоматически отправляется, без всяких разрешений добавляясь сначала в "Исходящие", а затем - в "Отправленные".
При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана"
При закрытом 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) { // здесь весь тот код, который я приводил выше, кроме инициализации Аутлука
Что происходит при введении проверки "isRunning": даже если Outlook не запущен, эта переменная получает значение true благодаря этому куску:
try { // Не был запущен... Значит, запускаем: MSOApp = CreateOleObject("Outlook.Application"); isRunning = true; }
Это я точно проверил. Выводится сообщение "Ошибка при отправке почты", значит, идёт ошибка на этапе формирования письма, а не открытия Outlook (хотя реально Аутлук не открывается, несмотря на то, что isRunning = true).
даже если 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-шник отдельно, а не из Билдера? Попробуй...
try { // Попытка запуска Outlook... Если запуск не удается - // выбрасывается исключение, и следующая строка НЕ ВЫПОЛНЯЕТСЯ, // программа сразу переходит в блок catch, то есть isRunning остается равным false... MSOApp = CreateOleObject("Outlook.Application");
isRunning = true; } catch(...) { // Вот сюда переходим при неудаче в CreateOleObject !!! ShowMessage(L"Неудача: Ошибка подключения к MS Outlook"); }
Я понимаю, что если Outlook не запустился, то получим сообщение "Ошибка подключения к MS Outlook", поэтому и написал, что по мнению Билдера он запустился, а реально - нет.
Процесса OUTLOOK.EXE перед запуском программы нет. При нажатии на кнопку "Отправить" этот процесс появляется, как и должен, но сразу вслед за этим появляется сообщение "Ошибка при отправке почты".
Последний абзац как раз относится к запуску exe-файла.
Кстати, подскажите ещё, пожалуйста, как называется параметр, отвечающий за отправку копии письма? И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. Effects of Covid Regulations in Casinos