Results 1 to 10 of 10

Thread: TIdMessage to-header aanpassen voor verzending

  1. #1
    cyberde
    Guest

    TIdMessage to-header aanpassen voor verzending

    Hoi,

    Ik ben momenteel bezig met een applicatie die mail van een pop3 server sleurt, en deze forward naar een email adres op een exchange server, een simpele forward zou je zeggen.
    Dit alles werkt ook gewoon naar behoren in mijn proof of concept alleen zit ik met het volgende probleem. Bij het verzenden/opslaan als bestand maakt Indy de headers opnieuw aan, op zich geen probleem, maar hij maakt ook de To-header opnieuw aan. Met als gevolg dat de geaddresseerde van het exchange email adres er in staat en er dus niet meer op (origineel) geaddresseerde email adres gesorteerd kan worden.

    Dan denk je, ik pas de To-header aan voor verzending maar hier gaat het mis. Ik heb een afgeleide van TIdMessage gemaakt, de TIdForwardMessage met de functie GenerateHeader (deze maakt de headers aan) en deze ziet er als volgt uit:
    delphi Code:
    1. unit IdForwardMessage;
    2.  
    3. interface
    4.  
    5. uses
    6.   Classes,
    7.   IdMessage;
    8.  
    9. type
    10.   TIdForwardMessage = class(TIdMessage)
    11.   public
    12.     constructor Create;
    13.     destructor Destroy; override;
    14.  
    15.     procedure GenerateHeader;
    16.   end;
    17.  
    18. implementation
    19.  
    20. { TIdForwardMessage }
    21.  
    22. constructor TIdForwardMessage.Create;
    23. begin
    24.   inherited Create;
    25. end;
    26.  
    27. destructor TIdForwardMessage.Destroy;
    28. begin
    29.   inherited Destroy;
    30. end;
    31.  
    32. procedure TIdForwardMessage.GenerateHeader;
    33. var
    34.   ToHeader: string;
    35. begin
    36.   ToHeader:= Self.Headers.Values['To'];
    37.  
    38.   inherited GenerateHeader;
    39.  
    40.   with LastGeneratedHeaders do
    41.   begin
    42.     Values['To'] := ToHeader; {do not localize}
    43.   end;
    44. end;
    45.  
    46. end.
    De GenerateHeader moet worden aangeroepen vanuit de IdMessageClient.SendHeader functie, alleen het probleem is dat hij het vertikt deze afgeleide aan te roepen, daarintegen roept hij de GenerateHeader uit TIdMessage aan.
    delphi Code:
    1. procedure TIdMessageClient.SendHeader(AMsg: TIdMessage);
    2. begin
    3.   AMsg.GenerateHeader;
    4.   IOHandler.Write(AMsg.LastGeneratedHeaders);
    5. end;

    Nu heb ik geprobeerd deze functie te overriden alleen dan krijg ik de volgende melding: "[DCC Error] IdForwardMessage.pas(15): E2170 Cannot override a non-virtual method"

    Hoe kan ik nu het beste te werk gaan? Want ik wil namelijk niet de Indy source gaan aanpassen omdat ik Indy gebruik voor meerdere projecten.

    Iemand een idee?

  2. #2
    cyberde
    Guest
    Ik heb voorlopig een aanpassing gemaakt in TIdMessage zodat ik gebruik kan maken van de ExtraHeaders property, dit kon zonder de aanpassing ook wel maar dan kreeg ik dubbele headers, wat niet echt netjes is

    Maar als jullie nog een oplossing weten voor mijn probleem dan hoor ik het graag.

  3. #3
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Een "override" achter generateheaders kan ook wonderen doen.

  4. #4
    cyberde
    Guest
    Al geprobeerd:

    Quote Originally Posted by cyberde View Post
    Nu heb ik geprobeerd deze functie te overriden alleen dan krijg ik de volgende melding: "[DCC Error] IdForwardMessage.pas(15): E2170 Cannot override a non-virtual method"

  5. #5
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Dan moet je die method met "virtual;" markeren in de originele sources.

  6. #6
    cyberde
    Guest
    Dat werkt dan inderdaad wel, maar dan moet er toch een aanpassing gemaakt worden aan de originele sources.
    Ik denk dat er niets anders op zit dan de aanpassing te maken.

  7. #7
    Het is dan wel handig om de afgeleide te maken zoals je wilde, en hiervoor override te gebruiken. In de Indy source kun je dan de methods virtual maken.
    Het voordeel hiervan (boven alles in de orginele source stoppen) is dat je direct weer een error zult krijgen als je door een update je wijziging ongedaan maakt. Het is dan dus redelijk veilig om die aanpassing te doen.
    Door in je source een regeltje commentaar op te nemen weten jij en je collega's later ook nog wat er nou precies aan de hand is.
    1+1=b

  8. #8
    cyberde
    Guest
    Precies, daarom heb ik ook bij Indy de vraag neergelegd in ieder geval deze procedure virtual te maken. Als ze dat doen is het misschien wel handig dat er meer procedures virtual worden, anders is het zo gelimiteerd om er een afgeleide van te maken

    Ik heb ondertussen die ene procedure in mijn Indy sources veranderd naar een virtual procedure zodat mijn programma nu doet wat het moet doen Mijn vorige oplossing heb ik er dan ook weer uitgesloopt.

  9. #9
    Heb je er ook bij verteld wat de situatie was? Misschien kunnen ze daar dan een elegante oplossing voor inbouwen, of misschien is er zelfs al een mogelijkheid die je over het hoofd hebt gezien..
    1+1=b

  10. #10
    cyberde
    Guest
    Dat heb ik inderdaad gedaan, ze vonden mijn ExtraHeaders oplossing maar niets :P
    Ik wacht nu op antwoord op de virtual-aanpassing.

Thread Information

Users Browsing this Thread

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

Tags for this Thread

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
  •