Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Skripte, die die Welt nicht braucht - Remove_UserAgent

1 view
Skip to first unread message

Vínzenz Ahréndt

unread,
May 7, 2013, 9:44:10 AM5/7/13
to

Hallo,

nachdem ich mich jetzt mal etwas mit der Skript-Materie befa�t habe, hab
ich auch gleich eines geschrieben. Ist aus der Ecke "Skripte, die die Welt
nicht braucht", erkl�rt sich daf�r aber von selbst, siehe
Konfigurationsteil.

Der �bliche Einbau in OnBeforeSendingMessage:

//-------------------------------------------------------------------------

program OnBeforeSendingMessage;

// [...]

{$I Remove_UserAgent.ds}


function OnBeforeSendingMessage( var Message : TStringlist; const Servername : string; const IsEmail : boolean ) : boolean;

begin

// Your code goes here

// [...]

// User-Agent entfernen
Remove_UserAgent ( Message, IsEmail );

end;

begin
end.

//-------------------------------------------------------------------------


Die Init-Routine und das Skript selbst:

//-------------------------------------------------------------------------

//--[Procedure Init_Remove_UserAgent]--------------------------------------
Procedure Init_Remove_UserAgent (Var b_Remove_UAInAllEmails: Boolean; Var b_Remove_UAInAllNews: Boolean; Var strl_ExFrom: TStringList);
Begin
// --------------------------------------------------------------------------
// Configuration settings
// --------------------------------------------------------------------------
// Remove User-Agent in all emails and/or Postings
// set 'true' or 'false'
b_Remove_UAInAllEmails := false;
b_Remove_UAInAllNews := true;

// From-Eintr�ge definieren
// Name oder Namensteile oder Mail-Adressen oder Teile davon, bei deren
// Vorhandensein der User-Agent nicht erntfernt werden soll
// Eintr�ge durch ein Komma ',' trennen. Leerzeichen erlaubt.

strl_ExFrom.CommaText := ' @gmx.de , @gmx.at , ';

// --------------------------------------------------------------------------
// End of configuration settings
// --------------------------------------------------------------------------
End;


//--[Procedure Remove_UserAgent]------------------------------------------------
Procedure Remove_UserAgent( Message:TStringlist; IsEmail:boolean );

var
b_Remove_UAInAllEmails, b_Remove_UAInAllNews : Boolean;
strl_ExFrom : TStringList;

b_Remove_UA, b_UAString_vorhanden, b_Message_changed : Boolean;
i : integer;
str_H : String;
strl_MessageText : TStringList;


Begin
strl_MessageText := TStringList.Create;
strl_ExFrom := TStringList.Create;

b_Remove_UA := true;
b_UAString_vorhanden := false;
b_Message_changed := false;
str_H := '';

Init_Remove_UserAgent ( b_Remove_UAInAllEmails, b_Remove_UAInAllNews, strl_ExFrom);
strl_ExFrom.CommaText := AnsiLowerCase(strl_ExFrom.CommaText);

// M�ssen wir hier �berhaupt was tun?
If (strl_ExFrom.Count > 0) Then
Begin
strl_MessageText.Text := Message.Text;
End;

If ( (strl_MessageText.Count > 0) and (Pos('User-Agent:', strl_MessageText.Text) <> 0) ) Then
Begin
b_UAString_vorhanden := true;
End;

// From:-String auslesen und mit Vorgabe vergleichen
If (
( (strl_ExFrom.Count > 0) and (b_UAString_vorhanden = true) )
and
( ( (IsEmail = true) and (b_Remove_UAInAllEmails = false) ) or ( (IsEmail = false) and (b_Remove_UAInAllNews = false) ) )
) Then
Begin
For i := 0 To strl_MessageText.IndexOf('') - 1 Do
Begin
// From:-String auslesen
If AnsiPos('From:' , strl_MessageText[i]) = 1 Then
Begin
str_H := Trim(Copy(strl_MessageText[i], AnsiPos(' ', strl_MessageText[i]) + 1, Length(strl_MessageText[i])));
str_H := AnsiLowerCase(str_H);
Break;
End;
End; // End For

// Ausgelesenen From:-String pr�fen und bei �bereinstimmung mit Vorgabe
// Flag setzen, um Entfernung des UA-Strings zu verhindern
If str_H <> '' Then
Begin
For i := 0 To strl_ExFrom.Count - 1 Do
Begin
If AnsiPos(strl_ExFrom[i], str_H) > 0 Then
Begin
b_Remove_UA := false;
Break;
End;
End; // End For
End;

End;


// User-Agent jetzt entfernen, falls vorhanden und Flag gesetzt
If ( (b_UAString_vorhanden = true) and (b_Remove_UA = true) ) Then
Begin
For i := 0 To strl_MessageText.IndexOf('') - 1 Do
Begin
If AnsiPos('User-Agent:' , strl_MessageText[i]) = 1 Then
Begin
strl_MessageText.Delete(i);
b_Message_changed := true;
Break;
End;
End; // End For
End;

// Ge�nderte Nachricht �bernehmen
If ( b_Message_changed = true ) Then
Begin
Message.Clear;
Message.Text := strl_MessageText.Text;
End;

strl_MessageText.Free;
strl_ExFrom.Free;

End;

//-------------------------------------------------------------------------


Bitte sch�n.

--
/

Hermann Hippen

unread,
May 7, 2013, 10:41:16 AM5/7/13
to
Es schrieb Vínzenz Ahréndt:

[SKRIPT]

Gibt es schon hier:
http://kh-rademacher.de/4d/RemoveAnyHeader_include.html

Mit dem kann man beliebige Header entfernen lassen.

--
*40tDlg Skripts : http://4d.vollmeier.at/
*40tDlg FAQ : http://www.wolfgang-bauer.at/4td_faq/
*Raady's 40tDlg Archiv : http://kh-rademacher.de/4d/
*AP Hamster & KN : http://h-hippen.de/kn.html

Hermann Hippen

unread,
May 7, 2013, 10:47:40 AM5/7/13
to
Es schrieb V�nzenz Ahr�ndt:

[SKRIPT]

Gibt es schon hier:
<http://kh-rademacher.de/4d/RemoveAnyHeader_include.html>

Mit dem kann man beliebige Header entfernen lassen.

Und hier gibt es noch ein Verspielteres mit Statistikerstellung usw. f�r
eingehende Mails/News: <http://kh-rademacher.de/4d/remove_g1.html>

Auf DiDis Seite wirst du sicher auch noch was finden.

Díetmar Vollmeíer

unread,
May 7, 2013, 10:57:19 AM5/7/13
to
Gr�� dich V�nzenz!

*V�nzenz Ahr�ndt* schrieb am 07.05.2013 um 15:44 Uhr...
> nachdem ich mich jetzt mal etwas mit der Skript-Materie befa�t habe, hab
> ich auch gleich eines geschrieben. Ist aus der Ecke "Skripte, die die Welt
> nicht braucht", erkl�rt sich daf�r aber von selbst, [...]

So was �hnliches gibt es schon, n�mlich
-> http://kh-rademacher.de/4d/remove_g1.html

Und wieso der UA-Header in Abh�ngigkeit vom Poster gel�scht werden soll,
ist zwar programmiertechnisch eine Herausforderung, jedoch will mir der
Sinn nicht recht einleuchten - aber jeder wie er mag ;)

Jetzt mal zum Script: Nicht schlecht f�r den Anfang :)
Allerdings mu� ich auch ein paar Kleinigkeiten bem�ngeln, n�mlich

> If ( (strl_MessageText.Count > 0) and (Pos('User-Agent:', strl_MessageText.Text) <> 0) ) Then
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Falls irgendwer den UA-Header zitiert oder ebend 'User-Agent:' irgendwo
in seine Nachricht reinschreibt, dann haste damit ein Problem.

Zum Beistift
,--
� Subject : Re: Skript etwas umbauen/erweitern
� From : D�etmar Vollme�er
� Date : Mon, 6 May 2013 19:43:57 +0200
� Message-ID: <news:060513.19435...@vollmeier.at>
� Newsgroups: <news:de.comm.software.40tude-dialog>
� User-Agent: 40tude_Dialog/2.0.15.84de (d466867b.385.52) Hamster/2.1.0.1534 KorrNews/4.2.7
`-----

Hier solltest du �berpr�fen, ob 'User-Agent:' (ups, schon wieder)
1. im Header steht und
2. am Zeilenanfang

> // User-Agent jetzt entfernen, [...]

Hier und beim From-Header ber�cksichtigst du nicht den Fall, da� sich
ein Header auch �ber mehrere Zeilen erstrecken kann.

Gut, ist mir bei den beiden genannten Headern zwar noch nie aufgefallen,
aber dennoch...

Weiters k�nntest du noch Funktionen wie 'GetHeader(Header-Name)'
und/oder 'RemoveHeader(Header-Name)' schreiben, denn diese wirst du IMHO
bei deinen weiteren Scripten sicher noch �fter ben�tigen.
--
Servus | 40tude Dialog FAQ -> http://www.wolfgang-bauer.at/4td_faq/
Didi | und Script-Archiv -> http://kh-rademacher.de/4d/
|=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
| http://4d.vollmeier.at/

Vínzenz Ahréndt

unread,
May 7, 2013, 10:55:04 AM5/7/13
to
Hermann Hippen schrieb am Tue, 7 May 2013 16:47:40 +0200:
> Es schrieb V�nzenz Ahr�ndt:

> [SKRIPT]

> Gibt es schon hier:
> <http://kh-rademacher.de/4d/RemoveAnyHeader_include.html>

Macht ja nix. Ich kannte bisher nur so einen kruden Hack ohne
Konfigurationsm�glichkeit und IMO auch unsauber gel�st. Also hab ich mir
das mal als Finger�bung vorgenommen, um ein bi�chen reinzukommen.

--
/

Díetmar Vollmeíer

unread,
May 7, 2013, 11:00:08 AM5/7/13
to
Hallo Hermann!

*Hermann Hippen* schrieb am 07.05.2013 um 16:47 Uhr...
Achja, das gips ja auch noch :)

> Auf DiDis Seite wirst du sicher auch noch was finden.

Hab nie eine eigene Version dieses Scripts geschrieben. Wozu auch, da
gab es IMHO nix mehr zu verbessern.

Karl-Heinz Rademacher

unread,
May 7, 2013, 11:30:34 AM5/7/13
to
D�etmar Vollme�er schrieb:

> Hallo Hermann!
>
> *Hermann Hippen* schrieb am 07.05.2013 um 16:47 Uhr...
>> Gibt es schon hier:
>> <http://kh-rademacher.de/4d/RemoveAnyHeader_include.html>
>
> Achja, das gips ja auch noch :)

Siehste, darum auch Archiv. :)



Mit freundlichen Gr�ssen
Karl-Heinz Rademacher
--
Das 40tude Dialog Skript-Archiv: http://kh-rademacher.de/4d/
Raady's Thunderbird-News-Reader: http://kh-rademacher.de/tb/
Die Face-Seiten f�r die Reader: http://kh-rademacher.de/face/
Die 40tude Dialog-FAQ: http://www.wolfgang-bauer.at/4td_faq/

Vínzenz Ahréndt

unread,
May 7, 2013, 11:45:37 AM5/7/13
to
D�etmar Vollme�er schrieb am Tue, 7 May 2013 16:57:19 +0200:
> *V�nzenz Ahr�ndt* schrieb am 07.05.2013 um 15:44 Uhr...

>> nachdem ich mich jetzt mal etwas mit der Skript-Materie befa�t habe, hab
>> ich auch gleich eines geschrieben. Ist aus der Ecke "Skripte, die die Welt
>> nicht braucht", erkl�rt sich daf�r aber von selbst, [...]

> So was �hnliches gibt es schon, n�mlich
> -> http://kh-rademacher.de/4d/remove_g1.html

Macht nix.

> Und wieso der UA-Header in Abh�ngigkeit vom Poster gel�scht werden soll,
> ist zwar programmiertechnisch eine Herausforderung, jedoch will mir der
> Sinn nicht recht einleuchten - aber jeder wie er mag ;)

Ich benutze den 4D auch f�r Mails (sch*** auf den Donnerkram) und habe da
zwangsl�ufig verschiedene Mail-Konten. Bei manchen will ich, da� der 4D
drinsteht, bei manchen will ich es nicht. Wenn andere das lustig finden,
ist das doch OK.

> Jetzt mal zum Script: Nicht schlecht f�r den Anfang :)

Danke, hab bei Dir abgeschrieben. Bl�d ist, da� es keinen Debugger gibt,
sondern man sich den Kram immer umst�ndlich via MessageBox ausgeben lassen
mu�.

> Allerdings mu� ich auch ein paar Kleinigkeiten bem�ngeln, n�mlich

>> If ( (strl_MessageText.Count > 0) and (Pos('User-Agent:', strl_MessageText.Text) <> 0) ) Then
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Falls irgendwer den UA-Header zitiert oder ebend 'User-Agent:' irgendwo
> in seine Nachricht reinschreibt, dann haste damit ein Problem.

1. hatte ich vermutet, da� der Einwand kommt; 2. ist das Absicht und 3. ist
es _kein_ Problem.

> Zum Beistift
> ,--
> � Subject : Re: Skript etwas umbauen/erweitern
> � From : D�etmar Vollme�er
> � Date : Mon, 6 May 2013 19:43:57 +0200
> � Message-ID: <news:060513.19435...@vollmeier.at>
> � Newsgroups: <news:de.comm.software.40tude-dialog>
> � User-Agent: 40tude_Dialog/2.0.15.84de (d466867b.385.52) Hamster/2.1.0.1534 KorrNews/4.2.7
> `-----

> Hier solltest du �berpr�fen, ob 'User-Agent:' (ups, schon wieder)
> 1. im Header steht und
> 2. am Zeilenanfang

Macht das Skript. Nur an anderer Stelle. Ganz oben reicht es, nur
nachzusehen, ob der NUA �berhaupt irgendwo im Text steht. Ist das der Fall,
kann man mit einiger Wahrscheinlichkeit annehmen, da� es der Header-String
ist. Eine genaue �berpr�fung erfolgt sp�ter, aber erst nachdem klar ist, ob
�berhaupt was passieren soll. Schlie�lich k�nnte es sein, da� jemand das
Skript benutzt, nichts eintr�gt (oder wieder alles ausgetragen hat), und
dann w�re es Nonsens, an dieser Stelle schon mit einer Schleife durch den
Text zu laufen, obwohl noch gar keine regul�re Eingangspr�fung
stattgefunden hat, wie die Parameter eigenbtlich gesetzt sind.
Also wird hier aus Laufzeitgr�nden nur grob gepr�ft und erst sp�ter die
genaue Position des des UA-Strings ermittelt.

>> // User-Agent jetzt entfernen, [...]

> Hier und beim From-Header ber�cksichtigst du nicht den Fall, da� sich
> ein Header auch �ber mehrere Zeilen erstrecken kann.

Stimmt.

> Gut, ist mir bei den beiden genannten Headern zwar noch nie aufgefallen,

Mir auch nicht.

> aber dennoch...

Ich hab momentan keinen Peil, wie ich das pr�fen k�nnte. Woran erkennt man
das Ende eine mehrzeiligen Headers? CRLF f�llt ja aus.

> Weiters k�nntest du noch Funktionen wie 'GetHeader(Header-Name)'
> und/oder 'RemoveHeader(Header-Name)' schreiben, denn diese wirst du IMHO
> bei deinen weiteren Scripten sicher noch �fter ben�tigen.

Hermann meint, das gibt's alles schon.

--
/

Díetmar Vollmeíer

