Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Почтовик


Автор: php 13.4.2008, 11:52
Пытаюсь создать почтовый сервер на компонентах Indy такие как IdSMTPServer и IdPOP3Server,
но ничего не получатется почта не отправляется и не принимается, также неясно как добавлять (регистрировать рользователя) ну скажем к примеру vitiabubuka@salo.net, помогите плиз !!

Автор: SneG0K 13.4.2008, 14:56
    Покажи, что ты уже сделал, что получается. А то ты так поверхностно рассказал. Я ведь тоже могу дать тебе ответ типа http://www.google.com.ua/search?q=%D0%BF%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D1%8B%D0%B9+%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82+%D0%BD%D0%B0+%D0%B4%D0%B5%D0%BB%D1%8C%D1%84%D0%B8&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a

Автор: php 14.4.2008, 15:04
Да в общем то и показывать то нечего взял стандартные демки которые идут вместе с Indy
скомпилил настроил их через TheBat, т.е. прописал там в настройках SMTP\POP3 сервер внешний адрес
моего компа который смотрит в сеть, почта вроде уходит ну как пишет TheBat, что письмо отправлено успешно,
но до адресата оно не доходит причина пока не известна поэтому и от безысходности спрашиваю здесь (т.к перепробовал уже все мыслимые и немыслимые варианты, уже и домен создавал через DynDNS) 

C POP3 сервером вообще ничего не понятно как он вообще работает?, как добавлять адресатов, пользователей чтоб
этот сервер потом принимал от них почту вот в чем вопрос?
Просто интересная ситуация складывается раз уж они сделали такие демки значит они должны работать, просто 
это я сам что-то не так делаю или не доделываю?

Автор: SneG0K 14.4.2008, 17:42
Эээ... Из твоих слов я понял, что ты юзаеш свои SMTP и POP сервера. Так вот попробуй допустим на mail.ru протестировать. И было бы хорошо если бы ты всетаки выложил сорцы

Автор: php 18.4.2008, 04:07
Да я как раз пытаюсь свои сервера сделать..
Да я и на mail.ru и на yandex тестировал, сорс выложу чуть позже 

Автор: php 24.4.2008, 04:40
Итак код SMTP сервера код для Indy9 могу если, что и для версии 10 выложить если нужно будет..

Код: 
Код

{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence                                   }
{ Team Coherence is Copyright 2002 by Quality Software Components      }
{                                                                      }
{ For further information / comments, visit our WEB site at            }
{ http://www.TeamCoherence.com                                         }
{**********************************************************************}
{}
{ $Log:  23278: Main.pas 
{
{   Rev 1.0.1.0    25/10/2004 22:49:48  ANeillans    Version: 9.0.17
{ Verified
}
{
{   Rev 1.0    12/09/2003 21:41:36  ANeillans
{ Initial Checking.
{ Verified with Indy 9 and D7
}
{
  Demo Name:  SMTP Server
  Created By: Andy Neillans
          On: 27/10/2002

  Notes:
   Demonstration of SMTPServer (by use of comments only!!)
   Read the RFC to understand how to store and manage server data, and
   therefore be able to use this component effectivly.

  Version History:
    12th Sept 03: Andy Neillans
                  Cleanup. Added some basic syntax checking for example.
     
  Tested:
   Indy 9:
     D5:     Untested
     D6:     Untested
     D7:     25th Oct 2004 by Andy Neillans
             Tested with Telnet and Outlook Express 6
}
unit Main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdTCPServer, IdSMTPServer, StdCtrls,
  IdMessage, IdEMailAddress, IdBaseComponent, IdComponent;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    ToLabel: TLabel;
    FromLabel: TLabel;
    SubjectLabel: TLabel;
    IdSMTPServer1: TIdSMTPServer;
    Label4: TLabel;
    btnServerOn: TButton;
    btnServerOff: TButton;
    procedure IdSMTPServer1CommandAUTH(AThread: TIdPeerThread;
      const CmdStr: String);
    procedure IdSMTPServer1CommandQUIT(AThread: TIdPeerThread);
    procedure IdSMTPServer1CommandX(AThread: TIdPeerThread;
      const CmdStr: String);
    procedure IdSMTPServer1CommandMAIL(const ASender: TIdCommand;
      var Accept: Boolean; EMailAddress: String);
    procedure IdSMTPServer1CommandRCPT(const ASender: TIdCommand;
      var Accept, ToForward: Boolean; EMailAddress: String;
      var CustomError: String);
    procedure IdSMTPServer1ReceiveRaw(ASender: TIdCommand;
      var VStream: TStream; RCPT: TIdEMailAddressList;
      var CustomError: String);
    procedure IdSMTPServer1ReceiveMessage(ASender: TIdCommand;
      var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
      var CustomError: String);
    procedure IdSMTPServer1ReceiveMessageParsed(ASender: TIdCommand;
      var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
      var CustomError: String);
    procedure IdSMTPServer1CommandHELP(ASender: TIdCommand);
    procedure IdSMTPServer1CommandSAML(ASender: TIdCommand);
    procedure IdSMTPServer1CommandSEND(ASender: TIdCommand);
    procedure IdSMTPServer1CommandSOML(ASender: TIdCommand);
    procedure IdSMTPServer1CommandTURN(ASender: TIdCommand);
    procedure IdSMTPServer1CommandVRFY(ASender: TIdCommand);
    procedure btnServerOnClick(Sender: TObject);
    procedure btnServerOffClick(Sender: TObject);
    procedure IdSMTPServer1CheckUser(ASender: TIdCommand;
      var Accept: Boolean; Username, Password: String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.IdSMTPServer1CommandAUTH(AThread: TIdPeerThread;
const CmdStr: String);
begin
 // This is where you would process the AUTH command - for now, we send a error
 AThread.Connection.Writeln(IdSMTPServer1.Messages.ErrorReply);
end;

procedure TForm1.IdSMTPServer1CommandQUIT(AThread: TIdPeerThread);
begin
// Process any logoff events here - e.g. clean temp files
end;

procedure TForm1.IdSMTPServer1CommandX(AThread: TIdPeerThread;
  const CmdStr: String);
begin
 // You can use this for debugging :)
 // It should be noted, that no standard clients ever send this command.
end;

procedure TForm1.IdSMTPServer1CommandMAIL(const ASender: TIdCommand;
  var Accept: Boolean; EMailAddress: String);
Var
 IsOK : Boolean;
begin
 // This is required!
 // You check the EMAILADDRESS here to see if it is to be accepted / processed.
 IsOK := False;
 if Pos('@', EMailAddress) > 0 then   // Basic checking for syntax
  IsOK := True;

 // Set Accept := True if its allowed
 if IsOK then
  Accept := True
 Else
  Accept := False;
end;

procedure TForm1.IdSMTPServer1CommandRCPT(const ASender: TIdCommand;
  var Accept, ToForward: Boolean; EMailAddress: String;
  var CustomError: String);
Var
 IsOK : Boolean;
begin
 // This is required!
 // You check the EMAILADDRESS here to see if it is to be accepted / processed.
 // Set Accept := True if its allowed
 // Set ToForward := True if its needing to be forwarded.
 IsOK := False;
 if Pos('@', EMailAddress) > 0 then   // Basic checking for syntax
  IsOK := True
 Else
  CustomError := '500 No at sign'; // If you are going to use the CustomError property, you need to include the error code
                                   // This allows you to use the extended error reporting.

 // Set Accept := True if its allowed
 if IsOK then
  Accept := True
 Else
  Accept := False;
end;

procedure TForm1.IdSMTPServer1ReceiveRaw(ASender: TIdCommand;
  var VStream: TStream; RCPT: TIdEMailAddressList;
  var CustomError: String);
begin
// This is the main event for receiving the message itself if you are using
// the ReceiveRAW method
// The message data will be given to you in VSTREAM
// Capture it using a memorystream, filestream, or whatever type of stream
// is suitable to your storage mechanism.
// The RCPT variable is a list of recipients for the message
end;

procedure TForm1.IdSMTPServer1ReceiveMessage(ASender: TIdCommand;
  var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
  var CustomError: String);
begin
// This is the main event if you have opted to have idSMTPServer present the message packaged as a TidMessage
// The AMessage contains the completed TIdMessage.
// NOTE: Dont forget to add IdMessage to your USES clause!

ToLabel.Caption := AMsg.Recipients.EMailAddresses;
FromLabel.Caption := AMsg.From.Text;
SubjectLabel.Caption := AMsg.Subject;
Memo1.Lines := AMsg.Body;

// Implement your file system here :)
end;

procedure TForm1.IdSMTPServer1ReceiveMessageParsed(ASender: TIdCommand;
  var AMsg: TIdMessage; RCPT: TIdEMailAddressList;
  var CustomError: String);
begin
// This is the main event if you have opted to have the idSMTPServer to do your parsing for you.
// The AMessage contains the completed TIdMessage.
// NOTE: Dont forget to add IdMessage to your USES clause!

ToLabel.Caption := AMsg.Recipients.EMailAddresses;
FromLabel.Caption := AMsg.From.Text;
SubjectLabel.Caption := AMsg.Subject;
Memo1.Lines := AMsg.Body;

// Implement your file system here :)

end;

procedure TForm1.IdSMTPServer1CommandHELP(ASender: TIdCommand);
begin
// here you can send back a lsit of supported server commands
end;

procedure TForm1.IdSMTPServer1CommandSAML(ASender: TIdCommand);
begin
// not really used anymore - see RFC for information
end;

procedure TForm1.IdSMTPServer1CommandSEND(ASender: TIdCommand);
begin
// not really used anymore - see RFC for information
end;

procedure TForm1.IdSMTPServer1CommandSOML(ASender: TIdCommand);
begin
// not really used anymore - see RFC for information
end;

procedure TForm1.IdSMTPServer1CommandTURN(ASender: TIdCommand);
begin
// not really used anymore - see RFC for information
end;

procedure TForm1.IdSMTPServer1CommandVRFY(ASender: TIdCommand);
begin
// not really used anymore - see RFC for information
end;

procedure TForm1.btnServerOnClick(Sender: TObject);
begin
 btnServerOn.Enabled := False;
 btnServerOff.Enabled := True;
 IdSMTPServer1.active := true;
end;

procedure TForm1.btnServerOffClick(Sender: TObject);
begin
 btnServerOn.Enabled := True;
 btnServerOff.Enabled := False;
 IdSMTPServer1.active := false;
end;

procedure TForm1.IdSMTPServer1CheckUser(ASender: TIdCommand;
  var Accept: Boolean; Username, Password: String);
begin
  Accept:= False;
  if ((UserName = 'kedr@teslacharge.homeip.net') and (Password = '1234')) then
  Accept:= True;
end;

end.



И код POP3 Сервера:
Код

{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence                                   }
{ Team Coherence is Copyright 2002 by Quality Software Components      }
{                                                                      }
{ For further information / comments, visit our WEB site at            }
{ http://www.TeamCoherence.com                                         }
{**********************************************************************}
{}
{ $Log:  22918: MainFrm.pas 
{
{   Rev 1.2    25/10/2004 22:49:28  ANeillans    Version: 9.0.17
{ Verified
}
{
{   Rev 1.1    12/09/2003 21:18:36  ANeillans
{ Verified with Indy 9 on D7.
{ Added instruction memo.
}
{
{   Rev 1.0    10/09/2003 20:40:48  ANeillans
{ Initial Import (Used updated version - not original 9 Demo)
}
{
  Demo Name:  POP3 Server
  Created By: Siamak Sarmady
          On: 27/10/2002

  Notes:
   Demonstrates POP3 server events (by way of comment - NOT functional!)

  Version History:
   12th Sept 03: Andy Neillans
                 Added the comments memo on the form for information.
   8th July 03:  Andy Neillans
                 Fixed the demo for I9.014
   Unknown:      Allen O'Neill
                 Added in some missing command handler comments

  Tested:
   Indy 9:
     D5:     Untested
     D6:     Untested
     D7:     25th Oct 2004 by Andy Neillans
             Tested with Telnet and Outlook Express 6
}
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPServer, IdPOP3Server, StdCtrls;

type
  TfrmMain = class(TForm)
    btnExit: TButton;
    IdPOP3Server1: TIdPOP3Server;
    moComments: TMemo;
    procedure btnExitClick(Sender: TObject);
    procedure IdPOP3Server1Connect(AThread: TIdPeerThread);
    procedure FormActivate(Sender: TObject);
    procedure IdPOP3Server1CheckUser(AThread: TIdPeerThread;
      LThread: TIdPOP3ServerThread);
    procedure IdPOP3Server1DELE(ASender: TIdCommand; AMessageNum: Integer);
    procedure IdPOP3Server1Exception(AThread: TIdPeerThread;
      AException: Exception);
    procedure IdPOP3Server1LIST(ASender: TIdCommand; AMessageNum: Integer);
    procedure IdPOP3Server1QUIT(ASender: TIdCommand);
    procedure IdPOP3Server1RETR(ASender: TIdCommand; AMessageNum: Integer);
    procedure IdPOP3Server1RSET(ASender: TIdCommand);
    procedure IdPOP3Server1STAT(ASender: TIdCommand);
    procedure IdPOP3Server1TOP(ASender: TIdCommand; AMessageNum,
      ANumLines: Integer);
    procedure IdPOP3Server1UIDL(ASender: TIdCommand; AMessageNum: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}

//If user presses exit button close socket and exit
procedure TfrmMain.btnExitClick(Sender: TObject);
begin
 if IdPop3Server1.Active=True then
  IdPop3Server1.Active:=False;
 Application.Terminate;
end;

procedure TfrmMain.IdPOP3Server1Connect(AThread: TIdPeerThread);
begin
// When a clinet connects to our server we must reply with +OK, or -ERR
// Set this via Greeting.Text at runtime, or possibly in OnBeforeCommandHandler?
// You may also wish to initialise some global vars here, set the POP3 box to locked state, etc.
end;

//Activate the server socket when activating server main window.
procedure TfrmMain.FormActivate(Sender: TObject);
begin
 IdPop3Server1.Active:=True;
end;

// This is where you validate the user/pass credentials of the user logging in
procedure TfrmMain.IdPOP3Server1CheckUser(AThread: TIdPeerThread;
  LThread: TIdPOP3ServerThread);
begin
// LThread.Username -> examine this for valid username
// LThread.Password -> examine this for valid password
// if the user/pass pair are valid, then respond with
// LThread.State := Trans
// to reject the user/pass pair, do not change the state
 LThread.State := Trans;
end;

// This is where the client program issues a delete command for a particular message
procedure TfrmMain.IdPOP3Server1DELE(ASender: TIdCommand;
  AMessageNum: Integer);
begin
// if the message has been deleted, then return a success command as follows;
// ASender.Thread.Connection.Writeln('+OK - Message ' + IntToStr(AMessageNum) + ' Deleted')
// otherwise, if there was an error in deleting the message, or the message number
// did not exist in the first place, then return the following:
// ASender.Thread.Connection.Writeln('-ERR - Message ' + IntToStr(AMessageNum) + ' not deleted because.... [reason]')

// Usually, messages are deleted after being retrieved from pop3 server
// This is done when client sents DELE command after retrieving a message
// Client command is something like DELE 1 which means delete message 1

// Note, you should not actually delete the message at this point, just mark it as deleted.
// Deletions should be handled at the QUIT event.

 ASender.Thread.Connection.WriteLn('+OK message 1 deleted');
end;

procedure TfrmMain.IdPOP3Server1Exception(AThread: TIdPeerThread;
  AException: Exception);
begin
// Handle any exceptions given by the thread here
end;

//before retrieving messages, client asks for a list  of messages
//Server responds with a +OK followed by number of deliverable
//messages and length of messages in bytes. After this a separate
//list of each message and its length is sent to client.
//here we have only one message, but we can continue with message
//number and its length , one per line and finally a '.' character.
//Format of client command is  LIST
procedure TfrmMain.IdPOP3Server1LIST(ASender: TIdCommand;
  AMessageNum: Integer);
begin
// Here you return a list of available messages to the client
 ASender.Thread.Connection.WriteLn('+OK 1 40');
 ASender.Thread.Connection.WriteLn('1 40');
 ASender.Thread.Connection.WriteLn('.');
 // The trailing . line is IMPORTANT!!
end;

procedure TfrmMain.IdPOP3Server1QUIT(ASender: TIdCommand);
begin
// This event is triggered on a client QUIT (a correct disconnect)
// Here you should delete any messages that have been marked with DELE.

// NOTE: The +OK response is AUTOMATICALLY sent back to the client, and the connect dropped.
end;

procedure TfrmMain.IdPOP3Server1RETR(ASender: TIdCommand;
  AMessageNum: Integer);
begin
 // Client initiates retrieving each message by issuing a RETR command
 // to server. Server will respond by +OK and will continue by sending
 // message itself. Each message is saved in a database uppon arival
 // by smtp server and is now delivered to user mail agent by pop3 server.
 // Here we do not read mail from a storage but we deliver a sample
 // mail from inside program. We can deliver multiple mails using
 // this method.  Format of RETR command is something like
 // RETR 1 or RETR 2 etc.
 ASender.Thread.Connection.WriteLn('+OK 40 octets');
 ASender.Thread.Connection.WriteLn('From: demo@projectindy.org');
 ASender.Thread.Connection.WriteLn('To: you@yourdomain.com ');
 ASender.Thread.Connection.WriteLn('Subject: Hello ');
 ASender.Thread.Connection.WriteLn('');
 ASender.Thread.Connection.WriteLn('Hello world! This is email body.');
 ASender.Thread.Connection.WriteLn('.');
end;

procedure TfrmMain.IdPOP3Server1RSET(ASender: TIdCommand);
begin
// here is where the client wishes to reset the current state
// This may be used to reset a list of pending deletes, etc.
end;

procedure TfrmMain.IdPOP3Server1STAT(ASender: TIdCommand);
begin
// here is where the client has asked for the Status of the mailbox
//When client asks for a statistic of messages server will answer
//by sending an +OK followed by number of messages and length of them
//Format of client message is STAT
 ASender.Thread.Connection.WriteLn('+OK 1 40');
end;

procedure TfrmMain.IdPOP3Server1TOP(ASender: TIdCommand; AMessageNum,
  ANumLines: Integer);
begin
// This is where the cleint has requested the TOP X lines of a particular
// message to be sent to them
end;

procedure TfrmMain.IdPOP3Server1UIDL(ASender: TIdCommand;
  AMessageNum: Integer);
begin
// This is where the client has requested the unique identifier (UIDL) of each
// message, or a particular message to be sent to them.
end;

end.



В настройках TheBat указываю:
SMTP-сервер: 192.168.0.1
Почт.-сервер: 192.168.0.1
Пользователь: - вообще не понятно где его на сервере прописывать поэтому пустой
Пароль: - тоже соответственно пусто

Помогите пожалуйста, что делаю не так ??

Автор: Letov 24.4.2008, 13:13
А если в настройках TheBat указать
SMTP-сервер: 127.0.0.1
Почт.-сервер: 127.0.0.1

или

SMTP-сервер: localhost
Почт.-сервер: localhost
?

Вдруг поможет...

Автор: php 28.4.2008, 04:04
>Letov
Нет это не помогло !

Автор: php 6.5.2008, 12:43
Ну так что господа товарищи больше нет вариантов, у меня осталась последняя надежда на DNS сервер который идёт в поставке Indy10, или ещё могут быть какие то варианты ??

Автор: Snowy 6.5.2008, 15:36
Есть вариант. Причём один.
Написать SMTP сервер, а потом POP3 сервер.
А пытаться заставить работать примеры в качестве сервера - дохлый номер.
Они лишь демонстрируют, где и что нужно написать. И не являются серверами.
А, чтобы написать сервера, нужно хотя бы иметь представление о том, как они работают.

Автор: php 7.5.2008, 04:30
Блин опять давдцать пять начинается !!, а говорю что они должны работать для чего они тогда там нужны эти компоненты?? у кого-то же они работают или я не прав ??

Автор: Snowy 7.5.2008, 15:23
Компоненты реализуют только сетевую часть.
SMTP сервер принимает почту, POP3 раздаёт.
А вот что делать с почтой, где хранить, как пересылать, где база пользователей и т.д. - это уже задача программиста.
Видишь, примеры все в комментариях?
Там написано "тут сделать то-то, а тут это..."

А тестовый пример выполняет следующие действия:
SMTP: клиенту: "Ок, принял". На экран: "Пришло письмо от ...". Само письмо тут же уничтожается.
POP3: "Хочешь письмо? Ну лови: 'Hello world! This is email body.'

Так что снова повторюсь - сначала нужно понимать, как работает SMTP и POP3.
И добавлю - ты хоть код читай...

Автор: php 8.5.2008, 04:19
Это всё понятно комментарии я читать умею даже на английском,
у меня загвоздка (может это ипокажется смешным даже) в имени почтового ящика которое идёт после знака @ это даже не имя а MX запись - DNS имя для расрознавания сервера откуда пришла, была получена почта. Он поэтому видимо и не отправляет т.к MX запись не задействована.. Давайте сначала разберёмся с отправкой писем с приёмом почты потом разберёмся, пока что хотябы, что-то одно нормально делалось Й
 
Так что вы скажете как её задать эту MX запись, включить DNS или что ??

Добавлено через 1 минуту и 5 секунд
Да и ещё 
SMTP сервер не принимает почту он её как раз раздаёт !!.

Автор: Snowy 8.5.2008, 13:27
Ты не поверишь, но SMTP сервер именно принимает почту.
А раздаёт POP3 сервер.
Клиент же наоборот - SMTP отправляет, а POP3 принимает.

Итак SMTP сервер.
К нему подключается SMTP клиент и передаёт письмо.
SMTP сервер его принял.
Всё. На этом функции SMTP сервера закончились и начинаешь действовать ты.
Типичная картина действий:
Анализируем домен. Если наш, проверяем наличие данного ящика. Ящик есть - кладём письмо в него.
Реализация хранения - дело программиста. Если такого ящика нет - отправляем в ответ ошибку.
Далее. Домен не наш. Значит мы relay сервер. Просто передаём это письмо нашему SMTP клиенту, который его доставит по адресу.
Под нашим клиентом, я подразумеваю SMTP клиент, встроенный в наш сервер. Именно SMTP клиент рассылает почту. SMTP сервер только принимает. Поэтому, для сквозного проброса несвоей почты, в него встраивается SMTP клиент, который и пошлёт письмо дальше другому SMTP серверу.

Букварь окончен. Сначала изучи вопрос и принципы работы почтовых серверов и клиентов.
В указанном выше примере нет никаких намёков на SMTP клиент. Поэтому сервер никому и ничего не отправляет - он сервер. Он только отвечает на запросы, а не инициирует их.
Для инициации запросов, ему необходим клиентский функционал.
И есть в DNS MX или нет - это уже твоя задача. Будешь ты отсылать по DNS или через relay - это уже нужно реализовывать самому. Ручками. TIdSMTPClient.

Автор: php 12.5.2008, 03:42
Ну вот теперь картина более менее прояснилась, а то всё вокруг да около,
неужели нельзя сразу так ответить было ??, а то я целый месяц "мозги пропарил" и себе и вам !

Но вопрос пока не решён..

Автор: php 13.5.2008, 05:24
В общем отправить почту кое как удалось через SMTP Relay, но при отправке выдаёт интересное сообщение: 
5.7.1 <vitia@bubuka.ru>... Relaying denied. IP name possibly forget [132.56.178.9]

Что это может быть и из-за чего ?

Автор: php 16.5.2008, 12:28
Нда в общем с Relay сервером всё ясно отправлят всё подряд причём с любых адресов, ИПишники в чёрный список летят только "шум стоит" (хорошо подходит для рассылки спама), можно ли как-то нормально отправить почту, чтоб уж наверняка дошло до адресата ?? (DNS сервер и MX запись уже настроены..)

Автор: spyrivne 26.2.2009, 18:27
Цитата(php @ 24.4.2008,  04:40)
 могу если, что и для версии 10 выложить если нужно будет..


виложи будь-ласка і для 10 версії

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)