Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Самый, самый простой SMTP почтовик. чтоб отсылал письма. 
:(
    Опции темы
ConstantinXXX
  Дата 27.5.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Пожалуйста, дайте самый, самый, самый простой примерчик. По отправки письма с помощью smtp. Для Delphi7. Если можно с пояснениями.  smile. Хочу научиться. 

Желательно с нормальным smtp – без аунтификации и т.п., чтоб можно было б сразу проверить.
 
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
Snowy
Дата 27.5.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Код

uses    
  IdSMTP,IdMessage;    
var    
  smtp: TIdSMTP;    
  mes:  TIdMessage;    
begin    
  smtp:=TIdSMTP.Create(nil);    
  mes:=TIdMessage.Create(smtp);    
  smtp.Host := 'smtp.mail.ru';    
  smtp.Port := 25;    
  mes.From.Text := '[email protected]';    
  mes.Recipients.EMailAddresses := '[email protected]';
  mes.Subject := 'subject';    
  mes.Body.Text := 'test';    
  try
    smtp.Connect(100000);    
    smtp.Send(mes);    
    smtp.Disconnect;    
  finally
    mes.Free; smtp.Free;    
  end;
end.

Более полный код с аттачем: http://forum.vingrad.ru/index.php?showtopi...st&p=447766 
PM MAIL   Вверх
ConstantinXXX
Дата 27.5.2006, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Snowy, Спасибо, теперь буду разбираться. smile  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
ConstantinXXX
Дата 27.5.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Snowy, Спасибо за помощь, но ошибочки вылазиют и не че не отсылается. smile  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
Snowy
Дата 28.5.2006, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



А ты не шли на mail.ru
Ты ж сам просил простой пример, без аутентификации.
А бороться с майлом совсем не просто.
Поставь себе почтовый серверок и на нем тренируйся. 
PM MAIL   Вверх
ConstantinXXX
Дата 1.6.2006, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Snowy, Хорошая идея побежал ставить. smile  А более реалестичный метод можеш подсказать. 
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
Aleksiem
Дата 1.6.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.5.2006
Где: Выкса

Репутация: 1
Всего: 2



2 ConstantinXXX
Сейчас есть по крайней мере ещё две активные темы с этой же проблемой и автор одной из них это ты. На всякий случай дам ссылку на третью тему http://forum.vingrad.ru/index.php?showtopic=96903. Если ты хочешь более детально изучить почтовый протокол, то поищи в нете русский RFC-821 (описание протокола SMTP). Если хочешь потренироваться в интернете, попробуй на яндексе, он же народ. Я когда делал, на него посылал - вроде даже доходили иногда. 
PM MAIL ICQ   Вверх
ConstantinXXX
Дата 1.6.2006, 03:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Вот непойму почему прогу Borland разрешил делать, а проверить теперь не льзя. smile

Добавлено @ 03:11 
Snowy, Извените незнал сколько вам лет теперь буду на Вы. smile  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
Snowy
Дата 1.6.2006, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



дело не в TIdSMTP, а в открытых серверах, которые пытаются бороться со спамерами.
Сначала отработай отправку на простом сервере, а потом подстраивайся под открытый - с защитой.
На каждом открытом сервере есть инструкция, как настроить почтовик, чтобы почта ходила.
Подстрой программу под эти правила и всё будет работать. 
PM MAIL   Вверх
ConstantinXXX
Дата 1.6.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Snowy, Пробовал. Давно месеца так 5 назад. Читал help на почтавиках. Делал все так как там написано. На www.ua.fm Доступ к вашему почтовому ящику по протоколам POP3, SMTP, IMAP4 и WAP;
Тут как не пытался все не выходит. Наверное, я делаю ченить не так. smile  Но есже проги например Глюк ок Експрес. Он же отсылает письма прям скомпа на сервак. Так почему нельзя зделать чёнить на подобие. smile  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
maxim1000
Дата 1.6.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



а как насчёт smtp-сервера провайдера? 


--------------------
qqq
PM WWW   Вверх
ConstantinXXX
Дата 1.6.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



maxim1000, Например tts.  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
Aleksiem
Дата 2.6.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.5.2006
Где: Выкса

Репутация: 1
Всего: 2



2 ConstantinXXX
Можешь поподробнее описать ошибки которые возникают в ходе взаимодействия программы с почтовым сервером. Как вариант, может быть ты указываешь http-сервер, а не smtp.
Например для мейла надо указывать не mail.ru, а smtp.mail.ru  

Это сообщение отредактировал(а) Aleksiem - 2.6.2006, 00:59
PM MAIL ICQ   Вверх
Aleksiem
Дата 2.6.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 4.5.2006
Где: Выкса

Репутация: 1
Всего: 2



Сделал функцию отправляющую письмо на заданный адрес на почтовые сервера как с аутентификацией, так и без неё. Делал на скорую руку могут быть ошибки, если заметите пишите. Кроме того просили сделать через дельфовые компоненты и попроще, но я написал на winsock(мне так удобней). Кроме того это делает код независимым от версии делфей. Было проверено на трёх ящиках ( два на mail.ru один на yandex.ru. Всё работало, письма доходили. Правда были помечены как спам, так как не было темы в письмах. Кстати в одном из постов я написал, что yandex не требует аутентификации. Приношу извинения, ошибся, на самом деле требует.
пытался делать с подробными комментариями. Если будут вопросы пишите сюда разберём.
Код

{
Эта функция отправляет пписьмо на указанный адрес электронной почты
Аргументы:
SmtpServer, SmtpPort - сервер, с которого отправляется сообщение, и его соответствующий порт
IsAuth - требует ли Smtp-сервер аутентификации перед отправкой сообщения
Следующие 4 пункта имеют смысл только если сервер требует аутентификации
1. POP3Server - сервер для аутентификации
2. POP3Port - соответствующий порт
3. POP3Login - логин на POP3-сервере
4. POP3Password - пароль на POP3 сервере
FromAddr - адрес отправителя, должен соответствовать адресу при аутентификации на сервере POP3, если такая требуется
ToAddr - адрес получателя, должен принадлежать Smtp-серверу, через который идёт соединение
MessageText - Текст сообщения. Не должен содержать последовательности #13#10.#13#10(#13 и #10 - символы перехода и конца строки
MemoLog - компонент TMemo, которыый будет выступать в качестве лога операций. Можно изменить процедуру mmLogPrint и вообще убрать этот аргумент
Пример использования
SendMail('smtp.mail.ru', 25, true, true, 'pop3.mail.ru', 110, 'user', 'password', '[email protected]', '[email protected]', 'Testing Message', mmLog);
Когда функция вернёт true на ящик [email protected] будет отправлено сообщение 'Test Message' от [email protected]
}
function SendMail(SmtpServer: string; SmtpPort: integer; IsAuth: boolean; POP3Server: string; POP3Port: integer; POP3Login: string; POP3Password: string; FromAddr: string; ToAddr: string; MessageText: string; MemoLog: TMemo):boolean;
  {Определение IP-адреса по доменному имени }
  function LookupName(name:String): TInAddr;
  var
    HostEnt: PHostEnt;
    InAddr: TInAddr;
  begin
    if name[4]='.' then
      InAddr.s_addr := inet_addr(PChar(name))
    else
    begin
      HostEnt := gethostbyname(PChar(name));
      FillChar(InAddr, SizeOf(InAddr), 0);
      if HostEnt <> nil then
      begin
        with InAddr, HostEnt^ do
        begin
          S_un_b.s_b1 := h_addr^[0];
          S_un_b.s_b2 := h_addr^[1];
          S_un_b.s_b3 := h_addr^[2];
          S_un_b.s_b4 := h_addr^[3];
        end;
      end
    end;
    Result := InAddr;
  end;
  {Печать в лог}
  procedure mmLogPrint(LogStr: string);
  begin
    MemoLog.Lines.Add(LogStr);
  end;
  {Чтение текста из сокета}
  function RecvText(S: TSocket): string;
  const
    MAX_BUFF_SIZE = 1024;
  var
    Recvbuff: array[0..MAX_BUFF_SIZE-1] of char;
    iRecv: integer;
    TempStr: string;
  begin
    Result := '';
    ZeroMemory(@Recvbuff, sizeof(RecvBuff));
    iRecv := recv(S, RecvBuff, MAX_BUFF_SIZE, 0);
    if (iRecv = 0) then
      exit
    else
      if (iRecv = Socket_Error) then
      begin
        mmLogPrint('Ошибка получения данных с сервера');
        exit;
      end
      else
      begin
        TempStr := RecvBuff;
        Result := Copy(TempStr, 1, Pos(#13, TempStr));
      end;
    If not (Result='') then
      mmLogPrint('RECV ' + Result)
    else
      mmLogPrint('Ничего не воcстановлено');
  end;
  {Запись текста в сокет или посылка текста серверу}
  function SendText(S: TSocket; Text: String): boolean;
  const
    MAX_SEND_SIZE = 1024;
  var
    SendBuff: array[0..MAX_SEND_SIZE] of char;
    iSend: integer;
    SendStr: string;
  begin
    Result := false;
    SendStr := Text + #13#10;
    If Length(SendStr)>MAX_SEND_SIZE then
    begin
      mmLogPrint('Слишком большая строка для отправки');
      exit;
    end;
    CopyMemory(@SendBuff, PChar(SendStr), Length(SendStr));
    iSend := send(S, SendBuff, Length(SendStr), 0);
    if (iSend = SOCKET_ERROR) then
    begin
      mmLogPrint('Ошибка передачи данных');
      exit;
    end;
    mmLogPrint('SEND ' + Text);
    Result := true;
  end;
  {Аутентификация на POP3-сервере }
  function POP3Auth(Server: string; Port: integer; Login, Pass: string): TSocket;
  var
    iSock: integer;
    saServerPop3: SockAddr_In;
    RecvPop3Text, SendPop3Text: string;
  begin
    Result := -1;
    mmLogPrint('Включена авторизация');
    Result := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
    if Result = INVALID_SOCKET then
    begin
      mmLogPrint('Ошибка создания сокета');
      exit;
    end;
    mmLogPrint('Сокет создан');
    saServerPop3.sin_addr.s_addr := htonl(INADDR_ANY);
    saServerPop3.sin_family := AF_INET;
    saServerPop3.sin_port := htons(Port);
    saServerPop3.sin_addr := LookupName(Server);
    if (connect(Result, saServerPop3, sizeof(saServerPop3)) = SOCKET_ERROR) then
    begin
      mmLogPrint('Ошибка соединения с сервером POP3');
      Result := -1;
      exit;
    end;
    mmLogPrint('Соединение с сервером POP3 удачно');
    RecvPop3Text := RecvText(Result);
    If Pos('+OK', RecvPop3Text)=0 then
    begin
      CloseSocket(Result);
      Result := -1;
      exit;
    end;
    mmLogPrint('Принято приветствие от POP3 сервера');
    SendPop3Text := 'USER ' + Login;
    If not SendText(Result, SendPop3Text) then
    begin
      CloseSocket(Result);
      Result := -1;
      exit;
    end;
    RecvPop3Text := RecvText(Result);
    If Pos('+OK', RecvPop3Text)=0 then
    begin
      CloseSocket(Result);
      Result := -1;
      exit;
    end;
    SendPop3Text := 'PASS ' + Pass;
    If not SendText(Result, SendPop3Text) then
    begin
      CloseSocket(Result);
      Result := -1;
      exit;
    end;
    RecvPop3Text := RecvText(Result);
    If Pos('+OK', RecvPop3Text)=0 then
    begin
      CloseSocket(Result);
      Result := -1;
      exit;
    end;
    mmLogPrint('Авторизация на POP3 сервере успешно пройдена');
    {Вообщем-то всё написано в записи в логи к операциям, можно лишь пояснить, что результатом функции является сокет, по которому происходит
      взаимодействие с сервером POP3 при отработке функции сокет не закрывается, а остаётся рабочий и закрывается лишь после отправки письма}
  end;
  {Завершение работы с POP3 сервером}
  procedure POP3Quit(S: TSocket);
  var
    SendPop3Text: string;
  begin
    SendPop3Text := 'QUIT';
    If not SendText(S, SendPop3Text) then
    begin
      CloseSocket(S);
      exit;
    end;
    mmLogPrint('Работа с POP3 сервером завершена');
    CloseSocket(S);
  end;

var
  WData: WSADATA;
  sMailSocket, sPOP3Socket: TSocket;
  saServerMail: SockAddr_In;
  RecvMailText, SendMailText: string;
begin
  Result := false;
  if WSAStartup(MAKEWORD(1,1), WData) <> 0 then
    begin
   mmLogPrint('Ошибка при загрузке WinSock');
   exit;
    end;
  mmLogPrint('WinSock загружен');
  sMailSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  if sMailSocket = INVALID_SOCKET then
  begin
    mmLogPrint('Ошибка создания сокета');
    exit;
  end;
  mmLogPrint('Сокет создан');
  saServerMail.sin_addr.s_addr := htonl(INADDR_ANY);
  saServerMail.sin_family := AF_INET;
  saServerMail.sin_port := htons(SmtpPort);
  saServerMail.sin_addr := LookupName(SmtpServer);
  if (connect(sMailSocket, saServerMail, sizeof(saServerMail)) = SOCKET_ERROR) then
  begin
   mmLogPrint('Ошибка соединения с сервером');
   exit;
  end;
  mmLogPrint('Соединение с сервером SMTP удачно');
  RecvMailText := RecvText(sMailSocket);
  If Pos('220', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  mmLogPrint('Приветствие получено');
  SendMailText := 'HELO vingrad.ru';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    exit;
  end;
  If IsAuth then
  begin
    sPOP3Socket := POP3Auth(POP3Server, POP3Port, POP3Login, POP3Password);
    if sPOP3Socket=-1 then
    begin
      CloseSocket(sMailSocket);
      exit;
    end;
  end;
  SendMailText := 'MAIL FROM:' + FromAddr;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'RCPT TO:' + ToAddr;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'DATA';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('354', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := MessageText;
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := #13#10 + '.';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  RecvMailText := RecvText(sMailSocket);
  If Pos('250', RecvMailText)=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  SendMailText := 'QUIT';
  If not SendText(sMailSocket, SendMailText) then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  If Pos('221', RecvText(sMailSocket))=0 then
  begin
    CloseSocket(sMailSocket);
    If IsAuth then
      CloseSocket(sPOP3Socket);
    exit;
  end;
  mmLogPrint('Завершение работы с сервером');
  If IsAuth then
    POP3Quit(sPOP3Socket);
  CloseSocket(sMailSocket);
  Result := true;
end;
  

Это сообщение отредактировал(а) Aleksiem - 2.6.2006, 18:59
PM MAIL ICQ   Вверх
Lence
Дата 31.8.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чухарадземадзупэ
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 9.5.2006
Где: Ташкент

Репутация: нет
Всего: 3



Aleksiem
письмо так и не ушло ... 

1. )вот лог проги ...

WinSock загружен
Сокет создан
Соединение с сервером SMTP удачно
RECV 220 Yandex ESMTP (NO UCE)(NO UBE) server ready at Thu, 31 Aug 2006 14:21:34 +0400

Приветствие получено
SEND HELO vingrad.ru
RECV 250 smtp2.yandex.ru expected "HELO **********"

Включена авторизация
Сокет создан
Соединение с сервером POP3 удачно 

...  и тут встал ... 


2) у меня почтарь находится за прокси .... где указать чтоб через прокси ходил ? НАТ закрыт ... 

3) внутренний почта - Microsoft Exchange Server 2003 -  русские буквы не приходят ...  текст в русской кодировке .... как лечить ? 

4) как прикрутить аттачмент ?

5) тема сообщения ?

Это сообщение отредактировал(а) Lence - 31.8.2006, 13:48
--------------------
Шуруп, забитый молотком, крепче сидит чем гвоздь, закрученный отверткой ....  
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.1485 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.