Avatar billede martinr Nybegynder
28. januar 2010 - 19:21 Der er 6 kommentarer og
1 løsning

Problemer med at sende mails med Indy fra en Hotmail account

Hej eksperter

Jeg har efterhånden fået lavet et ret omfattende program, hvor man bl.a. kan sende mails med vedhæftede dokumenter med sin egen mail som afsender, og hvor man også kan vælge at bruge SSL med brugernavn/adgangskode, samt definere host og portnummer. Jeg bruger Indy (version 9.0) komponent-klasserne TIdSMTP, TIdMessage, TIdAntiFreeze og TIdSSLIOHandlerSocket til at sende mails med.

Det virker helt fint med en GMail account (jeg har brugt det mange gange uden problemer), men efter adskillige test med en Hotmail account kan jeg ikke få det til at funke. Jeg får hver gang en fejldialogboks oftest med teksten "Error connecting with SSL." Jeg har prøvet med forskellige port- og host-kombinationer samt selvfølgelig sikret, at brugernavn/adgangskode til SSL-protokollen er korrekt men stadig uden held.

Mit spørgsmål er så, om nogen derude har noget kode, der virker med mail-afsending sammen med Hotmail via Indy, eller om nogen har viden/gode råd mv., der kan løse problemet eller give nye spor?

Jeg kan godt poste kode her, hvis det ønskes, men jeg tror bare ikke helt, det er koden, den er gal med, idet det jo virker fint med GMail.

Spørgsmålet er også, om det kan være noget med åbning/lukning af porte (selvom jeg har haft tjekket det og slået firewall fra)? Jeg er også i tvivl, om der skal bruges speciel SSL-version eller verifikationsfiler eller lignende (har dog ikke testet det)...

Jeg vil også blot lige nævne kort, at jeg også har prøvet med en Webspeed account men desværre også her uden held (samme fejldialogboks hver gang).

Jeg bruger Delphi 7 Enterprise med de indbyggede Indy-komponenter på en Windows XP-platform og på normalt LAN-netværk (direkte uden proxy eller andet).

Jeg håber, nogen af jer kan hjælpe - jeg vil gerne smide flere point i, hvis det er.

På forhånd tak.
Avatar billede kroning Nybegynder
29. januar 2010 - 03:20 #1
Jeg mener at kunne huske at der var problemer med Indy 9 og SSL så prøv at opdatere til nyeste Indy 10
Avatar billede martinr Nybegynder
29. januar 2010 - 18:02 #2
Det lyder som en sandsynlig løsning, men hvordan gør jeg det (kan det installeres i og køre sammen med Delphi?), og er det noget, man bare kan downloade et eller andet sted fra? Jeg bruger blot de Indy-komponenter, der blev installeret sammen med Delphi, og jeg har ikke installeret noget andet specielt selv.

Det ville være dejligt med nogle gode links og meget gerne, hvis det er gratis/open source eller lignende.
Avatar billede kroning Nybegynder
29. januar 2010 - 20:09 #3
Indy er open source og kan hentes her http://www.indyproject.org/index.en.aspx

Jeg bruger også Delphi 7 og har installeret Indy 10 og det kører uden problemer, det var dog ikke helt let at få installeret, jeg var nød til manuelt at fjerne alle gamle Indy filer før installationen af version 10 ville virke.
Avatar billede martinr Nybegynder
22. februar 2010 - 12:35 #4
Så lykkedes det mig endelig at få Indy til at virke også med afsendelse fra en Hotmail account!

Hvis andre er interesserede i at vide hvordan, jeg gjorde, kommer forklaringen her:

1. Først afinstallerede jeg den Indy version, der fulgte med Delphi (i mit tilfælde version 9) - det gjorde jeg via installations-cd'en, hvor jeg valgte modify installation.

2. Derefter hentede jeg den nyeste Indy version (i skrivende stund version 10) fra deres hjemmeside: http://indyproject.org -> klik på Indy.Sockets (VCL) -> Downloads -> Version 10 -> Development Snapshot -> Development Snapshot -> FTP -> klik på ZIP i det nye vindue -> Klik og download IndyTiburon.zip.

3. Så installerede jeg Indy via vejledningen på hjemmesiden (http://www.indyproject.org/Sockets/Docs/Indy10Installation.EN.aspx).

4. Endeligt tilpassede jeg mit projekt til den nye Indy version.

Jeg har lavet et lille kode-eksempel herunder for de interesserede (den nyeste Indy skal være installeret først):

1. Lav et nyt projekt i Delphi og smid en knap på formen.

2. Tilføj IdAntiFreeze, IdAttachmentFile, IdMessage, IdSMTP, IdSSLOpenSSL, IdExplicitTLSClientServerBase, IdTCPClient, IdEMailAddress og SysUtils til uses.

3. Skriv følgende kode i knappens OnClick-event og erstat <...> med egne værdier:

procedure TForm1.Button1Click(Sender: TObject);
const
  TIMEOUT = 3000; //millisekunder
var
  attachmentFileName: AnsiString;
  idSMTP: TIdSMTP;
  idMessage: TIdMessage;
  idAntiFreeze: TIdAntiFreeze;
  idSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  Try
      Screen.Cursor := crHourGlass;
      Application.ProcessMessages;

      attachmentFileName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 'Unit1.pas'; //det her er bare et eksempel men kan i princippet være hvad som helst (dog ikke eksekvérbare filer, f.eks. exe)

      idSMTP := TIdSMTP.Create(Self);
      idMessage := TIdMessage.Create(Self);
      idAntiFreeze := TIdAntiFreeze.Create(Self);
      idSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(Self);

      Try
        //aktivér antifrysning:
        idAntiFreeze.Active := true;
        idAntiFreeze.OnlyWhenIdle := true;
        idAntiFreeze.ApplicationHasPriority := true;
        idAntiFreeze.Process;

        //vedhæft (måske) en fil:
        If FileExists(attachmentFileName) then
            TIdAttachmentFile.Create(idMessage.MessageParts, attachmentFileName);

        //opsæt mailen:
        idMessage.UseNowForDate := true;
        idMessage.Subject := <Skriv et emne her>;
        idMessage.Body.Text := <Skriv indholdet her>;
        idMessage.From.Text := <Skriv din hotmail-adresse her>;
        idMessage.Recipients.EMailAddresses := <Skriv en modtager mail-adresse her>;
        idMessage.ReceiptRecipient.Text := idMessage.From.Text;
        idMessage.ReplyTo.Add.Text := idMessage.From.Text;

        //opsæt SSL:
        idSSLIOHandlerSocketOpenSSL.ConnectTimeout := TIMEOUT;
        idSSLIOHandlerSocketOpenSSL.ReadTimeout := TIMEOUT;
        idSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvSSLv3;
        idSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;
        idSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyMode := [];
        idSSLIOHandlerSocketOpenSSL.SSLOptions.VerifyDepth := 0;

        //opsæt det tekniske:
        idSMTP.ReadTimeout := TIMEOUT;
        idSMTP.ConnectTimeout := TIMEOUT;
        idSMTP.Port := 587;
        idSMTP.Host := 'smtp.live.com';
        idSMTP.AuthType := satDefault;
        idSMTP.Username := <Skriv igen din hotmail-adresse her eller hent den via idMessage.From.Text>;
        idSMTP.Password := <Skriv dit password til Hotmail her - det samme man normalt logger ind med>;
        idSMTP.IOHandler := idSSLIOHandlerSocketOpenSSL; //brug SSL
        idSMTP.UseTLS := utUseExplicitTLS;

        //send mailen:
        idSMTP.Connect;
        idSMTP.Send(idMessage);

        //mailen er nu sendt - vis en dialogboks:
        Application.MessageBox('E-mailen er nu sendt!', 'Succesfuld afsendelse', MB_ICONINFORMATION + MB_OK);
        If idSMTP.Connected then idSMTP.Disconnect;
      Finally
        idSMTP.Free;
        idMessage.Free;
        idAntiFreeze.Free;
        idSSLIOHandlerSocketOpenSSL.Free;

        Screen.Cursor := crDefault;
        Application.ProcessMessages;
      End;
  Except
      On E: Exception do Application.ShowException(E); //hvis der opstår fejl i afsendelsen eller noget andet, vises denne fejl-dialogboks
  End;
end;

Hvis eksemplet ikke lige skulle virke, så prøv igen eller prøv evt. at ændre på idSSLIOHandlerSocketOpenSSL.SSLOptions.Method, idSSLIOHandlerSocketOpenSSL.SSLOptions.Mode, idSMTP.UseTLS eller TIMEOUT. Husk selvfølgelig at tjekke at brugernavn, password, port og host er angivet korrekt.

Det kan også være, Indy-versionen ikke virker selvom det er den nyeste. Som de skriver på deres hjemmeside, arbejder de hele tiden på det, og man kan være uheldig at hente en ufærdig version. Så skal man bare vente lidt og så prøve at hente og installere den nyeste Indy igen.

Endelig kan det selvfølgelig være noget andet teknisk, f.eks. forkerte eller manglende indstillinger i routeren eller noget sikkerhedsmæssigt, der kan drille. Man kan evt. undersøge router-indstillinger eller prøve fra en anden computer.

kroning: tak for hjælpen - gider du venligst smide et svar, så du kan få pointene?
Avatar billede kroning Nybegynder
22. februar 2010 - 17:13 #5
oki
Avatar billede bolorolo Nybegynder
05. november 2014 - 10:02 #6
Jeg vil lige høre til denne, for det er rigtig god kode og noget man virkelig kan lære fra hvis man er ny til indy componenterne.

Når nu man bruger TLS, fordre det så ikke når man skal distribuere sit program at der kommer en TLS dll fil med?

Det er ihvertfald hvad jeg kan læse mig frem til, jeg syntes dog det virker underligt at der ikke findes et mail component til TLS/SSL som ikke kræver en ekstern dll fil.
Avatar billede kroning Nybegynder
05. november 2014 - 11:43 #7
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