Michael Heydekamp [EMAIL PROTECTED] wrote on 06.10.04:
[...]
Ich hänge im Followup zu diesem Posting mal die zentralen neuen
Routinen für das ganze Gedönse an.
Bzw. als Text geht das in diesem Falle auch:
Vor dem Schreiben des Headers jeder Nachricht Variablen mit Inhalt
füllen:
--
[...]
begin { of WriteRFCheader }
with hd do
begin
msgtime:='';
msgdate:='';
msg_TZ:='';
nowdate:=date;
nowtime:=time;
now_DST:=sommer(nowdate,nowtime);
now_TZ:=iifs(now_DST,'+0200','+0100'); { Default: MEZ/MESZ }
if (length(zdatum)7) and (length(datum)5) then
begin
{ my: Ggf. Jahr bei Jahrhundertwechsel korrigieren, }
{ damit bei Nachrichten, die als UTC-Datum in }
{ 'zdatum' noch den 31.12.1999, als lokales Datum }
{ in 'datum' aber bereits den 01.01.00 (zweistel- }
{ lige Jahreszahl!) ausweisen, nicht wie bisher }
{ durch das blinde Kopieren der ersten beiden }
{ Ziffern der Jahreszahl aus 'zdatum' das lokale }
{ RFC-Datum 01 Jan 1900 erzeugt wird. }
msgdate:=copy(datum,5,2)+'.'+copy(datum,3,2)+'.'+
iifs(((copy(zdatum,3,2)='99') and (left(datum,2)='00')),
strs(ival(left(zdatum,2))+1)+left(datum,2),
left(zdatum,2)+left(datum,2));
if (length(zdatum)13) and (length(datum)9) then
msgtime:=copy(datum,7,2)+':'+copy(datum,9,2)+':'+copy(zdatum,13,2);
if (length(zdatum)16) and (upcase(zdatum[15]) in ['W','S']) and
(zdatum[16] in ['+','-']) and (zdatum[17] in ['0'..'9']) then
begin
msg_DST:=sommer(msgdate,msgtime);
p:=cpos(':',zdatum);
if p=0 then p:=byte(zdatum[0])+1;
msg_TZ:=zdatum[16]+formi(ival(copy(zdatum,17,p-17)),2)+
formi(ival(mid(zdatum,p+1)),2);
if right(msg_TZ,4)='' then{ bei TZ '' immer '+' }
msg_TZ[1]:='+';
p:=ival(left(msg_TZ,3))+ { 'p' für Zeitzone mißbrauchen }
iif(not msg_DST and now_DST,1,
iif(msg_DST and not now_DST,-1,0));
now_TZ:=iifs(p0,'-','+')+formi(abs(p),2)+right(msg_TZ,2);
end;
end;
[...]
Die Routine, die aus den obigen Variablen wahlweise RFC- oder asctime()-
Format (mit Wochentag) erzeugt:
{ - }
{ asc=false: Datums-/Zeitstring in RFC-Format umwandeln }
{(für Date:-Header, Quelle: EDA:-Header) }
{(für Received:-Header, akt. Zeit)}
{Fri, 31 Dec 1999 23:01:00 +0100 }
{ }
{ asc=true : Datums-/Zeitstring in asctime-Format umwandeln }
{(für From_-Zeile in UUCP-Mails, akt. Zeit) }
{Fri Dec 31 23:01:00 1999 }
{ }
{ dateS= Datum im Format 31.12.1999 }
{ timeS= Zeit im Format 23:01:00 }
{ - }
function RFCdate(const dateS,timeS,TZ:datetimest; const asc:boolean):string;
begin
if dateS'' then
begin
RFCdate:=copy('MonTueWedThuFriSatSun',dow(dateS)*3-2,3)+
iifs(asc,'',', ')+
iifs(asc,'',left(dateS,2))+' '+month(copy(dateS,4,2))+
iifs(asc,iifs(dateS[1]='0',' '+copy(dateS,2,1),left(dateS,2)),
right(dateS,4))+
iifs(timeS='','',' '+timeS)+
iifs(asc,' '+right(dateS,4),iifs(TZ='','',' '+TZ));
end
else RFCdate:='';
end;
Und hier die Zeilen/Header, wo 'RFCdate' letztlich verwendet wird:
--
--8--
if ddatum'' then
begin
fpar:=fpar+'modification-date='+
RFCdate(copy(ddatum,7,2)+'.'+copy(ddatum,5,2)+'.'+
left(ddatum,4),copy(ddatum,9,2)+':'+
copy(ddatum,11,2)+':'+copy(ddatum,13,2),
'-',false)+'';
if hd.groesse0 then fpar:=fpar+'; size='+strs(hd.groesse);
end
--8--
--8--
else wrs(f,'From '+left(s,p-1)+' '+
RFCdate(nowdate,nowtime,now_TZ,true)+ { akt. Datum/Uhrzeit }
' remote from '+mid(s,p+1));
if (wab'') and (cpos('@',oem)0) and not smtp { (*1) - s.u. }
then rfor:=empfaenger
else rfor:='';
wrs(f,'Received: by '+mid(s,cpos('@',s)+1)+
iifs(programm'',' ('+programm+')','')+
iifs(rfor'',#10#9'for '+rfor+';',';'));
wrs(f,#9+RFCdate(nowdate,nowtime,now_TZ,false)); { akt. Datum/Uhrzeit }
end
--8--
--8--
wrs(f,'Date: