oracle存储过程发邮件

12 篇文章 0 订阅
9 篇文章 0 订阅
CREATE OR REPLACE PROCEDURE PRO_SEND_MAIL(P_RECIPIENT  VARCHAR2, -- 邮件接收人
                                          P_SUBJECT    VARCHAR2, -- 邮件标题
                                          P_MESSAGE    VARCHAR2, -- 邮件正文
                                          P_MESSAGE_ID VARCHAR2 -- 关联邮件发送异常ID
                                          ) IS
  V_MAILHOST VARCHAR2(30) := 'smtp.163.com';
  V_USER     VARCHAR2(30) := 'username@163.com'; --用户名
  V_PASS     VARCHAR2(20) := 'password'; --密码
  V_SENDER   VARCHAR2(50) := 'username@163.com'; --发送者邮箱;

  V_CONN     UTL_SMTP.CONNECTION; --到邮件服务器的连接
  V_MSG      VARCHAR2(4000); --邮件内容
  V_TO_EMAIL VARCHAR2(200);
  M          INTEGER := 1;
  N          INTEGER := 1;
  LOG_ID     VARCHAR2(36);
  errorMsg varchar2(2000); --异常信息 
  
  
BEGIN
  LOOP
    V_CONN := UTL_SMTP.OPEN_CONNECTION(V_MAILHOST, 25);
    UTL_SMTP.EHLO(V_CONN, V_MAILHOST); --服务器登录校验 ;
    UTL_SMTP.COMMAND(V_CONN, 'AUTH LOGIN'); --smtp服务器登录校验
    UTL_SMTP.COMMAND(V_CONN,
                     UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(V_USER))));
    UTL_SMTP.COMMAND(V_CONN,
                     UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(V_PASS))));
    UTL_SMTP.MAIL(V_CONN, '<' || V_SENDER || '>'); --设置发件人

    SELECT SUBSTR(P_RECIPIENT,
                  N,
                  LENGTH(SUBSTR(P_RECIPIENT,
                                N,
                                DECODE(INSTR(P_RECIPIENT, ';', 1, M),
                                       0,
                                       LENGTH(P_RECIPIENT),
                                       INSTR(P_RECIPIENT, ';', 1, M)) -
                                DECODE(INSTR(P_RECIPIENT, ';', 1, M),
                                       0,
                                       N - 1,
                                       N))))
      INTO V_TO_EMAIL
      FROM DUAL;

    UTL_SMTP.RCPT(V_CONN, V_TO_EMAIL); --设置收件人
    -- 创建要发送的邮件内容注意报头信息和邮件正文之间要空一行
    V_MSG := 'MIME-Version: 1.0' || UTL_TCP.CRLF || 'Date:' ||
             TO_CHAR(SYSDATE, 'dd mon yy hh24:mi:ss') || UTL_TCP.CRLF ||
             'From: XXXXXXXXXXXXXXXXXXXX' || UTL_TCP.CRLF || 'To: <' ||
             P_RECIPIENT || '>' || UTL_TCP.CRLF || 'Subject: ' || P_SUBJECT ||
             UTL_TCP.CRLF || UTL_TCP.CRLF || UTL_TCP.CRLF || P_MESSAGE ||
             UTL_TCP.CRLF ||
             '------------------------------------------------------------------------------' 
             || UTL_TCP.CRLF || '注:这是系统发送的邮件,无需回复     发件日期:' ||
             TO_CHAR(SYSDATE, 'YYYY/MM/DD hh24:mi:ss') ;

    UTL_SMTP.OPEN_DATA(V_CONN); --打开流
    UTL_SMTP.WRITE_RAW_DATA(V_CONN, UTL_RAW.CAST_TO_RAW(V_MSG));
    UTL_SMTP.CLOSE_DATA(V_CONN); --关闭流
    UTL_SMTP.QUIT(V_CONN); --关闭连接
    N := NVL(INSTR(P_RECIPIENT, ';', N, 1), 0) + 1;
    M := M + 1;
    IF N = 1 THEN
      EXIT;
    END IF;
  END LOOP;
EXCEPTION
  WHEN OTHERS THEN
    IF P_MESSAGE_ID IS NULL THEN
      SELECT SYS_GUID() INTO LOG_ID FROM DUAL;
    ELSE
      LOG_ID := P_MESSAGE_ID;
    END IF;
    errorMsg := SUBSTR(SQLERRM, 1, 2000);
    INSERT INTO SEND_MAIL_DEVICE_AUDIT_LOG
      (ID, SUBJECT, MAIL_ADDRS, SEND_DATE, SQLERR, SUCCESS)
    VALUES
      (LOG_ID,
       SUBSTR(P_SUBJECT, 1, 500),
       SUBSTR(P_SUBJECT, 1, 2000),
       TO_CHAR(SYSDATE, 'yyyymmddhh24miss'),
       errorMsg,
       'F');
    COMMIT;
END PRO_SEND_MAIL;

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值