2016-10-20 1 views
0

Oracleデータベースから電子メールを送信する必要があります。 これはかなり長くなります。表には1kを超える行が含まれています。CLOBを本文としてUTL_SMTPに送信する際の不正なHTML

次のように基本的なPL/SQLコードがある -

PIVARHTMLMSG CLOB; 
LNUMSTART NUMBER := 1; 
LNUMCHUNK NUMBER := 1900; 
I NUMBER := 0; 

PIVARHTMLMSG := '<HTML><BODY><P>Some Heading</P><TABLE BORDER="1"><TR><TD>ID</TD><TD>NAME</TD><TD>EMAIL</TD></TR>'; 

WHILE (TRUE) 
LOOP 
    PIVARHTMLMSG := PIVARHTMLMSG || '<TR><TD>999999</TD><TD>TEST TEST TEST</TD><TD>[email protected]</TD></TR>'; 
    I := I + 1; 
    IF I > 1000 THEN 
     EXIT; 
    END IF;   
END LOOP; 

WHILE LNUMSTART < NVL(DBMS_LOB.GETLENGTH(PIVARHTMLMSG), 0) LOOP 
    UTL_SMTP.WRITE_DATA(lMailConn,DBMS_LOB.SUBSTR(PIVARHTMLMSG,LNUMCHUNK,LNUMSTART)); 
    LNUMSTART := LNUMSTART + LNUMCHUNK; 
    LNUMCHUNK := LEAST(LNUMCHUNK,DBMS_LOB.GETLENGTH(PIVARHTMLMSG) -LNUMCHUNK); 
END LOOP; 

次のように電子メールがレンダリングされる -

enter image description here

そのような行動のために考えられる理由何ができますか?

+0

メールを送信する完全なコードを示してください。 –

答えて

0

あなたは最も重要なもの、e.i.を提供していません。手順はUTL_SMTPです。

は、メールを送信するために私の手順を見てください:

SUBTYPE T_MAIL_PRIORITY IS INTEGER; 
PRIORITY_HIGH   CONSTANT INTEGER := 1; 
PRIORITY_NORMAL   CONSTANT INTEGER := 3; 
PRIORITY_LOW   CONSTANT INTEGER := 5; 

PROCEDURE SendMail(
    Subject IN VARCHAR2, 
    Message IN OUT CLOB, 
    ToMail IN VARCHAR2, 
    FromMail IN VARCHAR2, FromName IN VARCHAR2, 
    Attachment IN OUT CLOB, FileName IN VARCHAR2, 
    Priority IN T_MAIL_PRIORITY) IS 

    MIME_BOUNDARY   CONSTANT VARCHAR2(50) := '====Multipart.Boundary.689464861147414354===='; 
    MIME_MIXED    CONSTANT VARCHAR2(50) := 'multipart/mixed;'; 
    MIME_TEXT    CONSTANT VARCHAR2(50) := 'text/plain;'; 
    MIME_HTML    CONSTANT VARCHAR2(50) := 'text/html;'; 

    con UTL_SMTP.connection; 
    ret UTL_SMTP.reply; 
    Charset VARCHAR2(20); 

    ClobLen PLS_INTEGER; 
    amount BINARY_INTEGER := 8192; 
    buffer VARCHAR2(16384); 
    offset PLS_INTEGER := 1; 
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i'); 

BEGIN 

    SELECT UTL_I18N.MAP_CHARSET(VALUE) 
    INTO Charset 
    FROM nls_database_parameters 
    WHERE parameter = 'NLS_CHARACTERSET'; 

    -- setup mail header 
    con := UTL_SMTP.OPEN_CONNECTION('mailhost', 25); 
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); 
    ret := UTL_SMTP.Mail(con, FromMail); 
    ret := UTL_SMTP.rcpt(con, ToMail); 
    ret := UTL_SMTP.open_data(con); 

    UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||UTL_TCP.CRLF); 
    UTL_SMTP.write_data(con, 'To: '||ToMail||UTL_TCP.CRLF); 
    UTL_SMTP.write_data(con, 'Date: '||TO_CHAR(CURRENT_TIMESTAMP, 'Dy, DD Mon YYYY hh24:mi:ss TZHTZM', 'NLS_DATE_LANGUAGE = American')||UTL_TCP.CRLF);  
    UTL_SMTP.write_data(con, 'Subject: '||Subject||UTL_TCP.CRLF); 
    UTL_SMTP.write_data(con, 'X-Priority: '||Priority||UTL_TCP.CRLF); 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     UTL_SMTP.write_data(con, 'Mime-Version: 1.0' || UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_MIXED||' boundary="'||MIME_BOUNDARY||'"' || UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, 'This is a multipart message in MIME format.' || UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || UTL_TCP.CRLF); 
    END IF; 

    IF isHTML THEN 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || UTL_TCP.CRLF); 
    ELSE 
     UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || UTL_TCP.CRLF); 
    END IF; 

    -- Mail Body 
    UTL_SMTP.write_data(con, UTL_TCP.CRLF); 
    ClobLen := DBMS_LOB.GETLENGTH(Message); 
    LOOP 
     EXIT WHEN offset > ClobLen; 
     DBMS_LOB.READ(Message, amount, offset, BUFFER); 
     UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(BUFFER)); 
     offset := offset + amount; 
    END LOOP; 
    UTL_SMTP.write_data(con, UTL_TCP.CRLF); 

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN 
     -- Mail Attachment 
     UTL_SMTP.write_data(con, UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Type: '||MIME_TEXT||' name="'||Filename||'"'|| UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, 'Content-Disposition: attachment; filename="'||Filename||'"'|| UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, UTL_TCP.CRLF); 

     offset := 1; 
     ClobLen := DBMS_LOB.GETLENGTH(Attachment); 
     LOOP 
      EXIT WHEN offset > ClobLen; 
      DBMS_LOB.READ(Attachment, amount, offset, BUFFER); 
      UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(BUFFER)); 
      offset := offset + amount; 
     END LOOP; 
     UTL_SMTP.write_data(con, UTL_TCP.CRLF); 
     UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY||'--' || UTL_TCP.CRLF); 
    END IF; 

    -- finish mail 
    ret := UTL_SMTP.close_data(con); 
    ret := UTL_SMTP.quit(con); 

EXCEPTION 
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN 
     UTL_SMTP.quit(con); 
     RAISE; 
END SendMail; 

は「空」UTL_SMTP.write_data(con, UTL_TCP.CRLF);通話をお見逃しなく、彼らはあなたのメールの適切な概要のために必要とされます。

また、UTL_SMTP.write_data(con, 'This is a multipart message in MIME format.' || UTL_TCP.CRLF);のように見えません。これは適切な出力に関係しています。

あなたのメッセージを使った私のテストの結果です。

enter image description here

+0

幸運にも、スクリーンショットと同じ出力です。 –

+0

実際のコードは不要ですが、問題はOutlookメールサーバー内にあり、Oracleでは発生しません。詳細については、このリンクを参照してください。 https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:1739411218448 –

+0

以前は間違ってフォーマットされたメールで同じ問題が発生しましたが、この手順で解決しました。 HTML文書を添付ファイルとして追加することを検討してください。更新された手順を参照してください。 –

関連する問題