unread,
May 7, 2013, 11:54:08 AM5/7/13
to
*V�nzenz Ahr�ndt* schrieb am 07.05.2013 um 17:45 Uhr...
,--
� Subject : Re: Skript etwas umbauen/erweitern
� From : D�etmar Vollme�er
� Date : Sat, 4 May 2013 22:50:00 +0200
� Message-ID : <news:040513.22500...@vollmeier.at>
� Newsgroups : <news:de.comm.software.40tude-dialog>
`-----

Schau genau in *Function ChangeInNG* :)

>> Weiters k�nntest du noch Funktionen wie 'GetHeader(Header-Name)'
>> und/oder 'RemoveHeader(Header-Name)' schreiben, denn diese wirst du IMHO
>> bei deinen weiteren Scripten sicher noch �fter ben�tigen.

> Hermann meint, das gibt's alles schon.

Womit er nicht ganz unrecht hat ;)

Hermann Hippen

unread,
May 7, 2013, 12:09:12 PM5/7/13
to
Es schrieb V�nzenz Ahr�ndt:

>> Weiters k�nntest du noch Funktionen wie 'GetHeader(Header-Name)'
>> und/oder 'RemoveHeader(Header-Name)' schreiben, denn diese wirst du IMHO
>> bei deinen weiteren Scripten sicher noch �fter ben�tigen.

> Hermann meint, das gibt's alles schon.

N�, habe ich nicht geschrieben. Gemeint sind solche Funktionen, die du
h�ufger ben�tigen k�nntest und so immer parat hast um sie, aus welchen
Skripten auch immer, aufrufen zu k�nnen ohne sie jedesmal neu zu
schreiben.

Hermann Hippen

unread,
May 7, 2013, 12:12:22 PM5/7/13
to
Es schrieb D�etmar Vollme�er:

>> Hermann meint, das gibt's alles schon.

> Womit er nicht ganz unrecht hat ;)

Hab ich nicht gesagt, obwohl dem wohl so ist. Das soll ihn aber nicht
davon abhalten selbst herumzut�fteln. Ein anderer Blickwinkel kann zu
Verbesserungen f�hren, die immer willkommen sind :)

Vínzenz Ahréndt

unread,
May 7, 2013, 12:58:32 PM5/7/13
to
D�etmar Vollme�er schrieb am Tue, 7 May 2013 17:54:08 +0200:
> *V�nzenz Ahr�ndt* schrieb am 07.05.2013 um 17:45 Uhr...
>> D�etmar Vollme�er schrieb am Tue, 7 May 2013 16:57:19 +0200:

>>> Hier und beim From-Header ber�cksichtigst du nicht den Fall, da� sich
>>> ein Header auch �ber mehrere Zeilen erstrecken kann.

>> Stimmt.

>>> Gut, ist mir bei den beiden genannten Headern zwar noch nie aufgefallen,

>> Mir auch nicht.

>>> aber dennoch...

>> Ich hab momentan keinen Peil, wie ich das pr�fen k�nnte. Woran erkennt man
>> das Ende eine mehrzeiligen Headers? CRLF f�llt ja aus.

> ,--
> � Subject : Re: Skript etwas umbauen/erweitern
> � From : D�etmar Vollme�er
> � Date : Sat, 4 May 2013 22:50:00 +0200
> � Message-ID : <news:040513.22500...@vollmeier.at>
> � Newsgroups : <news:de.comm.software.40tude-dialog>
> `-----

> Schau genau in *Function ChangeInNG* :)

OK, es d�mmert was. Danke. Dann kann ich mir jetzt die Frage dazu sparen.
_Das_ hatte ich n�mlich noch nicht gerafft, was das soll. Ist der Part so
jetzt besser?


//-------------------------------------------------------------------------

If (
( (strl_ExFrom.Count > 0) and (b_UAString_vorhanden = true) )
and
( ( (IsEmail = true) and (b_Remove_UAInAllEmails = false) ) or ( (IsEmail = false) and (b_Remove_UAInAllNews = false) ) )
) Then
Begin
For i := 0 To strl_MessageText.IndexOf('') - 1 Do
Begin
// From:-String auslesen
If AnsiPos('From:' , strl_MessageText[i]) = 1 Then
Begin
str_H := Trim(Copy(strl_MessageText[i], AnsiPos(' ', strl_MessageText[i]) + 1, Length(strl_MessageText[i])));

i := i + 1;
While Trim(Copy(strl_MessageText[i], 1, 1)) = '' Do
Begin
If i = strl_MessageText.IndexOf('') Then
Begin
Break;
End;

str_H := str_H + ' ' + Trim(strl_MessageText[i]);
i := i + 1;
End;

str_H := AnsiLowerCase(str_H);
Break;
End;
End; // End For

