2011-07-06 2 views
-4

値のテーブルを生成していて、pl-sqlのUTL_SMTPを使用して出力を電子メール本文として書き出しています。PL/SQLでUTL_SMTPを使用して生成された電子メール本文のランダムな感嘆符

生成されたテーブルは、5列29行で構成されます。

問題はいくつかランダムな感嘆符です。電子メール本文に生成されています。次のように

コードである.... SMTPプロトコルを指定

CREATE OR REPLACE PROCEDURE APPS.xxjdsu_crm_jobs_monitoring(
                errbuf  OUT VARCHAR2, 
                retcode  OUT VARCHAR2, 
                p_subject    IN VARCHAR2, 
                P_recipient_to_list IN VARCHAR2, 
                P_recipient_cc_list IN VARCHAR2, 
                p_signature1   IN VARCHAR2, 
                p_signature2   IN VARCHAR2, 
                p_signature3   IN VARCHAR2, 
                p_signature4   IN VARCHAR2 
                ) 
AS 
    l_recipient_to_list VARCHAR2(32767) :=lower(replace(P_recipient_to_list,';',',')); 
    l_recipient_cc_list VARCHAR2(32767) :=lower(replace(P_recipient_cc_list,';',',')); 
    l_Mail_Conn utl_smtp.Connection; 
    l_Mail_Host VARCHAR2(100) := 'localhost'; 
    l_From  VARCHAR2(80) ; 
    l_Recipient VARCHAR2(3000); 
    l_run_date DATE := sysdate; 
    l_Subject  VARCHAR2(1000) ; 
    l_priority VARCHAR2(10) := 'NORMAL'; 
    l_instance VARCHAR2(80); 
    l_crlf  VARCHAR2(2) := chr(13)||chr(10); 
    l_msg_body clob := empty_clob;    --This LOB will be the email message 
    l_msg_data VARCHAR2(32767) :=null; 
    l_msg_tail VARCHAR2(32767); 
    l_signature VARCHAR2(32767); 
    l_job_status VARCHAR2(30) := null; 
    l_bg_colour VARCHAR2(80):= null; 
    l_schedule NUMBER :=0; 
    l_rp   NUMBER :=1; 
    l_rp1   NUMBER :=1; 
    j    NUMBER :=0; 
    CURSOR cur_req_list_data IS 
    (SELECT rownum, 
     c.PROGRAM_NAME, 
     c.LAST_RUN_REQUEST_ID, 
     c.LAST_RUNDATE, 
     c.RESULT 
FROM ((SELECT fcv.user_concurrent_program_name "PROGRAM_NAME", 
     fcr.request_id "LAST_RUN_REQUEST_ID", 
     TO_CHAR(fcr.actual_completion_date,' DD/MON/YYYY HH24:MI:SS') "LAST_RUNDATE" , 
     DECODE(fcr.phase_code, 
          'C','Completed',fcr.phase_code)||'/'||DECODE(fcr.status_code, 
                          'C', 'Normal', 
                          'D', 'Cancelled', 
                          'E','Errored', 
                          'F','Scheduled', 
                          'G', 'Warning',fcr.status_code) "RESULT" 
     FROM apps.fnd_concurrent_programs_vl fcv,apps.fnd_concurrent_requests fcr 
     WHERE user_concurrent_program_name IN (SELECT fvv.description 
               FROM apps.fnd_lookup_types_vl ftv, 
                apps.fnd_lookup_values_vl fvv 
               WHERE ftv.lookup_type = fvv.lookup_type 
               AND ftv.lookup_type LIKE 'CRM_JOBS' 
               AND fvv.tag = 10) 
     AND fcv.concurrent_program_id = fcr.concurrent_program_id 
     AND fcr.actual_completion_date IS NOT NULL 
     AND fcr.actual_completion_date in (SELECT max(fcr1.actual_completion_date) 
              FROM apps.fnd_concurrent_programs_vl fcv1,apps.fnd_concurrent_requests fcr1 
              WHERE user_concurrent_program_name IN (SELECT fvv.description 
                        FROM apps.fnd_lookup_types_vl ftv, 
                         apps.fnd_lookup_values_vl fvv 
                        WHERE ftv.lookup_type = fvv.lookup_type 
                        AND ftv.lookup_type LIKE 'CRM_JOBS' 
                        AND fvv.tag = 10) 
             AND fcv1.concurrent_program_id = fcr1.concurrent_program_id 
             AND fcr1.PHASE_CODE='C' 
             AND fcr1.actual_completion_date IS NOT NULL 
             GROUP BY fcr1.concurrent_program_id) 
     ) 
     UNION 
     (SELECT fcv.user_concurrent_program_name "PROGRAM_NAME", 
       fcr.request_id "LAST_RUN_REQUEST_ID", 
       TO_CHAR(fcr.actual_completion_date,' DD/MON/YYYY HH24:MI:SS') "LAST_RUNDATE" , 
       DECODE(fcr.phase_code, 
             'C','Completed',fcr.phase_code)||'/'||DECODE(fcr.status_code, 
                            'C', 'Normal', 
                            'D', 'Cancelled', 
                            'E','Errored', 
                            'F','Scheduled', 
                            'G', 'Warning',fcr.status_code) "RESULT" 
      FROM apps.fnd_concurrent_programs_vl fcv, 
       apps.fnd_concurrent_requests fcr 
      WHERE fcv.concurrent_program_id = fcr.concurrent_program_id 
      AND request_id IN (SELECT request_id 
          FROM apps.fnd_concurrent_programs_vl fcv, 
            apps.fnd_concurrent_requests fcr 
          WHERE fcv.USER_CONCURRENT_PROGRAM_NAME IN (SELECT fvv.description 
                     FROM apps.fnd_lookup_types_vl ftv, 
                      apps.fnd_lookup_values_vl fvv 
                     WHERE ftv.lookup_type = fvv.lookup_type 
                     AND ftv.lookup_type LIKE 'CRM_JOBS' 
                     AND fvv.tag = 20) 
          AND fcv.concurrent_program_id = fcr.concurrent_program_id 
          AND fcr.actual_completion_date IS NOT NULL 
          AND 2>=(SELECT count(fcr1.request_id) 
            FROM apps.fnd_concurrent_programs_vl fcv1, 
              apps.fnd_concurrent_requests fcr1 
            WHERE fcv1.USER_CONCURRENT_PROGRAM_NAME=fcv.USER_CONCURRENT_PROGRAM_NAME 
            AND fcr1.actual_completion_date>=fcr.actual_completion_date 
            AND fcv1.concurrent_program_id = fcr1.concurrent_program_id 
            AND fcr1.PHASE_CODE='C' 
            AND fcr1.actual_completion_date IS NOT NULL) 
          UNION 
          (SELECT request_id 
           FROM (SELECT request_id 
            FROM apps.fnd_concurrent_programs_vl fcv, 
             apps.fnd_concurrent_requests fcr 
            WHERE USER_CONCURRENT_PROGRAM_NAME IN (SELECT fvv.description 
                      FROM apps.fnd_lookup_types_vl ftv, 
                       apps.fnd_lookup_values_vl fvv 
                      WHERE ftv.lookup_type = fvv.lookup_type 
                      AND ftv.lookup_type LIKE 'CRM_JOBS' 
                      AND fvv.tag = 40) 
            AND fcv.concurrent_program_id = fcr.concurrent_program_id 
            AND fcr.PHASE_CODE='C' 
            AND fcr.actual_completion_date IS NOT NULL 
            ORDER BY request_id desc 
            ) 
            WHERE rownum<=4 
          ) 
          ) 
     ) 
      UNION 
      (
      SELECT fcr.description, fcr.request_id "LAST_RUN_REQUEST_ID", 
      TO_CHAR (fcr.actual_completion_date,'DD/MON/YYYY HH24:MI:SS') "LAST_RUNDATE", 
      DECODE (fcr.phase_code, 
           'C', 'Completed', fcr.phase_code)|| '/'|| DECODE (fcr.status_code, 
                            'C', 'Normal', 
                            'D', 'Cancelled', 
                            'E', 'Errored', 
                            'F', 'Scheduled', 
                            'G', 'Warning', 
                            fcr.status_code) "RESULT" 
      FROM apps.fnd_concurrent_programs_vl fcv, 
       apps.fnd_concurrent_requests fcr 
      WHERE fcr.description LIKE 'JDSU SNT Customer Portal Extract Set' 
      AND fcv.concurrent_program_id = fcr.concurrent_program_id 
      AND fcr.actual_completion_date IS NOT NULL 
      AND fcr.actual_completion_date IN (
              SELECT MAX (fcr2.actual_completion_date) 
              FROM apps.fnd_concurrent_programs_vl fcv2, 
                apps.fnd_concurrent_requests fcr2 
              WHERE fcr2.description IN (SELECT fvv.description 
                     FROM apps.fnd_lookup_types_vl ftv, 
                      apps.fnd_lookup_values_vl fvv 
                     WHERE ftv.lookup_type = fvv.lookup_type 
                     AND ftv.lookup_type LIKE 'CRM_JOBS' 
                     AND fvv.tag = 5) 
              AND fcv2.concurrent_program_id = fcr2.concurrent_program_id 
              AND fcr2.PHASE_CODE='C' 
              AND fcr2.actual_completion_date IS NOT NULL 
              GROUP BY fcr2.concurrent_program_id) 
      ) 
ORDER BY 1,2 DESC) 
c); 

BEGIN 

    SELECT name 
    INTO l_instance 
    FROM v$database; 

    l_From := 'wf'||lower(l_instance)||'@AtOracle.com'; 

    l_Subject := p_subject|| ' Status Card on '||to_char(l_run_date,'DD-Mon-YYYY')||'{'||l_instance||'}'; 


     l_Mail_Conn := utl_smtp.Open_Connection(l_Mail_Host, 25); 
     utl_smtp.Helo(l_Mail_Conn, l_Mail_Host); 
     utl_smtp.Mail(l_Mail_Conn, l_From); 


    IF l_recipient_to_list IS NOT NULL THEN 
     WHILE l_rp1 <> 0 
      LOOP 

      l_rp := instr(l_recipient_to_list,',',l_rp1); 

       exit when l_rp=0; 

      l_Recipient := substr(l_recipient_to_list,l_rp1,l_rp-l_rp1); 

      utl_smtp.Rcpt(l_Mail_Conn,l_Recipient); 

      l_rp1 :=l_rp+1; 

      END LOOP; 

      IF L_RP=0 THEN 
      l_Recipient := substr(l_recipient_to_list,l_rp1); 
      utl_smtp.Rcpt(l_Mail_Conn,l_Recipient); 
      END IF; 
     END IF; 

     l_rp :=1; 
     l_rp1 :=1; 

    IF l_recipient_cc_list IS NOT NULL THEN 
     WHILE l_rp1 <> 0 
      LOOP 

      l_rp := instr(l_recipient_cc_list,',',l_rp1); 

       exit when l_rp=0; 

      l_Recipient := substr(l_recipient_cc_list,l_rp1,l_rp-l_rp1); 

      utl_smtp.Rcpt(l_Mail_Conn,l_Recipient); 

      l_rp1 :=l_rp+1; 

      END LOOP; 

      IF L_RP=0 THEN 
      l_Recipient := substr(l_recipient_cc_list,l_rp1); 
      utl_smtp.Rcpt(l_Mail_Conn,l_Recipient); 
      END IF; 
     END IF; 




l_msg_body := l_msg_body 
      || '<html>' 
      || '<body>' 
      || '<pre><font face="TimesNewRoman" size="2"><b><font color="#0000FF"></b></font></pre>' 
      || '</body>'|| '</html>'; 

l_msg_body := l_msg_body 
      ||'<table BORDER WIDTH="100%" BGCOLOR="#66FFFF" > 
       <tr> 
       <td WIDTH=600 HEIGHT =100 ALIGN="CENTER"><b><font color="#000000">'||p_subject||'</strong></font></b></td> 
       <td> 
       <table BORDER=0.5 WIDTH="100%" BGCOLOR="#CCCCCC" > 
       <tr> <td> </td> 
       <td> 
       <tr> <td BGCOLOR="#FFFF00">' 
      ||'Yellow = Completed Warning' 
      ||'</td></tr> 
      <tr> <td> </td> <td><tr> <td BGCOLOR="#FF0000">' 
      ||'Red = Completed Error' 
      ||'</td><tr> <td BGCOLOR="#FFFFFF">' 
      ||'White = Completed Successfully ' 
      ||'</td></tr><tr> <td> </td></tr></table><td></td></tr></table>' 
      ; 

l_msg_body := l_msg_body 
      || '<table BORDER COLS=5 WIDTH="100%" BGCOLOR="#CCCCCC" ><tr><td WIDTH="10%" ALIGN="CENTER"><b><font color="#000000">S.no</strong></font></b></td> 
       <td WIDTH="40%" ALIGN="CENTER"><b><font color="#000000"><strong>Program Name</strong></font></b></td> 
       <td WIDTH="15%" ALIGN="CENTER"><b><font color="#000000"><strong>Last Run Request ID</strong></font></b></td> 
       <td WIDTH="20%" ALIGN="CENTER"><b><font color="#000000"><strong>Last Run Date</strong></font></b></td> 
       <td WIDTH="15%" ALIGN="CENTER"><b><font color="#000000"><strong>Result</strong></font></b></td> </tr>' 
       ; 

-- Daily -- 
FOR i in cur_req_list_data 
    LOOP 

     IF i.result = 'Completed/Normal' then 
     l_bg_colour := 'BGCOLOR="#FFFFFF"'; 
     ELSIF i.result = 'Completed/Warning' then 
      j:=j+1; 
      l_bg_colour := 'BGCOLOR="#FFFF00"'; 
     ELSIF i.result ='Completed/Errored' then 
      j:=j+1; 
      l_bg_colour := 'BGCOLOR="#FF0000"'; 
     END IF ; 
     l_msg_body := l_msg_body 
        || '<tr BGCOLOR="#FFFFFF" ><td WIDTH="10%" ALIGN="LEFT"><font color="#000000">' 
        ||replace(i.rownum,'!','') 
        ||'</font></td><td ' 
        ||l_bg_colour 
        ||' WIDTH="40%" ALIGN="LEFT"><font color="#000000"><strong>' 
        ||replace(i.program_name,'!','') 
        ||'</strong></font></td> <td ' 
        ||l_bg_colour 
        ||' WIDTH="15%" ALIGN="LEFT"><font color="#000000"><strong>' 
        ||replace(i.LAST_RUN_REQUEST_ID,'!','') 
        ||'</strong></font></td><td ' 
        ||l_bg_colour 
        ||' WIDTH="20%" ALIGN="LEFT"><font color="#000000"><strong>' 
        ||replace(i.LAST_RUNDATE,'!','') 
        ||'</strong></font></td><td ' 
        ||l_bg_colour 
        ||' WIDTH="15%" ALIGN="LEFT"><font color="#000000"><strong>' 
        ||replace(i.RESULT,'!','') 
        ||'</strong></font></td></tr>' 
        ; 

     l_bg_colour := null; 


     END LOOP; 



     l_msg_body := l_msg_body||'</table>'; 

     IF j!=0 THEN 

     l_msg_body := l_msg_body 
         ||'<br><table BORDER=0 COLS=1 WIDTH="100%" > <tr ><td WIDTH=400 ALIGN="LEFT"><b>NOTE : <font color="#ff0000"> Few jobs Completed Error or Completed Warning </font></b></td></tr> <br></br>'; 
     END IF; 

     l_signature := '<br><table BORDER=0 COLS=1 WIDTH="50%" > <tr ><td WIDTH=400 ALIGN="LEFT"><font color="#555658"> Best Regards </strong></font></td></tr><tr ><td WIDTH=400 ALIGN="LEFT"><b><font color="#555658">' 
         || p_signature1 
         ||'</strong></font></b></td></tr>'; 
     IF p_signature2 IS NOT NULL THEN 
     l_signature := l_signature 
         ||'<tr ><td WIDTH="50%" ALIGN="LEFT"><font color="#555658">' 
         || p_signature2 
         ||' </strong></font></td></tr>'; 
     END IF; 
     IF p_signature3 IS NOT NULL THEN 
     l_signature := l_signature 
         ||'<tr ><td WIDTH="50%" ALIGN="LEFT"><font color="#555658">' 
         || p_signature3 
         ||' </strong></font></td></tr>'; 
     END IF; 

     IF P_SIGNATURE4 IS NOT NULL THEN 
     l_signature := l_signature 
         || '<tr ><td WIDTH="50%" ALIGN="LEFT"><font color="#555658"> Team PDL: <u> <font color="#0000CC"> ' 
         || p_signature4 
         ||' </u> </strong></font></td></tr>'; 
     END IF; 

     l_msg_body := 'From: '  || l_From || l_crlf || 
        'Subject: ' || l_Subject|| l_crlf || 
        'To: '  || l_recipient_to_list || l_crlf || 
        'CC: '  || l_recipient_cc_list || l_crlf || 
        'Importance: '|| l_priority || l_crlf || l_msg_body||l_signature|| ''; 


     utl_smtp.data(l_Mail_Conn, 'MIME-Version: 1.0' || l_crlf ||'Content-type: text/html' || l_crlf || l_msg_body); 
     utl_smtp.Quit(l_Mail_Conn); 
EXCEPTION 
        WHEN OTHERS THEN 
       fnd_file.put_line(fnd_file.LOG,'This is the exception caught during data AND quit'); 
END; 
+2

私は誰もこの限られた情報に基づいてアドバイスを提供することはできません。いくつかのコードを表示します。単純な再現可能なテストケースに減らしてください。 –

+4

問題のタイトルがすべて大文字であるのと同じバグですか? –

+1

コード、XML、またはデータサンプルを投稿する場合は、テキストエディタでこれらの行をハイライト表示し、エディタツールバーの "コードサンプル"ボタン( '{}')をクリックして、フォーマットして構文を強調してください! –

答えて

6

RFC 821は、テキストの行の最大長は、CRLFを含め1000個の文字であることを指定します。

テキスト行

を含むテキスト行の最大合計長は1000文字(ただし、透明性のために重複リーディング ドットをカウントしない)です。

CRLFをテキストに追加する場所が表示されないので、1000文字を超える1行のテキストを生成しようとしているようです。感嘆符は、あなたのメッセージを有効にするためにSMTPサーバがCRLFを1000文字ごとに追加した結果でしょう。 1000文字を超えないようにCRLFを追加した場合、感嘆符は消えてしまいます。

+0

UTL_SMTP.write_dataを使って同様の問題に遭遇しました添付データを書き込み、続いてデータ内に重複小数点を受け取ることができます。このソリューションは、このシナリオでも機能します。これは、900文字(1000文字未満)の文字ごとにデータにUTL_TCP.crlfを追加すると、発生しなくなります。 – m12lrpv

0

htmlタグに新しい空白行を追加すると問題が解決すると思います。適切なタグを追加して、印刷するメッセージが全体として1000文字にならず、長さが短くなるような新しいスペースを確保してください。

0

CRLF文字を追加すると、体の長さは< br/>タグです。私の特定のケースについて

Iは< BR/>タグを保持する変数を有し、付加UTL_TCP.CRLF、即ち、v_endline VARCHAR2(100):= '< BR/>' || UTL_TCP.CRLF;私の問題を解決しました。

ありがとうございました!

関連する問題