Помощь - Поиск - Пользователи - Календарь
Полная версия: Отправка почты
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
taran
Добрый день.
Подскажите, пожалуйста, как реализуется процесс отправки почты в среде С++ Builder.

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

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

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

Поэтому, если у кого-то есть ещё советы, прошу мне помочь.
volvo
С Аутлуком вполне можно работать через 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
Спасибо.
taran
Как известно, письма отправляются только при открытом Outlook, поэтому скажите, пожалуйста, можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?

И ещё вопрос - можно ли как-то использовать аналогичный код для других почтовых клиентов (например, The Bat)?
volvo
Цитата
можно ли как-то принудительно открыть приложение по нажатию кнопки отправки?
Это не нужно, при попытке отправки письма Аутлук и так откроется. Я, кстати, код проверил. Если давать доступ программе к Аутлуку, то все прекрасно отсылается. А чтоб не давать доступ - так не получится, ибо: http://support.microsoft.com/kb/821679
taran
Цитата(volvo @ 31.01.2010 22:14) *

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

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

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

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

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

Можно теперь узнать, что происходит у тебя?
taran
Цитата(volvo @ 1.02.2010 1:55) *

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

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

При закрытом Outlook: согласно коду, появляется сообщение ShowMessage(L"Ошибка при отправке почты"). Если запускать в Билдере, появляется сообщение об ошибке: exception class EOleSysError with message "Операция прервана"
volvo
Цитата
При закрытом 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
Версия Outlook- 2007, Билдера - 6.

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

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


Это я точно проверил. Выводится сообщение "Ошибка при отправке почты", значит, идёт ошибка на этапе формирования письма, а не открытия Outlook (хотя реально Аутлук не открывается, несмотря на то, что isRunning = true).
volvo
Цитата
даже если 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
Цитата(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
Кстати, подскажите ещё, пожалуйста, как называется параметр, отвечающий за отправку копии письма?
И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
volvo
Цитата
И где вообще можно ознакомиться с параметрами OLE-объектов и функций?
В MSDN, где же еще? smile.gif

Вот объектная модель Outlook 2007
do you need a prescription for p
Cialis Moins Cher Paris
can you buy plaquenil over the c
Generic Zentel Walsall
nishaknapp
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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.