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

Umlaute bei Mail aus der Datenbank

558 views
Skip to first unread message

Reinhard Seiler

unread,
May 27, 2003, 4:44:00 AM5/27/03
to
Hallo NG,

um mir das Leben etwas zu erleichtern, lasse ich aus unserer Datenbank
(Oracle 9 unter W2000-Server) bei bestimmten Fehlern Mails generieren und an
mich senden. Das klappt auch problemlos.
Nun wollte ich das erweitern und stelle dabei fest, dass in den Mails keine
Umlaute vorkommen. Aus ä wird einfach a usw. Zeichen wie )%&$ usw. laufen
problemlos durch.
Vorher ist mir das nicht aufgefallen, weil der Fehlertext kurz ist und
einfach keine Umlaute enthält. Weder im UTL_SMPT-Package, noch irgendwo
anders kann ich etwas zum Zeichensatz finden. Bei allen anderen Aktivitäten
der DB gibt es keine Probleme mit dem Zeichensatz.

Da kann ich mir überhaupt keinen Reim drauf machen.

Danke

Reinhard

Reinhard Seiler

unread,
May 27, 2003, 7:54:35 AM5/27/03
to
Wer lesen kann ist klar im Vorteil.
utl_smtp.data wandelt immer in US7ASCII um.
Das läßt sich nur verhindern indem utl_smtp.data ersetzt wird durch
utl_smtp.open_data()
utl_smtp.write_data()
utl_smtp.write_raw_data()
utl_smtp.close_data()
Habe ich gemacht. Mit wirte_data alles ok. Doch kam setze ich write_raw_data
ein, bekomme ich einen schönen ORA-06512, der sich auch nach längerem
ge'google' mir nicht erschließt.

"Reinhard Seiler" <reinhar...@lua.sms.sachsen.de> schrieb im
Newsbeitrag news:bav8g3$8ct$1...@S0DD0010.ihl.sachsen.de...

Ulrik Hoffmann

unread,
May 28, 2003, 5:14:19 AM5/28/03
to

----- Original Message -----
From: "Reinhard Seiler" <reinhar...@lua.sms.sachsen.de>
Newsgroups: de.comp.datenbanken.misc
Sent: Tuesday, May 27, 2003 1:54 PM
Subject: Re: Umlaute bei Mail aus der Datenbank


> Wer lesen kann ist klar im Vorteil.
> utl_smtp.data wandelt immer in US7ASCII um.
> Das läßt sich nur verhindern indem utl_smtp.data ersetzt wird durch
> utl_smtp.open_data()
> utl_smtp.write_data()
> utl_smtp.write_raw_data()
> utl_smtp.close_data()
> Habe ich gemacht. Mit wirte_data alles ok. Doch kam setze ich
write_raw_data
> ein, bekomme ich einen schönen ORA-06512, der sich auch nach längerem
> ge'google' mir nicht erschließt.
>
> "Reinhard Seiler" <reinhar...@lua.sms.sachsen.de> schrieb im

Moin, das gekapselte hier klappt bei mir wunderbar.

Aufruf mit:

declare
a integer;
begin
a:=pkg_smtp.sendmail('i...@absender.de','d...@empfaenger.de','test','öäü');
dbms:output.put_line(a);
end;

steht in a -10 oder -20 hast Du ein Problem mit dem SMTP-Server.

Gruss
Ulrik


CREATE OR REPLACE PACKAGE PKG_SMTP AS
-- Package zum Verschicken von Mails VIA UTL_SMTP
-- ##############################################
-- 13.2.2001 Ulrik Hoffmann
FUNCTION SENDMAIL(
p_From IN VARCHAR2,
p_To IN VARCHAR2,
p_Subj IN VARCHAR2,
p_Text IN VARCHAR2,
p_FromName IN VARCHAR2:=null,
p_ToName IN VARCHAR2:=null
) RETURN INTEGER;
END;
/
CREATE OR REPLACE PACKAGE BODY PKG_SMTP AS
-- Package zum Verschicken von Mails VIA UTL_SMTP
-- ##############################################
-- 13.2.2001 Ulrik Hoffmann

SMTP_Host CONSTANT VARCHAR2(255) := 'mySMTPServer.com';
smtp UTL_SMTP.Connection;


-- übersetzt den Text in RAW
PROCEDURE Write_Text(conn IN OUT UTL_SMTP.Connection, p_Text VARCHAR2) IS
l_Rc INTEGER;
BEGIN
l_Rc := UTL_TCP.Write_Raw(
conn.Private_TCP_Con,
UTL_RAW.Cast_To_Raw( p_Text )
);
END;


PROCEDURE Write_Line(p_Text IN VARCHAR2 DEFAULT NULL,
p_EOL IN VARCHAR2 DEFAULT UTL_TCP.CRLF
) IS
BEGIN
IF p_Text IS NULL THEN
Write_Text( smtp, p_EOL );
ELSIF p_Text = '.'||p_EOL THEN
Write_Text( smtp, '..'||p_EOL );
ELSE
Write_Text( smtp, p_Text||p_EOL );
END IF;
END;

PROCEDURE Write_Dot(
pDot IN VARCHAR2 DEFAULT '.',
p_EOL IN VARCHAR2 DEFAULT UTL_TCP.CRLF
) IS
BEGIN
Write_Text( smtp, p_EOL||pDot||p_EOL );
END;

PROCEDURE SendHeader(
pName IN VARCHAR2 DEFAULT NULL,
pValue IN VARCHAR2 DEFAULT NULL
) IS
BEGIN
IF pName IS NULL THEN
-- this is a provision to send empty lines
-- by calling just SendHeader()
Write_Line();
ELSE
Write_Line( pName || ': ' || pValue );
END IF;
END;

PROCEDURE AbortConnection IS
BEGIN
UTL_SMTP.QUIT( smtp );
EXCEPTION
WHEN OTHERS THEN
NULL;
END;

FUNCTION Replace_Chars(
p_String IN VARCHAR2
) RETURN VARCHAR2 IS
lp_String VARCHAR2(2000);
BEGIN
lp_String :=
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
p_String,'ä','ae')
,'Ä','AE')
,'Ü','UE')
,'ü','ue')
,'Ö','OE')
,'ö','oe')
,'ß','ss');
RETURN(lp_String);
END;


-- Hier beginnt die eigentliche Prozedur
--
############################################################################
FUNCTION SENDMAIL(
p_From IN VARCHAR2,
p_To IN VARCHAR2,
p_Subj IN VARCHAR2,
p_Text IN VARCHAR2,
p_FromName IN VARCHAR2:=null,
p_ToName IN VARCHAR2:=null
) RETURN INTEGER IS

lp_From VARCHAR2(2000);
lp_To VARCHAR2(2000);
p_Subj_Replace VARCHAR2(2000);

BEGIN

--so solls aussehen
IF INSTR( p_From, '<' ) = 0 THEN
lp_From := '<'||p_From||'>';
ELSE
lp_From := p_From;
END IF;

IF INSTR( p_To, '<' ) = 0 THEN
lp_To := '<'||p_To||'>';
ELSE
lp_To := p_To;
END IF;

smtp := UTL_SMTP.Open_Connection( SMTP_Host);


UTL_SMTP.EHLO( smtp, SMTP_Host );
UTL_SMTP.MAIL( smtp, lp_From );
UTL_SMTP.RCPT( smtp, lp_To );
-- UTL_SMTP.Open_Data( smtp ); -- doesn't WORK WITH 8-bit chars :-(
Write_Line( 'DATA' );

-- SendHeader( 'From', p_FromName||' '||lp_from );
SendHeader( 'To', p_ToName||' '||lp_To );
-- SendHeader('Return-Receipt-To',lp_from);
p_Subj_Replace := Replace_Chars(p_Subj);
SendHeader( 'Subject', p_Subj_Replace );

--Header
SendHeader( 'MIME-Version', '1.0' );
SendHeader( 'Content-Type', 'text/plain; charset="iso-8859-1"' );
SendHeader( 'Content-Transfer-Encoding', '8bit' );
SendHeader();

--Text schreiben
Write_Line( p_Text );

Write_Dot();

--UTL_SMTP.Close_Data( smtp );
AbortConnection;

RETURN 0;
EXCEPTION
WHEN UTL_SMTP.Transient_Error THEN
AbortConnection;
RETURN -10;
WHEN UTL_SMTP.Permanent_Error THEN
AbortConnection;
RETURN -20;
WHEN UTL_SMTP.Invalid_Operation THEN
AbortConnection;
RETURN -30;
WHEN OTHERS THEN
AbortConnection;
RETURN -1;
END;
END;
/

Reinhard Seiler

unread,
May 28, 2003, 8:38:02 AM5/28/03
to
Danke für die umfängliche Hilfe.
Der Test dauert leider noch etwas. Ich melde mich danach nochmal.

Reinhard


0 new messages