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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

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


Новичок
*

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

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


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

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

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


Гость






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

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


Новичок
*

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

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


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

Поэтому, если у кого-то есть ещё советы, прошу мне помочь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 может спросить, хочешь ли ты дать доступ программе к Аутлуку, и на какое время (я просто помню, раньше с таким сталкивался. А вот как решал проблему - не помню. Да и на Дельфи дело было, а не на Билдере). Дай доступ, и посмотри, отсылается ли вообще письмо, для начала...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

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

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


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


Новичок
*

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

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


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

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


Гость






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


Новичок
*

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

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


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

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

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

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

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

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


Гость






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

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


Новичок
*

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

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


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

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

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

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


Новичок
*

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

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


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

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

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


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


Новичок
*

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

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


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


Гость






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

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


Гость






Cialis Moins Cher Paris
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Гость






Generic Zentel Walsall
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

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

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


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 18.04.2024 17:44
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name