IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Отправка почты, С++
taran
сообщение 30.01.2010 14:57
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Добрый день.
Подскажите, пожалуйста, как реализуется процесс отправки почты в среде С++ Builder.

Хотелось бы, чтобы при нажатии кнопки отправлялось письмо с заданной темой через почтовый клиент (например, Outlook) на уже назначенный адрес. К письму должен быть прикреплён конкретный txt-файл, сформированный программой ранее.

Заранее спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.01.2010 15:09
Сообщение #2


Гость






Скачай Drkb , и посмотри вот по этому пути: Интернет, Сети и Протоколы -> E-mail -> Как отправить Email? -> Использование COM-объекта Outlook

Код на Дельфи, но на Билдер перенести совсем не проблема...
 К началу страницы 
+ Ответить 
taran
сообщение 31.01.2010 1:09
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Спасибо за совет, я ознакомился, но не смог окончательно перевести в Билдер или подключить модуль Delphi из-за отсутствия библиотеки OUTLOOK_TLB и файла outlk80.

Поэтому, если у кого-то есть ещё советы, прошу мне помочь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.01.2010 1:51
Сообщение #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
сообщение 31.01.2010 12:05
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
taran
сообщение 31.01.2010 15:00
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Как известно, письма отправляются только при открытом Outlook, поэтому скажите, пожалуйста, можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?

И ещё вопрос - можно ли как-то использовать аналогичный код для других почтовых клиентов (например, The Bat)?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.01.2010 22:14
Сообщение #7


Гость






Цитата
можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
Это не нужно, при попытке отправки письма Аутлук и так откроется. Я, кстати, код проверил. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. А чтоб не давать доступ - так не получится, ибо: http://support.microsoft.com/kb/821679
 К началу страницы 
+ Ответить 
taran
сообщение 1.02.2010 0:47
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(volvo @ 31.01.2010 22:14) *

Это не нужно, при попытке отправки письма Аутлук и так откроется.

Я спросил как раз по той причине, что он автоматически не открывается.

Цитата(volvo @ 31.01.2010 22:14) *

Если давать доступ программе к Аутлуку, то все прекрасно отсылается.

Про доступ у меня вообще ничего не спрашивает, при открытом Outlook сразу отправляет.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.02.2010 1:55
Сообщение #9


Гость






Цитата
Я спросил как раз по той причине, что он автоматически не открывается.
Хорошо, зайдем с другой стороны. Что происходит у тебя если Аутлук не открыт? Я сейчас за компьютером с MSO, поэтому могу сделать скрины. Итак, MSO не запущен, жму кнопку в моем приложении, получаю:
Прикрепленное изображение
Ставлю галку, оставляю 1 минуту, и жму "Yes". В лучших традициях MS получаю второе предупреждение:
Прикрепленное изображение
, с бегущим ProgressBar-ом... Дождался, пока станет активной кнопка "Yes", нажал - почта отправилась...

Можно теперь узнать, что происходит у тебя?
 К началу страницы 
+ Ответить 
taran
сообщение 1.02.2010 13:05
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(volvo @ 1.02.2010 1:55) *

Можно теперь узнать, что происходит у тебя?

При открытом Outlook: при нажатии "Отправить" в программе письмо автоматически отправляется, без всяких разрешений добавляясь сначала в "Исходящие", а затем - в "Отправленные".

При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана"
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.02.2010 13:38
Сообщение #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
сообщение 1.02.2010 14:25
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Версия Outlook- 2007, Билдера - 6.

Что происходит при введении проверки "isRunning": даже если Outlook не запущен, эта переменная получает значение true благодаря этому куску:

	try
{
// Не был запущен... Значит, запускаем:
MSOApp = CreateOleObject("Outlook.Application");
isRunning = true;
}


Это я точно проверил. Выводится сообщение "Ошибка при отправке почты", значит, идёт ошибка на этапе формирования письма, а не открытия Outlook (хотя реально Аутлук не открывается, несмотря на то, что isRunning = true).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.02.2010 14:35
Сообщение #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
сообщение 1.02.2010 14:48
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Цитата(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 14:49
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
taran
сообщение 1.02.2010 15:27
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 11
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  0  +


Кстати, подскажите ещё, пожалуйста, как называется параметр, отвечающий за отправку копии письма?
И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.02.2010 15:35
Сообщение #16


Гость






Цитата
И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
В MSDN, где же еще? smile.gif

Вот объектная модель Outlook 2007
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.09.2024 8:49
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"