oracle—email邮件发送

一.会存在ACL的控制列表权限问题
Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务。需要进行权限授权才可以,比如需要通过oracle发送邮件。

前提:具有dba权限的用户才能进行授权,否则会出现“未声明字符DBMS_NETWORK_ACL_ADMIN”
a.给用户授权dba   grant connect,resource,dba to 用户;
b.重新登录pl/sql developer,选择dba登录
之后就可以授权了。
BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl          => 'sendmail_acl.xml',
    description  => 'Enables network permissions for the e-mail server',
    principal    => 'DBO_TEMS',--区分大小写
    is_grant     => TRUE,
    privilege    => 'connect',
    start_date   => SYSTIMESTAMP,
    end_date     => NULL);

  COMMIT;
END;
  SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
 --2. 给用户增加访问网络的权限
   begin
  dbms_network_acl_admin.add_privilege (
  acl => 'sendmail_acl.xml',
  principal => 'DBO_TEMS',  --用户
  is_grant => true,
  privilege => 'connect'
  );
  commit;
  end;
  --3.指派ACL
  begin
      dbms_network_acl_admin.assign_acl(
      acl => 'sendmail_acl.xml',
      host => '*'
      );
    end;
    commit;
--4. 查询
select host, lower_port, upper_port, acl from dba_network_acls;
select acl,principal,privilege,is_grant,to_char(start_date, 'dd-mon-yyyy') as start_date,to_char(end_date, 'dd-mon-yyyy') as end_date from dba_network_acl_privileges;
--5. 查询库中的ACL
select any_path from resource_view where any_path like '/sys/acls/%.xml';
--6. 删除ACL
begin
dbms_network_acl_admin.drop_acl(acl => 'sendmail_acl.xml');--
commit;
end;


二:邮件发送(用户名、密码未通过验证,会报永久性错误)
CREATE OR REPLACE PROCEDURE DBO_TEMS.p_send_mail(
    p_recipient VARCHAR2, -- 邮件接收人
    p_subject VARCHAR2, -- 邮件标题
    p_message VARCHAR2)-- 邮件正文
AS
   v_conn UTL_SMTP.connection; --定义连接
   v_mailhost VARCHAR2(30);
   v_user VARCHAR2(30);
   v_pass VARCHAR2(20);
   v_sender VARCHAR2(50);
   v_msg varchar2(4000); --邮件内容
   --v_p_need_smtp number(1);
   BEGIN
     v_mailhost := 'smtp.163.com'; --SMTP服务器地址smtp.yeah.net
     v_user := 'xxxxx@163.com'; --登录SMTP服务器的用户名
     v_pass := xxxxxxx'; --登录SMTP服务器的密码
     v_sender := xxxxx@163.com'; --发送者邮箱,一般与 ps_user 对应
     --v_p_need_smtp := 1;
     /*初始化邮件服务器信息,连接邮件服务器*/
     v_conn := UTL_SMTP.OPEN_CONNECTION(v_mailhost, 25);
     UTL_SMTP.HELO(v_conn, v_mailhost);
     --UTL_SMTP.ehlo(v_conn, v_mailhost);
     /* smtp服务器登录校验 */
     --IF v_p_need_smtp = 1 THEN
       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(v_user))));
       UTL_SMTP.command(v_conn, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.cast_to_raw(v_pass))));
     --END IF;
 
     /*设置发送地址和接收地址*/
     UTL_SMTP.mail(v_conn, '<'||v_sender||'>');
     UTL_SMTP.rcpt(v_conn, '<'||p_recipient||'>');
    
     -- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行
     v_msg :='Date:'|| TO_CHAR(SYSDATE, 'yyyy mm dd hh24:mi:ss')
     || UTL_TCP.CRLF || 'From: '|| v_sender || ''
     || UTL_TCP.CRLF || 'To: ' || p_recipient || ''
     || UTL_TCP.CRLF || 'Subject: ' || p_subject
     || UTL_TCP.CRLF || UTL_TCP.CRLF -- 这前面是报头信息
     || p_message; -- 这个是邮件正文
     UTL_SMTP.open_data(v_conn); --打开流
     --转换字符集 gaiwei modify 解决中文乱码
     --UTL_SMTP.WRITE_DATA(v_conn, 'Content-Type: text/plain;charset=utf-8' ||chr(13) || chr(10));
     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); --关闭连接

    EXCEPTION
    WHEN OTHERS THEN
    DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
    DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
 
  END;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值