Плавно подходим мы к отправке sms-сообщений через sms-шлюз операторов сотовой связи. В данной статье мы рассмотрим как вообще можно отправить сообщение (email-сообщение) средствами Delphi. Отсылать email-сообщения мы будем через TidSMTP. То есть получается, что, нам надо знать адресс smtp-сервера, с которого мы будем отсылать сообщение. Обычно, сервисы, которые предоставляют услуги почты, перед их адрессом приписывается smtp и получается адресс smtp-сервера. В итоге возьмем rambler.ru. Соответственно, подставим smtp и получим smtp.mail.ru — это и есть адресс нашего smtp-сервера, порт почти везде одинаков данных серверов и он равняется 25. Это нам все пригодится при подключении к нашей серверу. Далее нам необходим наш пароль и логин с rambler.ru для подключения к нашей почте, с которой мы будем отсылать сообщения. Теперь приступим на форму установим следующие компоненты
  • TidSMTP
  • TidAntiFreeze
  • TButton
Компоненты на форме, значит осталось как ничего подключиться к нашему серверу и отправить сообщения. Для подключения к нашему серверу на событие формы OnCreate напишем следующий код

procedure TForm1.FormCreate(Sender: TObject);
begin
try
IdSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Host:='smtp.rambler.ru';
IdSMTP1.Port:=25;
IdSMTP1.Username:='username@rambler.ru';
IdSMTP1.Password:='password';
IdSMTP1.Connect;
except
on e:Exception do
end;
end;

Строчка IdSMTP1.AuthenticationType:=atLogin; указывает на то, что мы авторитизируемся на нашем сервере. Это у нас и есть подключение к нашему smtp-серверу, с помощью Connect мы указываем, что подключаемся. Далее нам необходимо отправить сообщение, для этого существует специальный тип данных TidMessage, который определяет полностью формат нашего отправляемого письма. Чтобы использовать данный тип данных, необходимо в Uses подключить модуль idmessage. Для начала его необходимо создать и затем заполнить по определенному шаблону и после чего отослать на нужный нам адресс. Теперь на событие TButton - Onclick напишем заполнение нашего сообщения и отправку его.

procedure TForm1.Button1Click(Sender: TObject);
var
msg:TIdMessage;
begin
try
msg:=TIdMessage.Create(nil);
msg.Body.Add('test mail');
msg.Subject:='header message';
msg.From.Address:='punisher45@rambler.ru';
msg.From.Name:='Andrey';
msg.Recipients.EMailAddresses:='punisher_z53@mail.ru';
msg.IsEncoded:=True;
IdSMTP1.Send(msg);
msg.Free;
IdSMTP1.Disconnect;
except
on e:Exception do
begin
msg.Free;
IdSMTP1.Disconnect;
end;
end;
end;

Теперь можете залезть на эмаил, куда вы отправляли письмо и убедиться, что оно пришло, если конечно ошибок при отправке никаких не было.Как видите Body.Add — задает текст сообщения, Subjects - заголовок сообщения, From.Adress — адресс отправителя, From.Name — имя отправителя, Recipients.EMailAddresses- определяет адрессат получателя (то есть кому отправляем мы email). В конце мы просто отключаемся от нашего smtp-сервера при помощи метода Disconnect.

Отправка писем не сложна, а отправка sms-сообщений через sms-шлюз еще проще, что мы и посмотрим в следующей статье про отправку sms-сообщений. А в дальнейшем посмотрим как можно прилаживать файлы к своему письму.

Хочу заметить, что в настоящее время очень популярно развивается 3g-Интернет. На мой взгляд, он становится популярнее DSL-соединения или спутникового. Для повышения скорости 3g соединения существует Ускоритель 3g модема. Для таких целей существует множество программ, которые позволяют качественно повысить скорость интернет-соединения, главное очень внимательно почитать описание и применения программ.
Автор статьи - Andrey53

Метки: , , , ,




К записи “Отправка email средствами Delphi. Часть 1” оставлено комментариев: 27.

  1. TEMHOTA:

    Как отправлять почту на gmail?

  2. […] открытия данного сайта, я писал статьи по отправке email средствами Delphi, а также отправке sms-сообщений , где […]

  3. Алексей:

    Сделал как написано, выкидывает окно ошибки:
    Debugger Exception Notification
    «Проект Project1.exe вызвал исключение класса EIdProtocolReplyError с сообщением ‘Syntactically invalid EHLO argument(s)
    ‘. Процесс остановлен. Используйте Шаг или Запуск для продолжения.»
    В чем может быть проблема и как её решить можно?

  4. Алексей:

    А, всё :) разобрался… Проблемы в том, что в имени почты можно использовать только буквы. А как проблему с символами решить? Т.е. если адрес например такой: ?

  5. Алексей:

    Новая напасть нашлась (извиняюсь заранее за «спам», но иначе никуда не отписаться)… В общем делаю прогу с тестами, 3 формы, 2 из них с тестами и в конце есть кнопка «отправка рез-тата», которая и сделана на отправку по выше представленному алгоритму. Сперва в случае, если отправляю результат второй раз (к примеру сперва отправил рез-ты первого, потом результаты второго теста) ошибку какую-то выдавал Делфи на строчку «msg.Free;», которая до закрытия IdSMTP находится. Какая ошибка уже не помню, возможно которую выше писал уже. При этом первое письмо приходило, второе нет. Затем если делфи закрывал, открывал exe’шник, то вообще ни одного письма не приходило. Сегодня вдруг начал и с открытым и с закрытым делфи отправлять оба результата. Скинул на другой комп exe’шник, попробовал там (там делфи не установлен), при первой попытки из 2 писем не пришло ни одного, при второй попытке пришло тока первое письмо.
    Очень важно в проге, чтобы отправка работала на 100%, иначе результаты теряются вообще.
    В чем может быть проблема? Или как её возможно решить? SMTP и AntiFreeze закинуты находятся 2 и 3 формах (т.к. только там кнопки отправки). Или нужно на 1 их располагать, причем на первой (главной)?

    • Andrey:

      не обязательно на первой (главной) попробуйте сделать FreeAndNil(msg) вместо msg.Free, а вообще показать Ваш код полностью

  6. Александр:

    Вообщем как не делаю стыкаю с одной и той же проблемой. это socket error 10060.Что делать не знаю.

  7. Алексей:

    u menya vrode bi takoi oshibki ne bilo… smotrite vnimatel’nee kod… no vot rabotaet v itoge krivo :( vishe opisal problemu, avtor, uvi, ne otvechaet =/

  8. Денис:

    а почему ошибка в строке
    IdSMTP1.AuthenticationType:=atLogin;?

    • Хакер:

      Потому, что у тебя 10 версия инди скорей всего, а там не используется тип аутентификации. Вообще надо уточнять тип ошибки, но попробуй следующий код юзать:

      procedure TForm1.FormCreate(Sender: TObject);
      begin
      try
      IdSMTP1.Host:='smtp.rambler.ru';
      IdSMTP1.Port:=25;
      IdSMTP1.Username:='username@rambler.ru';
      IdSMTP1.Password:='password';
      IdSMTP1.Connect;
      except
      on e:Exception do
      end;
      end;

    • Andrey:

      какая именно ошибка? какая версия Indy

  9. chex01:

    Что делать если вместо текста письма приходит «????????? ???? ??????»?

  10. Евгений:

    Ребята, на IdSMTP1.Connect прога зависает.
    Чито делать,

  11. Alex:

    Проблема с получением вложений с русскими именами (indy 7):
    Отправляется «Вложение с русским именем файла.doc»
    а в outlook express получают «бКНФЕМХЕ Я ПСЯЯЙХЛ ХЛЕМЕЛ ТЮИКЮ»
    Как-нибудь это пофиксить можно, желательно в том же самом indy ?

  12. Анатолий:

    Я хочу использовать сервер http://www.ukr.net.
    Но команда IdSMTP1.Host:=’smtp.ukr.net’ приводит к ошибке(417)

  13. Леха:

    Блинннннннннн везде одно и тоже, неужели ни кого не смущает то, что
    при отправки письма с вложением хотябы на 6мб, программа висит секунд десять в лучшем случае, а если тугой инет так вообще одуреть
    можно.
    Короче вопрос в следующем Как в RAD studio XE3 c использованием компонента IdSMTP узнать состояние процесса для прогрессбара при ОТПРАВКЕ с получением проблем НЕТ!!!

  14. Unisender:

    Хм, нужно будет попробовать такое накодить!)

  15. Дмитрий:

    дельфі 7
    procedure TForm1.Button2Click(Sender: TObject);
    var
    attach: TidAttachment;
    begin
    IdSMTP1.AuthenticationType:= atLogin;
    IdSMTP1.Username:=’………………@mail.ru'; //Логин
    IdSMTP1.Password:=’………………'; //Пароль
    IdSMTP1.Host:=’smtp.mail.ru'; //Хост
    IdSMTP1.Port:=25;
    IdMessage1.CharSet:=’windows-1251′; //Кодировка в теле сообщения
    IdMessage1.ContentType:=’…………..';
    IdMessage1.Body.text:=’Текст'; //Текст сообщения
    IdMessage1.Subject:=ConvertToWIN1251(‘Тема’); //Тема сообщения
    IdMessage1.From.Address:=’……………….@mail.ru'; //Адрес отправителя
    //IdMessage1.From.Name:=ConvertToWIN1251(‘User’); //Имя отправителя
    IdMessage1.Recipients.EMailAddresses:=’……?….@mail.ru'; //Кому отправить письмо (можно через запятую если несколько e-
    mail’ов)
    IdMessage1.IsEncoded:=true;
    //attach:=TIdAttachment.Create(IdMessage1.MessageParts,’Путь до файла’); //Вложение
    try
    //Соединение с почтовым сервером
    IdSMTP1.Connect();
    IdSMTP1.Send(IdMessage1);
    showmessage(‘Сообщение отправлено’);
    except
    showmessage(‘Ошибка при отправке сообщения’);
    end;
    //Отсоединяемся от почтового сервера
    IdSMTP1.Disconnect;
    end;

    не работает, подскажите почему

    кинем на форму компоненты: IdSMTP с вкладки Indy Client и IdMessage с вкладки Indy
    Misc .

  16. Дмитрий:

    я уже что только непробовал и другие порта писал и на yandex пробовал, и на рамблер и на укр нет ничего неполучаеться, останавливается на отправке письма.

    а если ставлю 25 порт меил.ру то не конектиться вообще даже до письма не доходит зависает на соединении, что делать , может в самих компонентах которые бросаем на форму что то переключить

    да ещё на форму ставлю инкодер и добавляю впереди функцию для кодировкы

  17. Дима:

    Ребят, вообщем компилит всё без ошибок, подключается без ошибок и вроде как бы не выдаёт никаких ошибок во время отправки, ну письмо не приходит :(
    В чём проблема?

Оставить комментарий

Вы можете использовать следующие теги:

*