Перейти к содержанию
Fire Monkey от А до Я
  • 0

Отправка внутри приложения в ios


Anasazi

Вопрос

Пробовал реализовать отправку e-mail из приложения. Делал вот по этой теме:

 

http://fire-monkey.ru/topic/1202-otpravka-pisma-na-pochtu/

На Android все работает прекрасно под ios на глухо зависает.

 

Код получился вот такой:                 

SMTP.Host:= 'smtp.yandex.ru' ; // хост
 SMTP.Port:= 465 ; // порт
 Smtp.Username:='TestUser'; 
Smtp.Password:='pass123';

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;
IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;
IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;



MailMessage.Body.Clear;

MailMessage.Body.Add('Первая строка');
MailMessage.Body.Add('Вторая строка');



SMTP.Connect;
mailMessage.CharSet := 'UTF-8';

mailMessage.CharSet:='UTF-8';

MailMessage.ContentType:='multipart/mixed; charset=UTF-8';
MailMessage.ContentType:='text/plain; charset=KOI8-R';

MailMessage.Subject:=UTF8Encode('Reserve') ; // тема
MailMessage.From.Address:='testadres@yandex.ru' ;
MailMessage.From.Domain:= 'yandex.ru'; // домен
MailMessage.From.User:= 'TestUser';
MailMessage.From.Name:=UTF8Encode('TestUserName');

MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия
//2192100@list.ru

MailMessage.IsEncoded:=true;

SMTP.Send(MailMessage);
SMTP.Disconnect;
Изменено пользователем Andrey Yefimov
Тег "Код"
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

Ссылка на комментарий
  • 0

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

Подскажи пожалуйста, что не так в этих строках? Как исправть?

Ссылка на комментарий
  • 0

Вы сначала присваиваете, а потом создаете. Ничего не перепутали?

Спасибо большое за подсказку.

Попробовал поменять строки местами. Итог перестало работать даже на android. Пробовал убрать строку

IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);

Итог - на android работет нормально, под ios опять на глухо зависает. Подскажите пожалуйста в чем еще может быть дело.

Ссылка на комментарий
  • 0
  • Модераторы

SMTP.Host:= 'smtp.yandex.ru' ; // хост
SMTP.Port:= 465 ; // порт
Smtp.Username:='TestUser'; 
Smtp.Password:='pass123';


SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);
IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;
IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;
IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1; // Уверен что именно этот метод используется??
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;

 

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

MailMessage.Body.Clear;

MailMessage.Body.Add('Первая строка');
MailMessage.Body.Add('Вторая строка');

SMTP.Connect;
mailMessage.CharSet := 'UTF-8';
mailMessage.CharSet:='UTF-8';


MailMessage.ContentType:='multipart/mixed; charset=UTF-8';
MailMessage.ContentType:='text/plain; charset=KOI8-R';


MailMessage.Subject:=UTF8Encode('Reserve') ; // тема
MailMessage.From.Address:='testadres@yandex.ru' ;
MailMessage.From.Domain:= 'yandex.ru'; // домен
MailMessage.From.User:= 'TestUser';
MailMessage.From.Name:=UTF8Encode('TestUserName');

MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия
//2192100@list.ru

MailMessage.IsEncoded:=true;

SMTP.Send(MailMessage);
SMTP.Disconnect;

 

 

==================================

А теперь еще раз на код посмотри и сделай все правильно

Ссылка на комментарий
  • 0

SMTP.Host:= 'smtp.yandex.ru' ; // хост

SMTP.Port:= 465 ; // порт

Smtp.Username:='TestUser'; 

Smtp.Password:='pass123';

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);

IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;

IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;

IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1; // Уверен что именно этот метод используется??

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;

 

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

MailMessage.Body.Clear;

MailMessage.Body.Add('Первая строка');

MailMessage.Body.Add('Вторая строка');

SMTP.Connect;

mailMessage.CharSet := 'UTF-8';

mailMessage.CharSet:='UTF-8';

MailMessage.ContentType:='multipart/mixed; charset=UTF-8';

MailMessage.ContentType:='text/plain; charset=KOI8-R';

MailMessage.Subject:=UTF8Encode('Reserve') ; // тема

MailMessage.From.Address:='testadres@yandex.ru' ;

MailMessage.From.Domain:= 'yandex.ru'; // домен

MailMessage.From.User:= 'TestUser';

MailMessage.From.Name:=UTF8Encode('TestUserName');

MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия

//2192100@list.ru

MailMessage.IsEncoded:=true;

SMTP.Send(MailMessage);

SMTP.Disconnect;

 

 

==================================

А теперь еще раз на код посмотри и сделай все правильно

 

 

SMTP.Host:= 'smtp.yandex.ru' ; // хост

SMTP.Port:= 465 ; // порт

Smtp.Username:='TestUser'; 

Smtp.Password:='pass123';

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);

IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;

IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;

IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1; // Уверен что именно этот метод используется??

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;

 

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

MailMessage.Body.Clear;

MailMessage.Body.Add('Первая строка');

MailMessage.Body.Add('Вторая строка');

SMTP.Connect;

mailMessage.CharSet := 'UTF-8';

mailMessage.CharSet:='UTF-8';

MailMessage.ContentType:='multipart/mixed; charset=UTF-8';

MailMessage.ContentType:='text/plain; charset=KOI8-R';

MailMessage.Subject:=UTF8Encode('Reserve') ; // тема

MailMessage.From.Address:='testadres@yandex.ru' ;

MailMessage.From.Domain:= 'yandex.ru'; // домен

MailMessage.From.User:= 'TestUser';

MailMessage.From.Name:=UTF8Encode('TestUserName');

MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия

//2192100@list.ru

MailMessage.IsEncoded:=true;

SMTP.Send(MailMessage);

SMTP.Disconnect;

 

 

==================================

А теперь еще раз на код посмотри и сделай все правильно

 

 

SMTP.Host:= 'smtp.yandex.ru' ; // хост

SMTP.Port:= 465 ; // порт

Smtp.Username:='TestUser'; 

Smtp.Password:='pass123';

SMTP.UseTLS :=utUseImplicitTLS ;

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

IdSSLIOHandlerSocketOpenSSL1.Destination := SMTP.Host+':'+IntToStr(SMTP.Port);

IdSSLIOHandlerSocketOpenSSL1.Host := SMTP.Host;

IdSSLIOHandlerSocketOpenSSL1.Port := SMTP.Port;

IdSSLIOHandlerSocketOpenSSL1.DefaultPort := 0;

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvTLSv1; // Уверен что именно этот метод используется??

IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmUnassigned;

 

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

MailMessage.Body.Clear;

MailMessage.Body.Add('Первая строка');

MailMessage.Body.Add('Вторая строка');

SMTP.Connect;

mailMessage.CharSet := 'UTF-8';

mailMessage.CharSet:='UTF-8';

MailMessage.ContentType:='multipart/mixed; charset=UTF-8';

MailMessage.ContentType:='text/plain; charset=KOI8-R';

MailMessage.Subject:=UTF8Encode('Reserve') ; // тема

MailMessage.From.Address:='testadres@yandex.ru' ;

MailMessage.From.Domain:= 'yandex.ru'; // домен

MailMessage.From.User:= 'TestUser';

MailMessage.From.Name:=UTF8Encode('TestUserName');

MailMessage.Recipients.EMailAddresses:='TestUser0@list.ru'; // получатель и копия

//2192100@list.ru

MailMessage.IsEncoded:=true;

SMTP.Send(MailMessage);

SMTP.Disconnect;

 

 

==================================

А теперь еще раз на код посмотри и сделай все правильно

Разбил действия на 3 кнопки, чтобы понято после чего все таки виснет приложение. Виснет после выполнения smtp.connect; Опытным путем выяснил, что для того чтобы все работало на других платформах (Windows, Android) достаточно:

 

IdSSLIOHandlerSocketOpenSSL1:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);

SMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL1;

SMTP.UseTLS :=utUseImplicitTLS ;

SMTP.Connect;

 

Но с ios так ничего сделать и не могу. Один раз каким-то чудом smtp.connect выполнилась успешно. Но повторить не могу. Подскажите пожалуйста, в чем еще может быть дело?

Ссылка на комментарий
  • 0
  • Модераторы

Ios из коробки может работать с защищенными соединениями? Или либы нужно деплоить?

И виснуть будет в любом случае, нужно использовать поток

Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Ios из коробки может работать с защищенными соединениями? Или либы нужно деплоить?

И виснуть будет в любом случае, нужно использовать поток

На счет "из коробки" на 100% не знаю. Но 1 раз случайным подбором строк мне удалось добиться успеха, smtp.connect выполнялась успешно. Так что думаю, что должна работать "из коробки". Повторить не получается.
Ссылка на комментарий
  • 0

Вы используете индейцев. Из коробки не работает. Для SSL нужно прописывать uses "IdSSLOpenSSLHeaders_Static". В корне папки с проектом должны лежать статические библиотеки: libcrypto.a и libssl.a. Деплоить их ненадо, просто должны лежать в корне проекта.

Изменено пользователем xenon54
Ссылка на комментарий
  • 0
  • Модераторы

Вы используете индейцев. Из коробки не работает. Для SSL нужно прописывать uses "IdSSLOpenSSLHeaders_Static". В корне папки с проектом должны лежать статические библиотеки: libcrypto.a и libssl.a. Деплоить их ненадо, просто должны лежать в корне проекта.

это  для iOS только получается?

Ссылка на комментарий
  • 0

Вы используете индейцев. Из коробки не работает. Для SSL нужно прописывать uses "IdSSLOpenSSLHeaders_Static". В корне папки с проектом должны лежать статические библиотеки: libcrypto.a и libssl.a. Деплоить их ненадо, просто должны лежать в корне проекта.

Большое спасибо! Все получилось!

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...