// Ausgelesenen From:-String pr�fen und bei �bereinstimmung mit Vorgabe
// Flag setzen, um Entfernung des UA-Strings zu verhindern
If str_H <> '' Then
Begin
For i := 0 To strl_ExFrom.Count - 1 Do
Begin
If AnsiPos(strl_ExFrom[i], str_H) > 0 Then
Begin
// MessageBox( 0, strl_ExFrom[i], strl_ExFrom.Strings[i], $40 );
b_Remove_UA := false;
Break;
End;
End; // End For
End;

End;

//-------------------------------------------------------------------------


--
/

Vínzenz Ahréndt

unread,
May 7, 2013, 1:01:23 PM5/7/13
to
Hermann Hippen schrieb am Tue, 7 May 2013 18:09:12 +0200:
> Es schrieb V�nzenz Ahr�ndt:

>>> Weiters k�nntest du noch Funktionen wie 'GetHeader(Header-Name)'
>>> und/oder 'RemoveHeader(Header-Name)' schreiben, denn diese wirst du IMHO
>>> bei deinen weiteren Scripten sicher noch �fter ben�tigen.

>> Hermann meint, das gibt's alles schon.

> N�, habe ich nicht geschrieben. Gemeint sind solche Funktionen, die du
> h�ufger ben�tigen k�nntest und so immer parat hast um sie, aus welchen
> Skripten auch immer, aufrufen zu k�nnen ohne sie jedesmal neu zu
> schreiben.

Ach, so. OK. Ja, ich wei� nicht, ob ich mir da jetzt Bibliotheken schreiben
will. Es gibt ja schon alles von anderen. Das bi�chen Rest, was mir mal
einf�llt, wird dann schon irgendwie gehen.

--
/

Díetmar Vollmeíer

unread,
May 7, 2013, 1:41:19 PM5/7/13
to
*V�nzenz Ahr�ndt* schrieb am 07.05.2013 um 18:58 Uhr...
> D�etmar Vollme�er schrieb am Tue, 7 May 2013 17:54:08 +0200:

>> Schau genau in *Function ChangeInNG* :)

> OK, es d�mmert was. Danke. Dann kann ich mir jetzt die Frage dazu sparen.
> _Das_ hatte ich n�mlich noch nicht gerafft, was das soll. Ist der Part so
> jetzt besser?

Ja :)

> //-------------------------------------------------------------------------

> [...]
> While Trim(Copy(strl_MessageText[i], 1, 1)) = '' Do
> Begin

Wenn eine Abfrage, Schleife, etc. nur aus einem Befehl besteht, kannst
du dir *Begin* und *End* ersparen

> If i = strl_MessageText.IndexOf('') Then
> Begin
> Break;
> End;

| If i = strl_MessageText.IndexOf('') Then Break;

oder auch zweizeilig, das ist egal

| If i = strl_MessageText.IndexOf('') Then
| Break;

> //-------------------------------------------------------------------------

HTH

Vínzenz Ahréndt

unread,
May 9, 2013, 4:22:06 AM5/9/13
to
Díetmar Vollmeíer schrieb am Tue, 7 May 2013 19:41:19 +0200:
> *Vínzenz Ahréndt* schrieb am 07.05.2013 um 18:58 Uhr...
>> Díetmar Vollmeíer schrieb am Tue, 7 May 2013 17:54:08 +0200:

>>> Schau genau in *Function ChangeInNG* :)

>> OK, es dämmert was. Danke. Dann kann ich mir jetzt die Frage dazu sparen.
>> _Das_ hatte ich nämlich noch nicht gerafft, was das soll. Ist der Part so
>> jetzt besser?

> Ja :)

Hab alles nochmal umgebaut und dabei auch den Punkt mit der Pos-Fkt.
geändert.

>> //-------------------------------------------------------------------------

>> [...]
>> While Trim(Copy(strl_MessageText[i], 1, 1)) = '' Do
>> Begin

> Wenn eine Abfrage, Schleife, etc. nur aus einem Befehl besteht, kannst
> du dir *Begin* und *End* ersparen

>> If i = strl_MessageText.IndexOf('') Then
>> Begin
>> Break;
>> End;

>| If i = strl_MessageText.IndexOf('') Then Break;

> oder auch zweizeilig, das ist egal

>| If i = strl_MessageText.IndexOf('') Then
>| Break;

OK, danke.

--
/
°
0 new messages