Oracle 10G 使用UTL_SMTP发送中文电子邮件[Z]

CREATE OR REPLACE PROCEDURE SCOTT.HTML_EMAIL( 
        P_TO                    IN   VARCHAR2, --收件人地址
        P_SUBJECT               IN   VARCHAR2,    --邮件主题
        P_HTML                  IN   VARCHAR2   DEFAULT   NULL--邮件内容支持HTML代码
        ) 
IS 
        L_BOUNDARY           VARCHAR2(255)   DEFAULT   ‘a1b2c3d4e3f2g1‘; 
        L_CONNECTION         UTL_SMTP.CONNECTION; 
        L_BODY_HTML          CLOB   :=   EMPTY_CLOB;     --THIS   LOB   WILL   BE   THE   EMAIL   MESSAGE 
        L_OFFSET             NUMBER; 
        L_AMMOUNT            NUMBER; 
        L_TEMP               VARCHAR2(32767)   DEFAULT   NULL;
        
        L_ACCOUNT               VARCHAR2(100);
        L_PASSWORD          VARCHAR2(100);
        
        
        P_FROM                  VARCHAR2(200); 
        P_TEXT                  VARCHAR2(200); 
        P_SMTP_HOSTNAME         VARCHAR2(200);
        P_SMTP_PORTNUM         VARCHAR2(200); 
BEGIN 
        
        P_FROM:=‘[email protected]‘; --发件人地址
        P_SMTP_HOSTNAME:=‘smtp.163.com‘; --smtp服务器
        P_SMTP_PORTNUM:=‘25‘;                    --smtp服务器端口号
        L_ACCOUNT:=‘[email protected]‘;--登录服务器用账号
        L_PASSWORD:=‘123456‘;                    --登录服务器密码
        
         P_TEXT:=‘there is no text‘;
         
         
        L_CONNECTION   :=   UTL_SMTP.OPEN_CONNECTION(P_SMTP_HOSTNAME,25); 
        UTL_SMTP.ehLO(L_CONNECTION,P_SMTP_HOSTNAME); --问候服务器,注意此用用了EHLO,没有使用HELO
       
        --输入用户名密码
        utl_smtp.command(l_connection,   ‘AUTH   LOGIN ‘); 
        utl_smtp.command(l_connection, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(L_ACCOUNT)))); 
        utl_smtp.command(l_connection,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(L_PASSWORD)))); 
        
        UTL_SMTP.MAIL(L_CONNECTION, ‘<‘ || P_FROM|| ‘>‘); --发件人信息
        UTL_SMTP.RCPT(L_CONNECTION, ‘<‘ || P_TO|| ‘>‘); --收件人地址
        --记得在地址两边加<>,否则可能会报错

        L_TEMP   :=   L_TEMP   ||   ‘MIME-Version:   1.0 ‘   ||     CHR(13)   ||   CHR(10); 
        L_TEMP   :=   L_TEMP   ||   ‘To:   ‘   ||   P_TO   ||   CHR(13)   ||   CHR(10); 
        L_TEMP   :=   L_TEMP   ||   ‘From:   ‘   ||   P_FROM   ||   CHR(13)   ||   CHR(10); 
        L_TEMP   :=   L_TEMP   ||   ‘Subject:   ‘   ||   P_SUBJECT   ||   CHR(13)   ||   CHR(10); 
        L_TEMP   :=   L_TEMP   ||   ‘Reply-To:   ‘   ||   P_FROM   ||     CHR(13)   ||   CHR(10); 
        L_TEMP   :=   L_TEMP   ||   ‘Content-Type:   multipart/alternative;   boundary= ‘|| CHR(34)||L_BOUNDARY||CHR(34)||CHR(13)||CHR(10); 

        ---------------------------------------------------- 
        --   WRITE   THE   HEADERS --写入头信息
        DBMS_LOB.CREATETEMPORARY(L_BODY_HTML,FALSE,10); 
        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),1,L_TEMP); 


--        ---------------------------------------------------- 
--        --   WRITE   THE   TEXT   BOUNDARY 
--        L_OFFSET:=DBMS_LOB.GETLENGTH(L_BODY_HTML) +1; 
--        L_TEMP:= CHR(13)||CHR(10)||‘-- ‘||L_BOUNDARY||CHR(13)||CHR(10); 
--        L_TEMP:= L_TEMP||‘Content-Type:text/plain;charset=us-ascii‘||CHR(13)||CHR(10)||CHR(13)||CHR(10); 
--        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); 

--        ---------------------------------------------------- 
--        --   WRITE   THE   PLAIN   TEXT   PORTION   OF   THE   EMAIL 
--        L_OFFSET   :=   DBMS_LOB.GETLENGTH(L_BODY_HTML)   +   1; 
--        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(P_TEXT),L_OFFSET,P_TEXT); 

        ---------------------------------------------------- 
        --   WRITE   THE   HTML   BOUNDARY 
        L_TEMP := CHR(13)||CHR(10)||CHR(13)||CHR(10)|| ‘--‘ ||L_BOUNDARY|| CHR(13)||CHR(10); 
        L_TEMP := L_TEMP||‘Content-Type:text/html; ‘|| CHR(13)||CHR(10)||CHR(13)||CHR(10); 
        L_OFFSET   :=   DBMS_LOB.GETLENGTH(L_BODY_HTML)   +   1; 
        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); 

        ---------------------------------------------------- 
        --   WRITE   THE   HTML   PORTION   OF   THE   MESSAGE 
        L_OFFSET   :=   DBMS_LOB.GETLENGTH(L_BODY_HTML)   +   1; 
        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(P_HTML),L_OFFSET,P_HTML); 
        
        
        ---------------------------------------------------- 
        --   WRITE   THE   test vale
--        L_TEMP :=‘我是中国人‘;       
--        L_OFFSET   :=   DBMS_LOB.GETLENGTH(L_BODY_HTML)   +   1; 
--        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); 
        

        ---------------------------------------------------- 
        --   WRITE   THE   FINAL   HTML   BOUNDARY 
--        L_TEMP  :=CHR(13)||CHR(10) ||CHR(13)||CHR(10) || ‘-- ‘|| L_BOUNDARY|| ‘-- ‘||CHR(13); 
--        L_OFFSET :=DBMS_LOB.GETLENGTH(L_BODY_HTML) + 1; 
--        DBMS_LOB.WRITE(L_BODY_HTML,LENGTH(L_TEMP),L_OFFSET,L_TEMP); 


        ---------------------------------------------------- 
        --   SEND   THE   EMAIL   IN   1900   BYTE   CHUNKS   TO   UTL_SMTP 
        L_OFFSET:=   1; 
        L_AMMOUNT:=   1900; 
        UTL_SMTP.OPEN_DATA(L_CONNECTION); 
        WHILE   L_OFFSET   <   DBMS_LOB.GETLENGTH(L_BODY_HTML)   LOOP 
                UTL_SMTP.WRITE_RAW_DATA(L_CONNECTION,UTL_RAW.cast_to_raw(DBMS_LOB.SUBSTR(L_BODY_HTML,L_AMMOUNT,L_OFFSET))); 
                L_OFFSET:= L_OFFSET+L_AMMOUNT ; 
                L_AMMOUNT:= LEAST(1900,DBMS_LOB.GETLENGTH(L_BODY_HTML)- L_AMMOUNT); 
        END   LOOP; 
        
      --  UTL_SMTP.write_raw_data(L_CONNECTION, UTL_RAW.cast_to_raw(‘我是中国人‘));
        UTL_SMTP.CLOSE_DATA(L_CONNECTION); 
        UTL_SMTP.QUIT(L_CONNECTION);
       -- dbms_output.put_line(DBMS_LOB.SUBSTR(L_BODY_HTML,DBMS_LOB.GETLENGTH(L_BODY_HTML),1));
        DBMS_LOB.FREETEMPORARY(L_BODY_HTML); 
        dbms_output.put_line(to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘)||‘发送邮件成功!!!‘);
exception
  when others then
  dbms_output.put_line(dbms_utility.format_error_stack);
  dbms_output.put_line(dbms_utility.format_call_stack);
  dbms_output.put_line(sqlerrm);
END; 
/

 

http://blog.csdn.net/blaider/article/details/5672729

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。