Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/46: Рейтинг темы: голосов - 46, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16

Отправка почты с использованием IdSMTP (флаг важности)

07.10.2012, 21:21. Показов 9084. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех форумчан!
Помогите дилетанту, нигде не могу найти ответ на казалось бы совсем простой вопрос.
Задача следующая. Отправить письмо на электронный ящик (без вложений) и выставить атрибут "важный" для этого письма. Да бы при получении его, данное письмо отображалось как важное (флажок).
Проблем с отправкой не имею.
Использую:
- Embarcadero® C++Builder® XE2 Version 16.0.4358.45540
- Indy 10.5.8.0

Часть текста программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Form2->IdSMTP1->Host = e_Host;
Form2->IdSMTP1->Port = e_Port;
Form2->IdSMTP1->Username = e_From_Name;
Form2->IdSMTP1->Password = e_From_Pass;
Form2->IdSMTP1->UseTLS=utNoTLSSupport;
Form2->IdSMTP1->AuthType=satDefault;
Form2->IdSMTP1->ConnectTimeout=10000;
 
Form2->IdMessage1->Clear();
Form2->IdMessage1->From->Address=e_From_Adress;
Form2->IdMessage1->Recipients->EMailAddresses = UserEmail;
 
Form2->IdMessage1->Subject="Тема письма";
 
Form2->IdMessage1->Body->Add("Тело письма");
Form2->IdMessage1->Body->Add(".....");
. . .
 
Form2->IdMessage1->ContentType = "text/plain; charset=windows-1251";
Form2->IdMessage1->CharSet = "windows-1251";
Form2->IdMessage1->ContentTransferEncoding = "8BITMIME";
 
Form2->IdMessage1->Flags.Contains(mfFlagged); //Не работает
Form2->IdMessage1->Priority=mpHighest;
 
Form2->IdSMTP1->Connect();
Form2->IdSMTP1->Send(Form2->IdMessage1);
Form2->IdSMTP1->Disconnect();
Письмо отправляется, но возникают две проблемы:
1. Тема письма с использованием кириллицы отображается знаками вопроса (с телом письма порядок).
2. Флаг "важности" не устанавливается.

По первому вопросу решений в сети очень много, мне оно не столь принципиально, хотя хотелось бы видеть в верной кодировке, а вот второй вопрос интересует больше (решения в сети я не нашел под Builder).
Не подскажете, как решить проблему, по идее все просто должно быть?
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2012, 21:21
Ответы с готовыми решениями:

IdSMTP - Отправка почты через прокси
Добрый день. Появился вот такой вопрос: хочу сделать в своей программе отправку сообщения на емайл. Вот код: //на форме INDI //...

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

Отправка почты
скажите пожалуйста как сделать чтобы при вводе в Edit1,..... и нажатие на кнопку произошла отправка почты.может компонент какой-то для...

32
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
08.10.2012, 00:00  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
У меня
Code
1
Subject: =?windows-1251?Q?=D2=E5=F1=F2=EE=E2=EE=E5_=EF=E8=F1=FC=EC=EE?=
У вас
Code
1
2
Subject: =?KOI8-R?B?PT93aW5kb3dzLTEyNTE/UT89RDI9RTU9RjE9RjI9RUU9RTI9RUU9RTVfPUVG?=
 =?KOI8-R?B?PUU4PUYxPUZDPUVDPUVFPz0=?=
Откуда у вас кои-8 взялось ?

Добавлено через 2 минуты
Возможно проблема в строчках

C++
1
2
3
Form2->IdMessage1->ContentType = "text/plain; charset=windows-1251";
Form2->IdMessage1->CharSet = "windows-1251";
Form2->IdMessage1->ContentTransferEncoding = "8BITMIME";
Вы меня спрашиваете?
Текст программы один в один как у Вас.

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение

Добавлено через 2 минуты
Возможно проблема в строчках

C++
1
2
3
Form2->IdMessage1->ContentType = "text/plain; charset=windows-1251";
Form2->IdMessage1->CharSet = "windows-1251";
Form2->IdMessage1->ContentTransferEncoding = "8BITMIME";
У меня нет этих строчек, вот код, копировал полностью:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void __fastcall TForm2::Button1Click(TObject *Sender)
{
std::auto_ptr<TIdSMTP> IdSMTP1(new TIdSMTP(NULL));
std::auto_ptr<TIdMessage> IdMessage1(new TIdMessage(IdSMTP1.get() ));
 
IdSMTP1->Host = "smtp.yandex.ru";
IdSMTP1->Port = 25;
IdSMTP1->Username ="iconofsin@yandex.ru";  /* изменить  */;
IdSMTP1->Password ="****" /* изменить  */;
 
 
IdMessage1->From->Text ="iconofsin@yandex.ru";
IdMessage1->Recipients->EMailAddresses = "iconofsin@yandex.ru";
 
IdMessage1->Subject = WinToWin1251Q(L"Тестовое письмо");
IdMessage1->Body->Add(L"Тело сообщения");
 
IdMessage1->ContentTransferEncoding = L"base64";
IdMessage1->ContentType = L"text/plain; charset=windows-1251";
 
IdMessage1->Priority= mpHighest;
IdMessage1->Flags = IdMessage1->Flags << mfFlagged;
 
IdSMTP1->Connect();
IdSMTP1->Send(IdMessage1.get() );
IdSMTP1->Disconnect();
}
Только Form2
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2012, 00:05
А версия Builder какая ?
0
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
08.10.2012, 00:08  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А версия Builder какая ?
В первом сообщении есть:
- Embarcadero® C++Builder® XE2 Version 16.0.4358.45540
- Indy 10.5.8.0
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2012, 01:19
А попробуй моменять строчки местами
C++
1
2
3
4
5
6
7
8
9
10
11
IdMessage1->From->Text ="avazart@yandex.ua";
IdMessage1->Recipients->EMailAddresses = "avazart@yandex.ua";
 
IdMessage1->ContentTransferEncoding = L"base64";
IdMessage1->ContentType = L"text/plain; charset=windows-1251";
 
IdMessage1->Subject = WinToWin1251Q(L"Тестовое письмо");
IdMessage1->Body->Add(L"Тело сообщения");
 
IdMessage1->Priority= mpHighest;
IdMessage1->Flags = IdMessage1->Flags << mfFlagged;
Можно еще посмотреть сообщение сохранив его в файл
C++
1
IdMessage1->SaveToFile("1.txt");
Там поидее должно быть

Code
1
Content-Type: text/plain; charset=windows-1251
И
Code
1
X-Priority: 1
1
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
08.10.2012, 13:11  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А попробуй моменять строчки местами
C++
1
2
3
4
5
6
7
8
9
10
11
IdMessage1->From->Text ="avazart@yandex.ua";
IdMessage1->Recipients->EMailAddresses = "avazart@yandex.ua";
 
IdMessage1->ContentTransferEncoding = L"base64";
IdMessage1->ContentType = L"text/plain; charset=windows-1251";
 
IdMessage1->Subject = WinToWin1251Q(L"Тестовое письмо");
IdMessage1->Body->Add(L"Тело сообщения");
 
IdMessage1->Priority= mpHighest;
IdMessage1->Flags = IdMessage1->Flags << mfFlagged;
Можно еще посмотреть сообщение сохранив его в файл
C++
1
IdMessage1->SaveToFile("1.txt");
Там поидее должно быть

Code
1
Content-Type: text/plain; charset=windows-1251
И
Code
1
X-Priority: 1
Строчки местами поменял (хотя каждое свойство идет отделено, переписать ничего нельзя), результат прежний.
Содержимое IdMessage в файле:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
From: "iconofsin@yandex.ru" <iconofsin@yandex.ru>
Subject:
 =?KOI8-R?B?PT93aW5kb3dzLTEyNTE/UT89RDI9RTU9RjE9RjI9RUU9RTI9RUU9RTVfPUVG?=
 =?KOI8-R?B?PUU4PUYxPUZDPUVDPUVFPz0=?=
To: iconofsin@yandex.ru
Content-Type: text/plain; charset=windows-1251
Content-Transfer-Encoding: base64
Date: Mon, 8 Oct 2012 13:00:44 +0400
Priority: urgent
X-Priority: 1
 
0uXr7iDx7u7h+eXt6P8NCg==
.
Все правильно, но снова кодировка в теме - KOI8
Priority: urgent - я так понимаю, что это и есть флаг (срочно). Но опять же он у меня не выставляется.
Попробовал изменить mfFlagged на mfSeen, а результат тот же - Priority: urgent Получается это свойство вообще игнорирует строчку:
C++
1
IdMessage1->Flags = IdMessage1->Flags << mfSeen;
Если у вас работает, а у меня нет, дело только в версии Indy и/или RAD Studio, другого я уже не вижу.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2012, 14:19
Ну думаю в Indy и в IDE точнее наверное в настройках среды и системы.... по видимому есть какие то глобальные настройки.
Это касательно КОИ
C++
1
X-Priority: 1
А вот этот момент не понятен, так видно что приоритет "1" т.е mpHighes

Добавлено через 4 минуты
А какой содержание темы если не использовать ф-цию WinToWin1251Q ?
0
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
08.10.2012, 14:24  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну думаю в Indy и в IDE точнее наверное в настройках среды и системы.... по видимому есть какие то глобальные настройки.
Это касательно КОИ
C++
1
X-Priority: 1
А вот этот момент не понятен, так видно что приоритет "1" т.е mpHighes
Так вроде правильно все, код соответствует:
C++
1
IdMessage1->Priority= mpHighest;
Оттого и:
Code
1
X-Priority: 1
mpHighest

С флагами mfFlagged не понятно.
Видимо придется саму почту настраивать, да бы сервер автоматом письма от определенного отправителя сам помечал как важные.

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Добавлено через 4 минуты
А какой содержание темы если не использовать ф-цию WinToWin1251Q ?
Одни знаки вопроса.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.10.2012, 14:26
Одни знаки вопроса.
Ну по идее так и должно быть, возможно бок в ф-ции WinToWin1251Q() .
0
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
08.10.2012, 14:34  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Ну по идее так и должно быть, возможно бок в ф-ции WinToWin1251Q() .
Возможно.
Спасибо за помощь, попробую еще поискать решение.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2012, 06:04
Можно еще попробывать посмотреть что в исходниках делается.

Добавлено через 8 часов 4 минуты
Кое что нашел, пробуй так.
C++
1
2
//IdMessage1->Subject="Тема Subject";  /* Замени на следующую строчку */
IdMessage1->ExtraHeaders->Add("Subject:"+WinToWin1251Q(L"Тема Subject") );
Добавлено через 4 минуты
Для кодировки темы есть еще такой вариант ф-ции переведенный с делфи
C++
1
2
3
4
5
6
7
8
9
#include <IdCoderMIME.hpp>
#include <memory>
//---------------------------------------------------------------------------
String EncodeSubj(String Subj)
{
    std::auto_ptr<TIdEncoderMIME> IdEncoderMIME (new TIdEncoderMIME(NULL));
    return "=?+Windows-1251+?B?"+IdEncoderMIME->Encode(Subj)+"?=";
}
//---------------------------------------------------------------------------
Но я с ним не разобрался он выбрасывает исключение.

Информация взята отсюда http://www.delphifaq.ru/chasty... -indy.html

И еще есть http://ajc.su/koding/s-builder... m-indy-10/

Добавлено через 6 часов 38 минут
Есть еще вариант попробывать Utf8
C++
1
IdMessage1->Subject = "=?UTF-8?B?"+AnsiToUtf8("Тестовое письмо")+"?=";
Добавлено через 41 минуту
И собственно кои-8r http://www.loginovprojects.ru/... email_indy
2
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
09.10.2012, 19:14  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Можно еще попробывать посмотреть что в исходниках делается.

Добавлено через 8 часов 4 минуты
Кое что нашел, пробуй так.
C++
1
2
//IdMessage1->Subject="Тема Subject";  /* Замени на следующую строчку */
IdMessage1->ExtraHeaders->Add("Subject:"+WinToWin1251Q(L"Тема Subject") );
Огромное Вам спасибо, заменил на ExtraHeaders и все заработало!

Рабочий код, возможно кому-нибудь пригодится:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//---------------------------------------------------------------------------
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdMessage.hpp>
#include <IdMessageClient.hpp>
#include <IdSMTP.hpp>
#include <IdSMTPBase.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
 
#include <memory>
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
UnicodeString __fastcall WinToWin1251Q(UnicodeString Str)  {
    UnicodeString strTo;
    strTo.sprintf(L"=?windows-1251?Q?");
    AnsiString sss = Str;
    for(int i=1; i<=sss.Length(); i++) {
        byte a = sss[i];
        if (a == ' ') a = '_';
        strTo.cat_printf((a<128) ? L"%c" : L"=%.2X", a);
    }
    strTo.cat_printf(L"?=");
    return strTo;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender) {
 
    std::auto_ptr<TIdSMTP> IdSMTP1(new TIdSMTP(NULL));
    std::auto_ptr<TIdMessage> IdMessage1(new TIdMessage(IdSMTP1.get() ));
 
    IdSMTP1->Host = "smtp.yandex.ru";
    IdSMTP1->Port = 25;
    IdSMTP1->Username ="from@yandex.ru";
    IdSMTP1->Password ="password";
 
    IdMessage1->From->Text ="from@yandex.ru";
    IdMessage1->Recipients->EMailAddresses = "to@yandex.ru";
 
    IdMessage1->ContentTransferEncoding = L"base64";
    IdMessage1->ContentType = L"text/plain; charset=windows-1251";
 
    IdMessage1->ExtraHeaders->Add("Subject:"+WinToWin1251Q(L"Тестовое письмо"));
 
    IdMessage1->Body->Add(L"Тело сообщения");
 
    IdMessage1->Priority= mpHighest;
    IdMessage1->Flags = IdMessage1->Flags << mfSeen; // Увы, не работает
 
    //IdMessage1->SaveToFile("d:\\1.txt");
 
    IdSMTP1->Connect();
    IdSMTP1->Send(IdMessage1.get() );
    IdSMTP1->Disconnect();
}
Правда главный вопрос о флагах пока в "воздухе висит".
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.10.2012, 19:21
Правда главный вопрос о флагах пока в "воздухе висит".
Нужно наверное понять к чему это относится и смотреть в исходники.
1
0 / 0 / 0
Регистрация: 07.10.2012
Сообщений: 16
09.10.2012, 19:36  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Нужно наверное понять к чему это относится и смотреть в исходники.
Наверное.
"...Будем искать."
© "Бриллиантовая рука"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.10.2012, 19:36
Помогаю со студенческими работами здесь

Отправка почты (с использованием почтовой программы)
Добрый день Уважаемые коллеги! пробовал найти на этом да и на сторонних ресурсах материалы по отправке почты (с использованием...

Отправка почты с использованием переменных в получателях
Добрый вечер! Помогите пожалуйста написать более обширный скрипт на перл для отправки почты с использованием переменных в получателях и...

Отправка почты с использованием доменной учетной записи
Добрый день. Администраторы сети сделали мне большую подляну. Закрывают анонимную отправку через смтп сервер. Теперь только с...

IdSMTP, отправка письма
Здравствуйте. Помогите, пожалуйста.

Отправка почты: "необработанное исключение отправки почты в system.Dll"
подскажите - вот пример на C#, но он мне пишет &quot;необработанное исключение отправки почты в system.dll&quot; using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru