1. rwikk117.03.2025 в 10:03от
Загрузка...
Загрузка...

Отправка письма на почту в Delphi [1/2]

Тема в разделе "С/С++/Pascal/Delphi", создана пользователем MishaRed, 04.09.2013.

  1. MishaRed

    MishaRed

    Статус:
    Оффлайн
    Регистрация:
    02.06.13
    Сообщения:
    450
    Репутация:
    142 +/-
    [​IMG]

    В этой статье я расскажу, как написать простейшую программу, которая будет отправлять письма на почту посредством протокола SMTP.

    Для начала разберем что представляет из себя данный протокол, а уж потом перейдем к написанию самой программы:
    Теперь же все таки можем приступать к написанию самой программы.

    Создадим проект, проект WindowsFormApplication (в случае с Delphi XE3) и набросаем на форму такие компоненты, как:

    TEdit (x6)
    TMemo
    TButton (x2)
    Расположим эти компоненты так, чтобы нам было удобно работать. Рассмотрим эти компоненты, то есть рассмотрим для чего они применяются:

    Edit1 будет применяться для указания адреса сервера
    Edit2 будет применяться для указания порта сервера
    Edit3 будет применяться для указания имени пользователя
    Edit4 будет применяться для указания пароля пользователя
    Edit5 будет применяться для указания получателя письма
    Edit6 будет применяться для указания темы письма
    Memo1 будет применяться для указания текста письма
    Button1 будет применяться для выполнения проверки соединения с сервером
    Button2 будет применяться для выполнения подключения к серверу и отправки письма непосредственно на почту
    Теперь же нам придется определиться с тем, с какой библиотекой мы будем работать. Выбора у нас не много и мой выбор пал именно на библиотеку Indy. Для работы с SMTP протоколом в Indy нам понадобится набросать на форму компонент TIdSMTP из вкладки Indy Clients и компонент TIdMessage из вкладки Indy Misc.

    Перейдем непосредственно к самому коду, для этого создадим обработчик событий OnClick на компонент Button1. Как уже упоминалось выше, данный компонент будет служить для проверки соединения с сервером и поэтому первым делом нам конечно нужно указать адрес сервера, порт сервера, имя пользователя под которым мы будем авторизовываться на сервере и пароль пользователя:

    Код:
    IdSMTP1.Host := Edit1.Text; // указываем адрес сервера из Edit1
    IdSMTP1.Port := StrToInt(Edit2.Text); // указываем порт сервера из Edit2 с изначальным преобразованием строки с целым значением в Integer
    IdSMTP1.Username := Edit3.Text; // указываем имя пользователя под которым мы будем авторизоваться из Edit3
    IdSMTP1.Password := Edit4.Text; // указываем пароль пользователя из Edit4
    Таким образом мы указали изначальные значения для некоторых параметров и всего-то. То есть, программа еще должна проверять соединение с сервером с такими данными по нажатию первой кнопки, в случае успешного соединения выводила сообщение об успешной авторизации. И так, реализовываем:

    Код:
    try // начинаем перехватывание ошибки
      IdSMTP1.Connect;
    finally // начинаем безоговорочный раздел инструкции Try
      if IdSMTP1.Connected then // если соединились, то выполняем следующий код
      begin
        ShowMessage('Соединение успешно установлено'); // выводим сообщение
        IdSMTP1.Disconnect; // отключаемся от сервера
      end;
    end;
    Мы успешно сделали проверку соединения по нажатию первой кнопки, а теперь попытаемся сделать и соединение и отправку письма при нажатий на вторую кнопку. Сначала конечно же соединяемся с сервером, а потом уже отправляем письмо, но чтобы отправить письмо, нам так же следует назначить некоторые значения для параметров компонента TIdMessage.

    Код:
    IdMessage1.Charset  := 'koi8-r'; // для корректности русских букв
    IdMessage1.From.Address := Edit3.Text; // указываем отправителя письма из Edit3
    IdMessage1.Recipients.EMailAddresses := Edit5.Text; // указываем получателя письма из Edit5
    IdMessage1.Subject := Edit6.Text; // указываем тему письма из Edit6
    IdMessage1.Body.Text := Memo1.Text; // указываем текст письма из Memo1
    Указали значения для некоторых параметров компонента TIdMessage, а теперь же отправляем письмо после успешного соединения с сервером:

    Код:
    try
      try
        IdSMTP1.Connect;
        IdSMTP1.Send(IdMessage1); // отправляем письмо из IdMessage1
      except on E:Exception do // в случае ошибки выполняем следующий код
        ShowMessage('Ошибка соединения'); // выводим сообщение
      end;
    finally
      if IdSMTP1.Connected then
      begin
        ShowMessage('Письмо успешно отправлено');
        IdSMTP1.Disconnect;
      end;
    end;
    С помощью вышеприведенного кода мы выполнили соединение с сервером под именем пользователя, которое указал пользователь и в случае успешного соединения с сервером, мы отправили письмо.

    Итого: мы научились писать программу для отправки писем в Delphi.

    Эта статья была всего лишь первой частью по данной теме и в следующей статье мы поговорим о том, как отправлять письма в Delphi посредством библиотеки Synapse.

    Всем удачи и до скорых встреч!

    Специально для игрового портала и форума youhack.top
     
  2. aSqqq

    AASQWAERQ#REAWFASSDA
    aSqqq

    Статус:
    Оффлайн
    Регистрация:
    15.02.13
    Сообщения:
    244
    Репутация:
    104 +/-
    Спасибо за урок, но вот насчет проверки, можно вместо Edit для Host и Port'a взять ComboBox, чтобы удобнее было пользоваться программой, каждый раз не вбивать хост и порт, а просто выбрать из списка.
     
  3. Usernane

    Usernane

    Статус:
    Оффлайн
    Регистрация:
    23.05.13
    Сообщения:
    326
    Репутация:
    72 +/-
    можно
     
  4. Rizh

    Rizh

    Статус:
    Оффлайн
    Регистрация:
    03.09.13
    Сообщения:
    31
    Репутация:
    -11 +/-
    ребята дайте скайпы) а многопоточную прогу смогёте с обходами антиспама?)
     
  5. Usernane

    Usernane

    Статус:
    Оффлайн
    Регистрация:
    23.05.13
    Сообщения:
    326
    Репутация:
    72 +/-
    многопоточную можно сделать без проблем
    а на счет антиспама хз
    я одно заметил когда отправляеш через протокол smpt и зайти на почту с которой отправили
    письма в отправленых не будет :D может так возможно и обойти
    я бы глянул но мне лень)
     
  6. Rizh

    Rizh

    Статус:
    Оффлайн
    Регистрация:
    03.09.13
    Сообщения:
    31
    Репутация:
    -11 +/-
    а если не зайти то будут в входящих ? ) просто мог бы отблагодарить манетами за токого софта
     
  7. MishaRed

    MishaRed

    Статус:
    Оффлайн
    Регистрация:
    02.06.13
    Сообщения:
    450
    Репутация:
    142 +/-
    Так это же SMTP :) Только в клиенте останется письмо )