Results 1 to 11 of 11

Thread: Intraweb mail verzenden

  1. #1

    Intraweb mail verzenden

    Hallo,
    Ik wil mails verzenden vanuit een Delphi/Intraweb app.
    Dit werkt prima in debug maar niet als service.
    Zou gauw ik contact maak met outlook loopt de service vast en kan ik deze zelfs niet meer stoppen.
    Dit moet dan via taakbeheer.
    Alles draait als admin.
    Onderstaand de code en hij loopt vast op de 1e regel (get...)
    Als je me kunt helpen, graag : Dank

    Code:
    var  OutlookApp: OLEvariant;
    begin
      try
        OutlookApp := GetActiveOleObject('Outlook.Application');
      except
        try
          OutlookApp := CreateOleObject('Outlook.Application');
        except

  2. #2
    Je zegt 'alles draait als admin'. Geldt dat ook voor Outlook?

    In deze post op Stack Overflow krijgt iemand een fout als hij dit probeert als admin, omdat Outlook in een andere security context draait.

    Outlook draait bovendien single instance, dus CreateOleObject doet in basis al wat jij hier zelf hebt uitgeschreven: verbinden met die open instantie, en een nieuwe starten als die er niet is.

    -edit-

    Helemaal over dat 'service' heen gekeken. Gelukkig hebben we VideoRipper nog
    Last edited by GolezTrol; 10-Jan-23 at 15:24.
    1+1=b

  3. #3
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Je zegt het eigenlijk zelf al: in normale modus werkt het wel, in een service niet en dat komt omdat een service (en alles wat het aanroept) oa. geen toegang tot de desktop heeft, tenzij je dit expliciet zo instelt.

    Voor een uitgebreidere uitleg, zie oa. dit MS Support artikel: Considerations for server-side Automation of Office

    Overigens zou het gebruik van Outlook voor zoiets eenvoudigs als het verzenden van e-mail mijn allerlaatste keuze zijn, maar dit terzijde.
    TMemoryLeak.Create(Nil);

  4. #4
    Dankjewel beiden.
    Ga het uitzoeken... maar wat zou jij kiezen VideoRipper?
    Ik heb het ook "simpel geprobeerd" maar dat ga een SSL IOhandler is required for this setting
    SMTP: TidSMTP;
    MailMessage: TidMessage;
    begin
    SMTP := TidSMTP.Create(nil);
    try
    SMTP.Host := 'smtp.office365.com';
    SMTP.Port := 587;
    smtp.Password := PW;
    smtp.Username := Van;
    smtp.UseTLS := utUseRequireTLS;
    MailMessage := TidMessage.Create;

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Voor SSL heb je een TIdSSLIOHandlerSocketOpenSSL nodig (en de bijbehorende SSL DLL's "libeay32.dll" en "ssleay32.dll"), deze stel je in en haak je aan de IOHandler van de TIdSMTP.

    Ik weet zeker dat er voorbeelden te vinden zijn op het wereldwijde net, maar ik zal kijken of ik snel iets in elkaar kan flansen, mocht een ander mij niet voor zijn.
    TMemoryLeak.Create(Nil);

  6. #6
    Als je beschikking hebt over een SMTP Server en de credentials daarvan, dan zou ik zeker die optie gebruiken.

    Om met SSL te kunnen werken moet je inderdaad twee dingen regelen:

    - Je moet een SSL IO handler hebben. Ik weet niet of er andere zijn, maar ik gebruik de TIdSSLIOHandlerSocketOpenSSL.
    - Je moet, voor de correcte werking van TIdSSLIOHandlerSocketOpenSSL, twee dlls meeleveren met je programma.

    TIdSSLIOHandlerSocketOpenSSL

    TIdSSLIOHandlerSocketOpenSSL zit in de unit IdSSLOpenSSL. Mogelijk heb je nog IdGlobal of andere units nodig voor de enums in onderstaande code.

    Vanuit code kan je die zo maken en inregelen, maar je kan 'm natuurlijk ook op je form of datamodule zetten.
    Waarschijnlijk kan je al die opties zelfs achterwege laten. Die hebben wij om een specifieke hoge SSL versie af te dwingen voor de REST API aanroep waar ik die van heb overgenomen, maar de default is waarschijnlijk goed genoeg.

    Delphi Code:
    1. var Ssl := TIdSSLIOHandlerSocketOpenSSL.Create(FHttpClient);
    2. { // Waarschijnlijk niet nodig
    3.   Ssl.SSLOptions.Method := sslvTLSv1_2; // Default is sslvTLSv1
    4.   Ssl.SSLOptions.SSLVersions := [sslvTLSv1_2]; // Default is [sslvTLSv1]. Dit is iets stricter dan de default.
    5.   Ssl.SSLOptions.Mode := sslmUnassigned; // Default?
    6. }
    7.  
    8.   // En dan toekkennen aan je component. Vermoed dat dat voor smtp ook zo werkt
    9.   smtp.IOHandler := Ssl;

    DLLs

    Dit Embarcadero-artikel over OpenSSL beschrijft dit alles ook, in iets meer detail.
    Daarin staat ook deze link naar een download folder. Van de gedownloade files heb je alleen libeay32.dll en ssleay32.dll nodig. Die kan je (zoals het artikel aanraadt) in je Windows system folders kopiëren (precieze locatie afhankelijk van 32bit of 64bit), maar je kan ze ook bij je eigen programma zetten. Zeker wanneer je een 'standalone' programma hebt, zonder installer, is dat misschien handiger.
    1+1=b

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hier een klein proefprojectje welke gebruik maakt van het SMTP component van Indy.

    NLDSMTP.zip

    Uitpakken, compileren, de genoemde DLL's in dezelfde map als de executable plaatsen en runnen.
    Code is even in elkaar geflanst en niet in den treuren getest, maar op mijn machine en met mijn mail-provider (Ziggo) werkt het.

    Voor de puristen die niet de zip willen downloaden, hier de basis unit:
    Delphi Code:
    1. unit USMTPSend;
    2.  
    3. interface
    4.  
    5. uses
    6.   Windows, Messages, Classes, SysUtils, IdMessage;
    7.  
    8. type
    9.   TBodyFormat = (bfNone, bfPlain, bfRTF, bfHTML);
    10.  
    11. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    12.   const AMessage: TIdMessage; AUseTLS: Boolean = True): Boolean; overload;
    13. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    14.   AFrom: string;
    15.   ARecipients: string; ACCRecipients: string; ABCCRecipients: string;
    16.   ASubject: string;
    17.   const AMessageBody: TStrings; ABodyFormat: TBodyFormat = bfPlain;
    18.   const AAttachments: TStrings = nil): Boolean; overload;
    19. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    20.   AFrom: string; ARecipients: string; ASubject: string;
    21.   const AMessageBody: TStrings; ABodyFormat: TBodyFormat = bfPlain;
    22.   const AAttachments: TStrings = nil): Boolean; overload;
    23.  
    24. implementation
    25.  
    26. uses
    27.   IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdText,
    28.   IdAttachmentFile, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
    29.   IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdSMTP;
    30.  
    31. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    32.   const AMessage: TIdMessage; AUseTLS: Boolean = True): Boolean;
    33. var
    34.   oSMTP: TIdSMTP;
    35. begin
    36.   oSMTP := TIdSMTP.Create(nil);
    37.   try
    38.     oSMTP.Host     := AHost;
    39.     oSMTP.Port     := APort;
    40.     oSMTP.Username := AUserName;
    41.     oSMTP.Password := APassword;
    42.  
    43.     if AUseTLS then
    44.     begin
    45.       oSMTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(oSMTP);
    46.       TIdSSLIOHandlerSocketOpenSSL(oSMTP.IOHandler).SSLOptions.Method := TIdSSLVersion(sslvTLSv1_2);
    47.       oSMTP.UseTLS := TIdUseTLS.utUseExplicitTLS;
    48.     end
    49.     else
    50.       oSMTP.UseTLS := utNoTLSSupport;
    51.  
    52.     try
    53.       oSMTP.Connect;
    54.       try
    55.         if AUseTLS then
    56.           oSMTP.Authenticate;
    57.         oSMTP.Send(AMessage);
    58.         Result := True;
    59.       finally
    60.         oSMTP.Disconnect;
    61.       end;
    62.     except
    63. //      on E: EIdReplyRFCError do
    64.       on E: Exception do
    65.       begin
    66. //        LogException(E);
    67.         Exit(False);
    68.       end;
    69.     end;
    70.  
    71.   finally
    72.     oSMTP.Free;
    73.   end;
    74. end;
    75.  
    76. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    77.   AFrom: string;
    78.   ARecipients: string; ACCRecipients: string; ABCCRecipients: string;
    79.   ASubject: string;
    80.   const AMessageBody: TStrings; ABodyFormat: TBodyFormat = bfPlain;
    81.   const AAttachments: TStrings = nil): Boolean;
    82. var
    83.   oMessage: TIdMessage;
    84.   oText: TIdText;
    85.   iIndex: Integer;
    86. begin
    87.   oMessage := TIdMessage.Create(nil);
    88.   try
    89.     oMessage.From.Text := AFrom;
    90.     oMessage.Recipients.EMailAddresses := ARecipients;
    91.     oMessage.CCList.EMailAddresses := ACCRecipients;
    92.     oMessage.BCCList.EMailAddresses := ABCCRecipients;
    93.     oMessage.Subject := ASubject;
    94.  
    95.     if ABodyFormat = bfPlain then
    96.       oMessage.Body.Assign(AMessageBody)
    97.     else
    98.     begin
    99.       oMessage.Body.Clear;
    100.       oText := TIdText.Create(oMessage.MessageParts, AMessageBody);
    101.       case ABodyFormat of
    102.         bfHTML: oText.ContentType := 'text/html; charset=iso-8859-1';
    103.         bfRTF: oText.ContentType := 'text/enriched';
    104.       else
    105.         oText.ContentType := 'text/plain';
    106.       end;
    107.     end;
    108.  
    109.     if Assigned(AAttachments) and
    110.        (AAttachments.Count > 0) then
    111.       for iIndex := 0 to Pred(AAttachments.Count) do
    112.         if FileExists(AAttachments[iIndex]) then
    113.           TIdAttachmentFile.Create(oMessage.MessageParts, AAttachments[iIndex]);
    114.  
    115.    Result :=  SendEMail(AHost, APort, AUserName, APassword, oMessage);
    116.  
    117.   finally
    118.     oMessage.Free;
    119.   end;
    120. end;
    121.  
    122. function SendEmail(AHost: string; APort: Word; AUserName: string; APassword: string;
    123.   AFrom: string; ARecipients: string; ASubject: string;
    124.   const AMessageBody: TStrings; ABodyFormat: TBodyFormat = bfPlain;
    125.   const AAttachments: TStrings = nil): Boolean;
    126. begin
    127.   Result := SendEmail(AHost, APort, AUserName, APassword,
    128.                       AFrom, ARecipients, '', '', ASubject,
    129.                       AMessageBody, ABodyFormat, AAttachments);
    130. end;
    131.  
    132. end.
    TMemoryLeak.Create(Nil);

  8. #8
    Hartelijk dank, ga ermee aan de slag

  9. #9
    Beetje buiten mijn comfort zone....
    ssleay32.dll en libeay32.dll in exe map.
    Alles meegegeven, host,port, password,username,from en reciepent.
    Maar naar enig wachten volgt EIDsocketerror Socket error # 10060, connection timed out

  10. #10
    Dat kan nog diverse oorzaken hebben, zoals
    - Keuze voor poortnr i.c.m. de UseTLS instelling (zie ook deze).
    - Firewall blokkeert het request
    - Verkeerde SSL versie
    - Langere timeout nodig (trage SMTP server, ligt niet echt voor de hand).
    1+1=b

  11. #11
    Het werkt na de poort aan te passen. Nogmaals dank

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •