Avatar billede cautoo Nybegynder
19. marts 2003 - 16:50 Der er 20 kommentarer og
2 løsninger

SMTP ting

Nogen som har erfaring med hvordan man laver en SMTP ting, altså den del som sender en email til en e-mail adresse?? og som måske vil dele lidt af sin viden?

Jeg har kigget lidt på det, kan det passe at, hvis jeg vil sende til min egen e-mail, som er dennis.ssh@pc.dk , så skal man kontakte pc.dk eller hvad? og hvad for en port og hvad skal man sige til den?
Avatar billede dkn Nybegynder
19. marts 2003 - 17:34 #1
der ligger fx en demo i din delphi\demos\netmasters
Avatar billede cautoo Nybegynder
19. marts 2003 - 17:43 #2
hmm.... jeg har delphi 6, jeg kan ikk finde nogen netmasters
Avatar billede stoney Nybegynder
19. marts 2003 - 18:22 #3
delphi\demos\fastnet

ellers brug Indy
www.nevrona.com/indy

Stoney
Avatar billede dkn Nybegynder
19. marts 2003 - 18:43 #4
fastnet det er sandt sorry
Avatar billede cautoo Nybegynder
19. marts 2003 - 19:11 #5
grunden til jeg spurgte om hvordn man gør, er fordi jeg vil lave det SELV og fra brunden!!!
Avatar billede dkn Nybegynder
19. marts 2003 - 20:11 #6
ok hvis du vil det skal du tilføve winsock til uses, Læse en del i hjælpen finde smtp protocol på nettet, og så er du ellers igang.....
Avatar billede cautoo Nybegynder
19. marts 2003 - 20:18 #7
jatak :), jeg har læst nogle af de der rfc dokumenter og har lært en del om hvad de skal sende til hinanden, men mangler stadig en del info for at kunne komme igang, eks. det spg som jeg skrev aller først
Avatar billede dkn Nybegynder
19. marts 2003 - 20:24 #8
du skal kontakte din mail server, smtp.mail.dk er der jo nok chancer for at du har.
Avatar billede cautoo Nybegynder
19. marts 2003 - 20:35 #9
høøøø... det er jo mailserveren jeg vil lave!!! altså så jeg kan sende uafhængi af en mailserver
Avatar billede dkn Nybegynder
19. marts 2003 - 21:27 #10
ja det havde jeg også på fornemelsen, men du er ikke særlig god til det med formulering
Avatar billede cautoo Nybegynder
19. marts 2003 - 21:44 #11
sorry
Avatar billede doc404 Novice
20. marts 2003 - 19:25 #12
Når du sender til f.eks. bob@bygge.dk skal din SMTP server først finde IP adressen på mailserveren hos bygge.dk. Dette gøres ved at lave et DNS opslag efter MX recorden hos den DNS server, der er ansvarlig for bygge.dk domænet. Derefter kan den lave en TCP/IP connection og sende SMTP kommandoer.

Jeg mener du kan finde eksempler på, hvordan du laver et MX query i Indy komponenterne.
Avatar billede cautoo Nybegynder
21. marts 2003 - 14:37 #13
hmm... jeg kan ikke lige finde det MX eksempel?
Avatar billede doc404 Novice
21. marts 2003 - 23:26 #14
Drop en Edit,Memo og en Button på en form og sæt følgende kode ind.

Indtast f.eks. info@jubii.dk i Edit'en og tryk på knappen.

I Memo'en får du nu HOST navnet på den/de mailservere til domainet.

Eksemplet er stjålet råt (en smule modificeret) fra Google, men giver et godt billed af, hvordan det fungerer


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient,
  IdDNSResolver;

type
  TForm1 = class(TForm)
    dns: TIdDNSResolver;
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMXResolver = class(TIdDNSResolver)
  private
    FMailDomain: string;
    FDNSHost: string;
    FMXList: TStringList;
    FMXCache: TStringList;
    procedure SetMailDomain(const Value: string);
    procedure SetMXList(const Value: TStringList);
    procedure SetDNSHost(const Value: string);
    procedure CheckDomainCache(ADest: TStrings);
    procedure AddDomainToCache;
  protected
  public
    constructor Create(const AMailDomain, ADNSHost: string); overload;
    destructor Destroy; override;
    procedure MXResolve; overload;
    procedure MXResolve(ATimeOut: integer); overload;

    property MailDomain: string read FMailDomain write SetMailDomain;
    property MXList: TStringList read FMXList write SetMXList;
    property DNSHost: string read FDNSHost write SetDNSHost;
    property MXCache: TStringList read FMXCache write FMXCache;
  end;


var
  Form1: TForm1;

implementation

{$R *.DFM}

{
TMXResolver ----------------------------------------------------------------
}
procedure TMXResolver.AddDomainToCache;
var
  s: string;
  i: integer;
begin
  s:='';
  for i:=0 to MXList.Count-1 do begin
    s:=s+MXList[i]+',';
  end;

  // remove the trailing comma
  if length(s)>0 then begin
    setlength(s, length(s)-1);
  end;

  MXCache.Add(MailDomain+':'+s);
end;


// Cache format:
// domain: mx1, mx2, mx3 ....
procedure TMXResolver.CheckDomainCache(ADest: TStrings);
var
  i: integer;
  s: string;
begin
  // Inits...
  ADest.Clear;

  // Check if the mail domain is in the cache already
  for i:=0 to MXCache.count-1 do begin
    s:=MXCache[i];

    if pos(MailDomain+':', s)=1 then begin
      // we have the domain in the cache, so extract the mx's and add to the MXList
      // Delete up to the ":"
      delete(s, 1, pos(':', s));
      s:=trim(s);

      // what we have left is a comma separated list, so just assign to dest
      ADest.CommaText:=s;

      Break; { from for loop }
    end;
  end;
end;

constructor TMXResolver.create(const AMailDomain, ADNSHost: string);
begin
  inherited create(nil);

  FMXList:=TStringList.Create;
  FMXCache:=TStringList.Create;

  SetMailDomain(AMailDomain);
  SetDNSHost(ADNSHost);
end;

destructor TMXResolver.Destroy;
begin
  FreeAndNil(FMXList);
  FreeAndNil(FMXCache);
  inherited;
end;

// -mw- Resolve the MX lookups for the already given domain
procedure TMXResolver.MXResolve(ATimeOut: integer);
var
  i: integer;
  p: integer;
  slServers: TStringList;
begin
  QueryResult.Clear;
  Host:=FDNSHost;

  ReceiveTimeout:=ATimeOut;
  AllowRecursiveQueries:=True;
  QueryRecords:=[qtMX];

  if not assigned(FMXList) then
    FMXList:=TStringList.Create;
  if not assigned(FMXCache) then
    FMXCache:=TStringList.Create;

  // Check for domain in the cache.
  CheckDomainCache(FMXList);

  if FMXList.Count>0 then begin
    // we have found the domain in the cache, so we can get outta here
    // -- FMXList.Add('Debug: domain in cache');
    Exit;
  end;

  try
    Resolve(MailDomain);
  except
    on e: exception do begin
      raise exception.create('RES: '+e.message+' >> '+MailDomain);
    end;
  end;

  if (QueryResult.Count>0) then begin
    slServers:=TStringList.create;
    try
      // used to sort Exchange server by Preference for all MX records
      slServers.Sorted:=true;
      slServers.Duplicates:=dupAccept;

      // DNS MX query can return results other than MX...
      // - check the resource record type,
      // - cast the item as TMXRecord, then
      // - add the item to the stringlist hcih will order by preference
      for i:=0 to QueryResult.Count-1 do
      begin
        if (QueryResult.Items[i] is TMXRecord) then
          with TMXRecord(QueryResult.Items[i]) do
            slServers.Append(Format('%2.2d=%-s', [Preference,
ExchangeServer]));
      end;

      // Having got an ordered list of MX servers, copy the
      // server part of the string to the MXList
      for i := 0 to slServers.Count-1 do
      begin
        p:=Pos('=', slServers.Strings[i]);
        if p>0 then begin
          FMXList.Append(Copy(slServers.Strings[i], p+1,
Length(slServers.Strings[i])));
        end;
      end;

      // Add the data to the cache string list
      AddDomainToCache;

      FMXList.Add('Debug: domain not in cache');

    finally
      FreeAndNil(slServers);
    end;
  end else begin
    // no MX results
  end;
end;

// Resolve with a default timeout.
procedure TMXResolver.MXResolve;
begin
  // call the other resolve with a default timeoue of 6s
  MXResolve(6000);
end;

procedure TMXResolver.SetDNSHost(const Value: string);
begin
  FDNSHost := Value;
end;

procedure TMXResolver.SetMailDomain(const Value: string);
var
  p: integer;
begin
  FMailDomain := trim(Value);

  // If Value has more than just the domain ie it is a full e-mail address, trim to the @
  p:=pos('@', FMailDomain);
  if (p>0) then begin
    delete(FMailDomain, 1, p);
  end;
end;


procedure TMXResolver.SetMXList(const Value: TStringList);
begin
  FMXList := Value;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  mx : TMXResolver;
  i  : integer;
begin
  mx := TMXResolver.Create(Edit1.Text,'62.61.130.1');
  mx.MXResolve;
  for i := 0 to mx.MXList.Count - 1 do
  begin
    Memo1.Lines.Add(mx.MXList[i]);
  end;
  mx.Free;
end;

end.
Avatar billede doc404 Novice
21. marts 2003 - 23:29 #15
Grunden til du normalt får mere en 1 mail server er, at man normalt angive mindst 2 MX records. En der peger direkte på ens mailserver og en backup, der peger på en som kan tage over, hvis nr. 1 er nede.
Avatar billede cautoo Nybegynder
22. marts 2003 - 14:11 #16
hvad er QueryResult for ngoet??
Avatar billede cautoo Nybegynder
22. marts 2003 - 14:12 #17
jeg kan ikke få scriptet til at virke pga. den!
Avatar billede doc404 Novice
22. marts 2003 - 17:05 #18
du skal også have en DNS component fra Indy på. Jeg benytter selv Indy version 9.
Avatar billede cautoo Nybegynder
22. marts 2003 - 17:06 #19
den har jeg QueryResult??
Avatar billede cautoo Nybegynder
22. marts 2003 - 17:07 #20
der skulle stå,

den har jeg også fundet ud af, men den giver ikke QueryResult??
Avatar billede doc404 Novice
22. marts 2003 - 17:37 #21
Hvilken version af Indy bruger du?
Avatar billede cautoo Nybegynder
22. marts 2003 - 18:13 #22
hmm... ved det ikk helt, prøvede at installere 9! men den vil ikke!, den siger det ikke er en design-etellerandet, jeg går ud fra den mener at det ikke er et komponent! selvom jeg bruger den der hedder Indyd6.bpl eller sådan noget!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester