Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Отправка почты на mail.ru

05.07.2015, 23:54. Показов 5223. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!!! Ребята, подскажите, по такому вопросу. Знаю, что тема уже избита вдоль и в поперёк, но есть проблемы.
Пытаюсь программно отправить сообщение в свой почтовый ящик в качестве примера отправляю из своего почтового ящика в свой же почтовый ящик письмо (сообщение), но при отправке выкидывает ошибку (см. скриншот) Использую 25 порт

Вот код
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
void __fastcall TForm1::FormShow(TObject *Sender)
{
 
   Edit2->PasswordChar = '*';
   Edit3->PasswordChar = '*';
   Edit5->Text = "blabla@mail.ru";
   Memo1->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 IdMessage1->From->Text = "Привет";
 IdMessage1->Subject="blabla@mail.ru";
 IdMessage1->Recipients->EMailAddresses = Edit5->Text;
 IdMessage1->Body->Text = Memo1->Text;
 IdMessage1->ContentType = "text/plain; charset=windows-1251";
 IdMessage1->CharSet = "windows-1251";
 IdMessage1->ContentTransferEncoding = "8BITMIME";
 
 IdSMTP1->Connect();
if (IdSMTP1->Connected())
{
  IdSMTP1->Send(IdMessage1);
}
  IdSMTP1->Disconnect();
 
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Edit1->Text = "smtp.mail.ru";
 IdSMTP1->Host = Edit1->Text;
 IdSMTP1->Username = "blabla@mail.ru";
 IdSMTP1->Password = "**********";
 IdSMTP1->UseTLS=utNoTLSSupport;
 IdSMTP1->Port = 25;
}
//---------------------------------------------------------------------------
Заранее благодарен за ответ
Изображения
 
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.07.2015, 23:54
Ответы с готовыми решениями:

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

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

Отправка электронной почты
Добрый день. Пытаюсь отправить электронное письмо. После соединения с smtp.list.ru ("94.100.177.4") порт 25 получаю...

32
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.07.2015, 16:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Dimon_ Посмотреть сообщение
проверил, что странно, что для UTF-8 работает, а для windows-1251 нет
Я пробовал в XE3 по разному и работало только так как в примере.

Тему заголовка нужно выставлять и кодировать "руками", почему за все время этот баг не поправили загадка.
0
1409 / 573 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
09.07.2015, 19:31
Цитата Сообщение от Avazart Посмотреть сообщение
Я пробовал в XE3 по разному и работало только так как в примере.
только-что пробовал это
C++
1
2
3
4
5
6
void __fastcall TfIndySMTP::IdMessageInitializeISO(System::WideChar &VHeaderEncoding,
          UnicodeString &VCharSet)
{
 VCharSet = L"UTF-8";
 VHeaderEncoding = L'B';
}
на XE3

заголовок кодируется нормально
C++
1
2
IdMessage1->Subject = "Тест";
IdMessage1->From->Name = "от меня";
все ОК
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.07.2015, 19:37
Хм, странно, может быть я что-то путаю, давно писал этот код.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.07.2015, 23:52  [ТС]
Проблема решилась надо было просто указать правильный порт

C++
1
IdSMTP1->Port = 587;
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
10.07.2015, 00:00
Наверное провайдер порты блочит.
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
11.07.2015, 10:58  [ТС]
Avazart, кстати я заметил, что если интернет через Proxy Server, то почему-то выводит вот такое вот сообщение: Socket Error 10065 No route to host , а если интеренет не через Proxy, то отправляет хорошо.

Можно ли как-то обойти эту проблему
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.07.2015, 11:35
Думаю нет.
Т.е меняйте прокси/провейдера.
0
 Аватар для Whatson2
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
14.09.2015, 18:02
Помогите, пожалуйста, разобраться!
Есть код отправки письма на email, который под Debagger-routine работает правильно (XE2, Indy родная, пробовал ставить последнюю сборку Indy отсюда для студии - результат тотже).
А если собрать Release, то приложение крашиться!
Это происходит исключительно в том случае, когда
C++
1
IdSMTP1->Password
задан неправильно. То есть на строке
C++
1
IdSMTP1->Send(IdMessage1.get());
под дебаггером происходит перехват исключения с выводом этого сообщения ("535 5.7.0 Failed. Incorrect username/password") и всё нормально дальше работает, а в release приложение вылетает с сообщением (XP SP3x32)
Кликните здесь для просмотра всего текста
Вот код:
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
69
70
71
72
73
74
75
76
77
78
void __fastcall TSender::DoSendEmail()
{
    //***************Adjusting sender and receiver properties*****************//
    //std::auto_ptr<TIdSMTP> IdSMTP1(new TIdSMTP(0));                           //Crap if fault in IdSMTP1 methods...
    TIdSMTP *IdSMTP1 = new TIdSMTP(0);
    IdSMTP1->Host = LoadS(CCDHostFrom);                                         //e_Host;
    IdSMTP1->Port = 465;                                                        //465e_Port;
    IdSMTP1->Username = LoadS(CCDUsernameFrom);                                 //e_From_Name;
    IdSMTP1->Password = LoadS(CCDUserPasswordFrom);                             //e_From_Pass;
 
    std::auto_ptr<TIdSSLIOHandlerSocketOpenSSL> IdSSLIOHandlerSocketOpenSSL1(new TIdSSLIOHandlerSocketOpenSSL(0));
    IdSSLIOHandlerSocketOpenSSL1->Destination             = IdSMTP1->Host + LoadS(MCMColon) + IntToStr(IdSMTP1->Port);
    IdSSLIOHandlerSocketOpenSSL1->Host                    = IdSMTP1->Host;
    IdSSLIOHandlerSocketOpenSSL1->Port                    = IdSMTP1->Port;
    IdSSLIOHandlerSocketOpenSSL1->DefaultPort             = 0;
    IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method      = sslvTLSv1;
    IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode        = sslmUnassigned;
    IdSSLIOHandlerSocketOpenSSL1->SSLOptions->VerifyMode  = TIdSSLVerifyModeSet();
    IdSSLIOHandlerSocketOpenSSL1->SSLOptions->VerifyDepth = 0;
 
    IdSMTP1->IOHandler = IdSSLIOHandlerSocketOpenSSL1.get();
    IdSMTP1->UseTLS = utUseExplicitTLS;                                         //TIdUseTLS
    IdSMTP1->AuthType =     satDefault;
    IdSMTP1->ReadTimeout =       15000;
    IdSMTP1->ConnectTimeout =    15000;
    IdSMTP1->OnWorkBegin = (TWorkBeginEvent)&_IdSMTPSendWorkBegin;
    IdSMTP1->OnWork = (TWorkEvent)&_IdSMTPSendWork;
    IdSMTP1->OnWorkEnd = (TWorkEndEvent)&_IdSMTPSendWorkEnd;
    //************End of adjusting sender and receiver properties*************//
    //***************************Compose message *****************************//
    std::auto_ptr<TIdMessage> IdMessage1(new TIdMessage(0));
    //TIdMessage *IdMessage1 = new TIdMessage(0);
    IdMessage1->Clear();
    IdMessage1->From->Address = IdSMTP1->Username;                              //e_From_Adress;
    IdMessage1->Recipients->EMailAddresses = LoadS(CCDUserEmailTo);             //UserEmailTo;
 
    UnicodeString Subject= LoadS(CCDSubjectReport);
    IdMessage1->ExtraHeaders->AddValue(LoadS(CCDSubject), _EncodeQuotedUtf8(Subject));
 
    SYSTEMTIME SystemTime;
    ::GetSystemTime(&SystemTime);
    UnicodeString DateTime = EncodeDate(SystemTime.wYear, SystemTime.wMonth, SystemTime.wDay) +
                             EncodeTime(SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);
    IdMessage1->From->Name = _EncodeQuotedUtf8(_GetHDDSerialNumber() + LoadS(CCDUserHDD));
    IdMessage1->Body->Text = DateTime + L"\r\n" + LoadS(CCDTextFromUser) + user_text;
 
    IdMessage1->ContentType = LoadS(CCDContentType);
    IdMessage1->ContentTransferEncoding = LoadS(CCDContentTransferEncoding);    //EncodeQuoted...
    //IdMessage1->ContentTransferEncoding= "base64";                            //EncodeBase64...
    IdMessage1->CharSet = LoadS(CCDCharSet);
 
    IdMessage1->Priority = mpLow;                                               //Letter priority
    IdMessage1->Flags = IdMessage1->Flags << mfFlagged;
//***************************End message buildeing****************************//
//******************************Create LogEvent*******************************//
    std::auto_ptr<TIdLogEvent> IdLogEvent1(new TIdLogEvent(Application->MainForm->Owner));
    IdLogEvent1->OnReceived = (TLogItemDataEvent)&_IdLogEvent1Received;
    IdSMTP1->Intercept = IdLogEvent1.get();
    IdLogEvent1->Active = true;
//***************************End LogEvent creation****************************//
//********************************Send message********************************//
    try {
        try {
            IdSMTP1->Connect();
            IdSMTP1->Send(IdMessage1.get());
            bSend_res = true;
        } catch(const EIdException &E) {
            ShowMessage(E.Message);
            bSend_res = false;
        } catch(const Exception &E) {
            ShowMessage(E.Message);
            bSend_res = false;
        }
    } __finally {
        IdSMTP1->Disconnect();
        IdSMTP1->Free();
    }
}
P.S.: 1) auto_ptr<>() пробовал убирать - результат тотже, кроме создания IdSMTP1. Если создать IdSMTP1 через auto_ptr, то при обработке исключения в IdSMTP1 уже будет белиберда (т.е. начнутся проблемы в __finally блоке);
2) Тестировалось на XP SP3x32 и Win7x64 в одинаковых студиях. В Win7 видно при падении, что дебаггер останавливается (в режиме release + F9) на CPU asm инструкции unlock "какой-то адресс". Походу, созданный сокет (IdSMTP1->Socket) не может "разлочиться"?

Добавлено через 8 минут
Во вложении там: "...'application-defined exception (code 0x0ecdfade) at 0x7c812fd3' Process Stopped. Use Step or Run to continue" - похоже, что-то внутреннее IDE.
0
 Аватар для Whatson2
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
15.09.2015, 20:23
О, великие знатоки (Avazart, как самый великий! ), хотя бы своими мыслями поделитесь по этому вопросу...
Неужели всё так плохо?
Кликните здесь для просмотра всего текста
(если что, функция LoadS == LoadString грузит все строки правильно.)
0
15.09.2015, 20:25

Не по теме:

Хз у меня нет XE2, а рабочий пример для XE3 я сылку дал.

0
15.09.2015, 20:30

Не по теме:

Avazart, спасибо за оперативность!!! Я посмотрю пример хотя у меня проблема, вроде как, совершенно другого характера.

0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
21.12.2015, 22:03
Апну тему
При отправке на мыло пользуюсь кодом:

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
MainForm->MailSend->Host = Host;
        MainForm->MailSend->Port = Port;
        MainForm->MailSend->Username = Username;
        MainForm->MailSend->Password = Pass;
        MainForm->MailSend->HeloName = "HeloName";
 
        //составляем сообщение для письма
        MainForm->IdMessage1->Clear();
        //от кого письмо
        MainForm->IdMessage1->From->Address = SettingsForm->Email_user->Text;
        //электронный адрес куда отправлять файлы
        MainForm->IdMessage1->Recipients->EMailAddresses = SettingsForm->Email_Recipient->Text;
        //тело сообщения
        MainForm->IdMessage1->Body->Text = "Текст тела сообщения";
        MainForm->IdMessage1->ContentType = "text/plain";
 
        String Subject= "Тема письма";
        MainForm->IdMessage1->From->Name = "От меня";
        MainForm->IdMessage1->Subject = Subject;
        MainForm->IdMessage1->CharSet = "utf-8";
        // Приоритет письма
        MainForm->IdMessage1->Priority = mpHighest;
        MainForm->IdMessage1->Flags = MainForm->IdMessage1->Flags<< mfFlagged;
 
        //прикрепляем файл
        //TIdAttachment *MyMess;
        //определяем путь до программы
        String path_to_dir = GetCurrentDir() + "";
        path_to_file = path_to_dir + path_to_file;
 
        TIdAttachmentFile *MyMess = new TIdAttachmentFile(MainForm->IdMessage1->MessageParts, path_to_file);
 
        MainForm->IdMessage1->MessageParts->Add();
        MainForm->IdMessage1->MessageParts->Items[0] = MyMess;
 
        //пробуем подключится к почте
        try
        {
                MainForm->MailSend->Connect();
                MainForm->MailSend->Send(MainForm->IdMessage1);
        }
        catch(const EIdException& E)
        {
            ShowMessage(E.Message);
        }
 
        //отключаемся от почтового сервера
        MainForm->MailSend->Disconnect();
Но вылетает ошибка:
not local sender over smtp
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
23.12.2015, 22:02
Победил эту ошибку, оказалось моей же тупостью, неправильно был указан отправитель:
C++
1
MainForm->IdMessage1->From->Address = SettingsForm->Email_user->Text;
заменил на:
C++
1
MainForm->IdMessage1->From->Address = Username;
Сообщение ушло, но пришло в таком формате:

Кликните здесь для просмотра всего текста
This is a multi-part message in MIME format

--GsPJEKZo7xJ8=_OYbD7vdFgP1h82tQlqrb
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

=DD=F2=EE =F4=E0=E9=EB =F2=F0=E5=E2=EE=E3=E8, =EF=F0=EE=F1=E8=EC =EE=E1=
=F0=E0=F2=E8=F2=FC =E2=ED=E8=EC=E0=ED=E8=E5

--GsPJEKZo7xJ8=_OYbD7vdFgP1h82tQlqrb
Content-Type: application/octet-stream;
name="23-12-15 20-48-38.bmp"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="23-12-15 20-48-38.bmp"

Qk2aFhkAAAAAADYAAAAoAAAAUwMAAOMBAAABACAA AAAAAGQWGQAAAAAAAAAAAAAAAAAAAAAA4+Pj
/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j
4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj
4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj
/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//j4+P/
...........................

Видимо что-то с кодировкой и форматом сообщения. Пните в правильном направлении, пожалуйста

Добавлено через 58 минут
Почитав пару тем на форуме понял что это "вечные" косяки с кодировкой. Но это не так важно, мне более интересно как сделать чтобы письмо было с вложением, т.е. письмо с прикрепленным файлом ?

Добавлено через 1 час 4 минуты
Все, решил проблему, нужно было прописать вместо:
C++
1
MainForm->IdMessage1->ContentType = "text/plain";
вот это:
C++
1
MainForm->IdMessage1->ContentType = "multipart/alternative";
Особая благодарность как всегда уважаемому volvo
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.12.2015, 22:02

IdPOP3. Проверка почты на mail.ru. Неверная кодировка текста.
Пишу код: //--------------------------------------------------------------------------- void __fastcall TForm2::Button2Click(TObject...

Отправка почты через Outlook
Здравствуйте! Тема избита, но все равно не могу найти решение. Делаю как предлагают в...

Отправка почты без indy
Всем доброго времени суток. У меня такая проблема писал почтовый клиент, всё отправляет, но ошибка кодировки, &quot;перелопатил гору&quot;...

Отправка почты в другом потоке
Народ, мне надо отправить почту в дугом потоке, чтобы програ не висла. С помощью компонентов NMSMTP или IdSMTP. Программу написал, в...

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru