UTL_SMTP发送邮件,防中文乱码处理!

本文介绍了一个使用Oracle数据库通过PL/SQL发送带HTML格式邮件的例子。该示例展示了如何从数据库中读取数据并将其格式化为HTML表格,再通过SMTP服务器发送。涉及邮件服务器连接配置、身份验证、邮件内容构造等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--from http://blog.youkuaiyun.com/leeyon4151/article/details/6625122
    DECLARE  
      V_CONN                UTL_SMTP.CONNECTION;  
      L_REC_ARR             ARRAY;  
      V_DB_NLS_CHARACTERSET VARCHAR2(40);  
      CURSOR L_TEMP IS  
        SELECT COL1, COL2, COL3, COL4, COL5, COL6, COL7 FROM TABLE_NAME;  
      ;  
      
      L_REC_LIST    VARCHAR2(32767);  
      BODY_HTML_S   VARCHAR2(32767);  
      BODY_HTML_E   VARCHAR2(20);  
      BODY_HTML_C   VARCHAR2(32767);  
      L_MEG_CONTENT VARCHAR2(32767);  
    BEGIN  
      --获取服务器字符集  
      SELECT VALUE  
        INTO V_DB_NLS_CHARACTERSET  
        FROM NLS_DATABASE_PARAMETERS  
       WHERE PARAMETER = 'NLS_CHARACTERSET';  
      
      --获取邮件接收人列表,格式如(xxx1@126.com,xxx2@126.com,xxx3@126.com...)  
      SELECT ADL.TO_RECIPIENTS  
        INTO L_REC_LIST  
        FROM ALR_DISTRIBUTION_LISTS ADL  
       WHERE ADL.NAME = 'ALERT_REC_LIST';  
      
      --表头HTML代码  
      BODY_HTML_S := '<table width="100%" border="1"  cellspacing="1" cellpadding="0" bgcolor="#000000" style="font-size:12px; font-family:Arial, Helvetica, sans-serif">' ||  
                     '<tr>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 1</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 2</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 3</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 4</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 5</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 6</th>' ||  
                     '<th bgcolor="#0099ff" scope="col">Header 7</th>' ||  
                     '</tr>';  
      
      --循环数据行  
      FOR R IN L_TEMP LOOP  
        BODY_HTML_C := BODY_HTML_C || '<tr>' ||  
                       '<td width="8%" bgcolor="#FFFFFF" align="left">' ||  
                       NVL(R.COL1, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="12%" bgcolor="#FFFFFF" align="left">' ||  
                       NVL(R.COL2, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="20%" bgcolor="#FFFFFF" align="left">' ||  
                       NVL(R.COL3, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="10%" bgcolor="#FFFFFF" align="left">' ||  
                       NVL(R.COL4, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="8%" bgcolor="#FFFFFF" align="center">' ||  
                       NVL(R.COL5, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="8%" bgcolor="#FFFFFF" align="center">' ||  
                       NVL(R.COL6, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '<td width="8%" bgcolor="#FFFFFF" align="center">' ||  
                       NVL(R.COL7, ' ') || '</td>' || UTL_TCP.CRLF ||  
                       '</tr>';  
      END LOOP;  
      --表格结束代码  
      BODY_HTML_E := '</table>';  
      --连接邮件服务器  
      V_CONNECTION := UTL_SMTP.OPEN_CONNECTION('10.2.3.111', 25);  
      UTL_SMTP.HELO(V_CONN, '10.2.3.111');  
      UTL_SMTP.COMMAND(V_CONN, 'AUTH LOGIN');  
      --身份验证,如果服务器允许匿名,此部分可以注释。  
      UTL_SMTP.COMMAND(V_CONN,  
                       UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('ebs_alert@xxxx.cn'))));  
      UTL_SMTP.COMMAND(V_CONN,  
                       UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('*****'))));  
      --发件人  
      UTL_SMTP.MAIL(V_CONN, '"Workflow Mailer"<ebs_alert@xxxx.cn>');  
      --按","字符拆分收件人字符串,并返回伪数组.  
      L_REC_ARR := SPLIT(L_REC_LIST, ',');  
      --收件人(多个接收人可以循环该代码)  
      FOR I IN 1 .. L_REC_ARR.COUNT LOOP  
        UTL_SMTP.RCPT(V_CONN, L_REC_ARR(I) || '<' || L_REC_ARR(I) || '>');  
      END LOOP;  
      
      UTL_SMTP.OPEN_DATA(V_CONN);  
      --发件人  
      UTL_SMTP.WRITE_DATA(V_CONN,  
                          'From: ' || 'ebs_alert@xxxx.cn' || UTL_TCP.CRLF);  
      
      L_MEG_CONTENT := L_MEG_CONTENT || 'MIME-Version: 1.0' || UTL_TCP.CRLF;  
      --收件人(多个接收人可以循环该代码)  
      FOR I IN 1 .. L_REC_ARR.COUNT LOOP  
        L_MEG_CONTENT := L_MEG_CONTENT || 'To: ' || L_REC_ARR(I) || '<' ||  
                         L_REC_ARR(I) || '>' || UTL_TCP.CRLF;  
      END LOOP;  
      
      --开始拼接邮件格式字符串  
      L_MEG_CONTENT := L_MEG_CONTENT || 'Subject: ' || '这里是邮件主题 ' ||  
                       UTL_TCP.CRLF;  
      L_MEG_CONTENT := L_MEG_CONTENT ||  
                       'Content-Type: text/html;charset=gb2312' || UTL_TCP.CRLF;  
      L_MEG_CONTENT := L_MEG_CONTENT || 'Content-Transfer-Encoding: 8bit' ||  
                       UTL_TCP.CRLF;  
      --邮件输出(防乱码处理)  
      UTL_SMTP.WRITE_RAW_DATA(V_CONN,  
                              UTL_RAW.CAST_TO_RAW(CONVERT(L_MEG_CONTENT ||  
                                                          BODY_HTML_S ||  
                                                          BODY_HTML_C ||  
                                                          BODY_HTML_E  
                                                          UTL_TCP.CRLF,  
                                                          'ZHS16GBK',  
                                                          V_DB_NLS_CHARACTERSET)));  
      UTL_SMTP.CLOSE_DATA(V_CONNECTION);  
      UTL_SMTP.QUIT(V_CONNECTION);  
    END;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值