Oracle的邮件发送

CREATE OR REPLACE PROCEDURE SEND_MAIL(SENDER    IN VARCHAR2, --发送人
                                      RECIPIENT IN VARCHAR2, --接收人,多个接收人以逗号分隔
                                      SUBJECT   IN VARCHAR2, --邮件主题
                                      MESSAGE   IN VARCHAR2) IS
  --邮件内容
  MAILHOST VARCHAR2(30) := 'mail.qq.com'; --邮箱服务器
  C        UTL_SMTP.CONNECTION;
  MSG      VARCHAR2(30000);
  TEMP_RECIPIENT VARCHAR2(30000);
BEGIN
  /*MSG := 'Date: ' || TO_CHAR(SYSDATE - 1, 'dd mon yy hh24:mi:ss') ||
  UTL_TCP.CRLF || 'From: <' || SENDER || '>' || UTL_TCP.CRLF ||
  'Subject: ' || SUBJECT || UTL_TCP.CRLF || 'To: <' || RECIPIENT || '>;<' || '191@qq.com' ||'>' ||
  UTL_TCP.CRLF || '' || UTL_TCP.CRLF || MESSAGE;*/
  --将多个收件人重新组装
  TEMP_RECIPIENT := NULL;
  FOR cur IN (SELECT * FROM table(perhost.skg.fn_split(p_str => RECIPIENT, p_delimiter => ','))) LOOP
     IF TEMP_RECIPIENT IS NULL THEN
       TEMP_RECIPIENT := '<' || cur.column_value || '>';
     ELSE
       TEMP_RECIPIENT := TEMP_RECIPIENT || ';' || '<' || cur.column_value || '>';
     END IF;
  END LOOP;
  MSG := 'Date: ' || TO_CHAR(SYSDATE - 1, 'dd mon yy hh24:mi:ss') ||  UTL_TCP.CRLF ||
         'From: <' || SENDER || '>' || UTL_TCP.CRLF ||
         'Subject: ' || SUBJECT || UTL_TCP.CRLF ||
         'TO: ' || TEMP_RECIPIENT || UTL_TCP.CRLF ||
         --'To: <' || RECIPIENT || '>' || UTL_TCP.CRLF
         --'Cc: <' || '1910@qq.com' || '>' || UTL_TCP.CRLF || --抄送人
         '' || UTL_TCP.CRLF || --消息内容必须多一个空行
         MESSAGE;
  --dbms_output.put_line(MSG);
  C := UTL_SMTP.OPEN_CONNECTION(MAILHOST, 25);
  UTL_SMTP.EHLO(C, MAILHOST); --是用 ehlo() 而不是 helo() 函数 ,否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
  UTL_SMTP.COMMAND(C, 'auth login'); --1
  --UTL_SMTP.COMMAND(C, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('191@qq.com')))); --3 --发送邮箱用户名
  UTL_SMTP.COMMAND(C,
                   UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('191')))); --3 --发送邮箱用户名【不加@后面的】
  UTL_SMTP.COMMAND(C,
                   UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('密码')))); --5 --发送邮箱密码
  UTL_SMTP.MAIL(C, SENDER); --发送者,要加@,例如191@qq.com
  --UTL_SMTP.RCPT(C, RECIPIENT);--接收者,要加@,例如191@qq.com
  --UTL_SMTP.RCPT(C, '191@qq.com');
  --UTL_SMTP.RCPT(C, '192@qq.com');
  FOR cur IN (SELECT * FROM table(perhost.skg.fn_split(p_str => RECIPIENT, p_delimiter => ','))) LOOP
     UTL_SMTP.RCPT(C, cur.column_value);
  END LOOP;
  UTL_SMTP.OPEN_DATA(C);
  UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW(MSG));
  UTL_SMTP.CLOSE_DATA(C);
  UTL_SMTP.QUIT(C);
EXCEPTION
  WHEN UTL_SMTP.TRANSIENT_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('Error1: ' || SQLCODE || ', ' || SQLERRM);
    BEGIN
      UTL_SMTP.QUIT(C);
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  WHEN UTL_SMTP.PERMANENT_ERROR THEN
    DBMS_OUTPUT.PUT_LINE('Error2: ' || SQLCODE || ', ' || SQLERRM);
    BEGIN
      UTL_SMTP.QUIT(C);
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error3: ' || SQLCODE || ', ' || SQLERRM);
    BEGIN
      UTL_SMTP.QUIT(C);
    EXCEPTION
      WHEN OTHERS THEN
        NULL;
    END;
END SEND_MAIL;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值