Китайский язык (кроме английского) не отправляется по электронной почте с использованием UTL SMTP в приложении Oracle - PullRequest
0 голосов
/ 21 января 2019

У нас есть изменение кода, чтобы отправить электронное письмо пользователю, используя UTL_SMTP в oracle.Мы использовали HTML для форматирования данных в электронном письме.Электронная почта отправляется с сервера Oracle в Outlook.Слова, отличные от английского, отправляются неправильно, и их необходимо отформатировать.

SUPPLIER NAME   INVOICE NUMBER  INVOICE DATE    PO NUMBER   CURRENCY    PO AMOUNT   PAID DATE
????????????    1018416-20181106-1  06-NOV-2018 215002655   CNY 208,246.50  06-DEC-2018
????????????????    76782188    14-NOV-2018 215002698   CNY 45,714.29   06-DEC-2018

Китайские слова отображаются в виде знаков вопроса (?????).

Соответствующий PL /Код SQL такой:

BEGIN   
            P_Email_ID := cur_r.EMAIL_ID;
            P_REQUISITIONER :=cur_r.REQUISITIONER;
            --recipient:=P_Email_ID;
            fnd_file.put_line(fnd_file.LOG,'TO_Email :'||P_Email_ID);
            fnd_file.put_line(fnd_file.LOG,'Requisitioner :'||P_REQUISITIONER);
            mail_conn := utl_smtp.open_connection(mailhost, 25);
            utl_smtp.helo(mail_conn, mailhost);
            utl_smtp.mail(mail_conn, sender);
            utl_smtp.rcpt(mail_conn, recipient);
            l_message := null;                    
            l_table :=null;

            l_message := l_message||'<html><head>'||crlf||
                         '<style>'||crlf||
                         'thead {color:blue;}'||crlf||
                         'tbody {color:black;}'||crlf||
                         'table, th ,td{border: 1px solid black;}'||crlf||
                         'table {border-collapse: collapse;width: 65%;}'||crlf||
                         'th {height: 25px; text-align: left;}'||crlf||
                         'th, td {padding: 10px;}'||crlf||
                         '</style>'||crlf||
                         '</head>'||crlf||
                         '<body>'||crlf||
                         '<p>Dear ' || P_REQUISITIONER ||'</p>'||crlf||crlf||
                         '<p>Your supplier has been paid.</p>'||crlf||crlf||
                         '<p>This is a notification for information only, do not reply to this email. The supplier will receive a separate remittance advice sent to the email address held in Oracle.</p>'||crlf||crlf||
                         '<p>Payment has been made for the following POs that you raised:</p>'; 

                fnd_file.put_line(fnd_file.log , l_message);

            l_body :=l_body||'<table>'||crlf||
                     '<thead>'||crlf||
                       '<tr>'||crlf||
                          '<th><font size ="2"  face="arial" >SUPPLIER NAME</th>'||crlf||
                          '<th><font size ="2"  face="arial" >INVOICE NUM</th>'||crlf||
                          '<th><font size ="2"  face="arial" >INVOICE DATE</th>'||crlf||
                          '<th><font size ="2"  face="arial" >PO NUMBER</th>'||crlf||
                          '<th><font size ="2"  face="arial" >CURRENCY</th>'||crlf||
                          '<th><font size ="2"  face="arial" >PO AMOUNT</th>'||crlf||
                          '<th><font size ="2"  face="arial" >PAID DATE</th>'||crlf||                                 
                        '</tr>'||crlf||
                        '</thead>'; 

            fnd_file.put_line(fnd_file.LOG,P_Email_ID|| P_OU||L_DATE);  

    FOR cur_req IN SUP_INFO(P_Email_ID,P_OU,L_DATE)
        LOOP
                l_table :=l_table||
                        '<tbody>'||crlf||
                            '<tr>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.SUPPLIER_NAME||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.INVOICE_NUM||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.INVOICE_DATE||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.PO_NUMBER||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.INVOICE_CURRENCY||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.PO_AMOUNT||'</td>'||crlf||
                                    '<td><font size ="2"  face="arial" >'||cur_req.PAID_DATE||'</td>'||crlf||                                           
                                '</tr>'||crlf||
                                '</tbody>';

        END LOOP;   
                l_table :=l_table||'</table>'||crlf||
                                '</body></html>';
                fnd_file.put_line(fnd_file.LOG, l_table);               
                  l_message := 'From: <'|| sender ||'>' || crlf ||'Subject: '|| pSubject || crlf ||'To: '||recipient || crlf ||'MIME-Version: 1.0'||crlf||'Content-type:text/html;charset=iso-8859-1'||crlf|| '' || crlf || l_message|| crlf || l_body|| crlf || l_table ||crlf;
            utl_smtp.data(mail_conn, l_message || UTL_TCP.crlf || UTL_TCP.crlf);
            UTL_SMTP.quit(mail_conn);
            fnd_file.put_line(fnd_file.LOG,'Sent mail :');  
            EXCEPTION
            WHEN OTHERS THEN
               fnd_file.put_line(fnd_file.LOG,'Email failed'||SQLERRM);
            END;   
END LOOP;
fnd_file.put_line(fnd_file.LOG,'Loop Closed:'); 

1 Ответ

0 голосов
/ 22 января 2019

Вы заявляете Content-type:text/html;charset=iso-8859-1. ISO-8859-1 не поддерживает китайские символы, поэтому они не отображаются.

Я бы порекомендовал эту процедуру:

PROCEDURE SendMail(
    Subject IN VARCHAR2, 
    Message IN OUT CLOB, 
    ToMail IN VARCHAR2,   
    FromMail IN VARCHAR2, 
    FromName IN VARCHAR2,
    PRIORITY IN INTEGER DEFAULT 3) IS

    PRIORITY_HIGH           CONSTANT INTEGER := 1;
    PRIORITY_NORMAL         CONSTANT INTEGER := 3;
    PRIORITY_LOW            CONSTANT INTEGER := 5;

    MIME_HTML               CONSTANT VARCHAR2(50) := 'text/html;';  
    SMTP_PORT               CONSTANT INTEGER := 25;
    SMTP_SERVER             CONSTANT VARCHAR2(50):= 'mailhost';

    con UTL_SMTP.CONNECTION;
    ret UTL_SMTP.REPLY;
    Charset VARCHAR2(20);

    LobLen INTEGER;
    amount INTEGER := 8000;
    BUFFER VARCHAR2(32000);
    OFFSET INTEGER := 1;

BEGIN

    -- setup mail header
    con := UTL_SMTP.OPEN_CONNECTION(SMTP_SERVER, SMTP_PORT);
    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);

    IF CONVERT(FromName, 'US7ASCII') = FromName THEN
        UTL_SMTP.WRITE_DATA(con, 'From: "'||FromName||'" <'||FromMail||'>'||UTL_TCP.CRLF);
    ELSE
        UTL_SMTP.WRITE_DATA(con, 'From: =?UTF-8?B?'|| UTL_ENCODE.TEXT_ENCODE(FromName, 'AL32UTF8', UTL_ENCODE.BASE64) ||'?= <'||FromMail||'>'||UTL_TCP.CRLF);
    END IF; 

    UTL_SMTP.WRITE_DATA(con, 'To: '||ToMail||UTL_TCP.CRLF);
    IF CONVERT(Subject, 'US7ASCII') = Subject THEN
        UTL_SMTP.WRITE_DATA(con, 'Subject: '||Subject||UTL_TCP.CRLF);
    ELSE
        UTL_SMTP.WRITE_DATA(con, 'Subject: =?UTF-8?B?'|| REPLACE(REPLACE(UTL_ENCODE.TEXT_ENCODE(Subject, 'AL32UTF8', UTL_ENCODE.BASE64), CHR(13), NULL), CHR(10), NULL) ||'?='||UTL_TCP.CRLF);
    END IF;
    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, 'X-Priority: '||PRIORITY||UTL_TCP.CRLF);

    SELECT UTL_I18N.MAP_CHARSET(VALUE)
    INTO Charset
    FROM NLS_DATABASE_PARAMETERS
    WHERE parameter = 'NLS_CHARACTERSET';
    UTL_SMTP.WRITE_DATA(con, 'Content-type: '||MIME_HTML||' charset='||Charset || UTL_TCP.CRLF);

    -- Mail Body
    UTL_SMTP.WRITE_DATA(con, UTL_TCP.CRLF);
    LobLen := DBMS_LOB.GETLENGTH(Message);
    LOOP
        EXIT WHEN OFFSET > LobLen;
        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);

    -- 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);
END SendMail;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...