Oracle 发邮件过程

oracle 版本 11g

 CREATE OR REPLACE PROCEDURE pro_sendmail(sender     IN VARCHAR2 DEFAULT '发件人邮箱',
                                              recipient1 IN VARCHAR2 DEFAULT '收件人邮箱',
                                              recipient2 IN VARCHAR2 DEFAULT '收件人邮箱',
                                              recipient3 IN VARCHAR2 DEFAULT '收件人邮箱',
                                              recipient4 IN VARCHAR2 DEFAULT '收件人邮箱',
                                              subject    IN VARCHAR2 DEFAULT '标题',
                                              message    IN VARCHAR2 DEFAULT '邮件内容',
                                              message01    IN VARCHAR2 DEFAULT '邮件内容') IS
   mailhost VARCHAR2(30) := 'smtp.139.com'; --邮箱服务器地址我这里139邮箱
   --receiver VARCHAR2(30) :='监控管理员';
   mail_passwd varchar(20) :='邮箱密码';
   connter_addr        utl_smtp.connection;
   msg_content      VARCHAR2(1000);
BEGIN
   msg_content := 'Date: ' || to_char(SYSDATE , 'yyyy-mm-dd hh24:mi:ss') ||
          utl_tcp.crlf || 'From: ' || utl_tcp.crlf ||
          'subject: ' || subject || utl_tcp.crlf || 'To:           '>;;' || utl_tcp.crlf || 'Cc:           recipient4 || '>' || utl_tcp.crlf || '' || utl_tcp.crlf ||
          message||message01;
   connter_addr   := utl_smtp.open_connection(mailhost, 25);
   utl_smtp.helo(connter_addr, mailhost);
   utl_smtp.command(connter_addr, 'auth login');
   utl_smtp.command(connter_addr,
                    utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(sender))));
   utl_smtp.command(connter_addr,
                    utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(mail_passwd))));
   utl_smtp.mail(connter_addr, sender);      --发件人
   utl_smtp.rcpt(connter_addr, recipient1);  --收件人
   utl_smtp.rcpt(connter_addr, recipient2);
   utl_smtp.rcpt(connter_addr, recipient3);
   utl_smtp.rcpt(connter_addr, recipient4);

  utl_smtp.open_data(connter_addr);          --打开邮箱连接
   utl_smtp.write_raw_data(connter_addr, utl_raw.cast_to_raw(msg_content));
   utl_smtp.close_data(connter_addr);
   utl_smtp.quit(connter_addr);
   EXCEPTION  
 
    WHEN OTHERS THEN
         DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);  
         DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);   
END pro_sendmail;
 
添加ACL规则
 1)创建访问控制列表acl

 BEGIN
    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
                                                                      acl          => 'mail server.xml',
                                                                      description  => ' mail server',
                                                                      principal    => 'SYS',--进行操作的数据库用户且用户要大写
                                                                      is_grant     => TRUE,
                                                                      privilege    => 'connect');
END;

2)将ACL与邮件服务器关联(这里我用139邮箱)

 /*新浪的邮箱服务器地址,如果是用qq作为发送邮件,
smtp.139.com  139邮箱
 smtp.163.com  163邮箱
smtp.126.com  126邮箱
smtp.sina.com 新浪邮箱则用qq邮箱服务器地址smtp.qq .com*/

BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
                                                             acl         => 'mail server.xml',
                                                             host        => 'smtp.139.com',
                                                             lower_port  => 25,
                                                             upper_port  => NULL);
  COMMIT;
END;

,可用dba_network_acls查看是否已经生成

 
SELECT host, lower_port, upper_port, acl FROM sys.dba_network_acls;
 

 
 3)为执行的数据库用户授予连接邮件服务器的权限

 

 
BEGIN
  dbms_network_acl_admin.add_privilege(
                                                           acl        => 'mail server.xml',
                                                           principal =>'SYS',--进行操作的数据库用户且用户要大写                                                                        

                                                           is_grant   =>  TRUE,
                                                           privilege  => 'connect');
END;

 采用dba_network_acl_privileges视图查看授予的权限

 
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 sys.dba_network_acl_privileges;
 

如果配置规则文件有错误可以执行下面语句重新配置
-- 删除acl配置文件


    
begin
  dbms_network_acl_admin.drop_acl(
    'mail server.xml'
  );
  commit;
 end;

 4.utl_tcp.crlf作用:换行

注意在写邮件标题,发送人,接收人,邮件内容时,各个之间一定要有换行,否则会无法发送或者是邮件内容为空。

 

5.中文乱码问题

    utl_smtp.write_raw_data 用该过程替代utl_smtp.write_data可以解决中文乱码的问题。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29065182/viewspace-1689195/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29065182/viewspace-1689195/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库可以使用UTL_SMTP包送电子邮件。UTL_SMTP是Oracle提供的一个包,可以通过SMTP协议送电子邮件。下面是一个简单的例子,展示如何使用UTL_SMTP包在Oracle数据库中自动送电子邮件。 假设你已经有了一个包含要送电子邮件的收件人地址、主题和正文的表。以下是使用UTL_SMTP包送电子邮件的步骤: 1. 首先,你需要在Oracle数据库中启用UTL_SMTP包。你可以使用以下命令启用UTL_SMTP包: ```sql EXECUTE UTL_MAIL.ENABLE; ``` 2. 接下来,你需要编写一个存储过程,该存储过程从包含电子邮件数据的表中选择数据,并使用UTL_SMTP包送电子邮件。以下是一个例子: ```sql CREATE OR REPLACE PROCEDURE send_email AS -- 声明变量 v_mailhost VARCHAR2(255) := 'your_mail_host'; v_port NUMBER := 25; v_sender VARCHAR2(255) := 'sender_email'; v_username VARCHAR2(255) := 'sender_username'; v_password VARCHAR2(255) := 'sender_password'; v_recipient VARCHAR2(255); v_subject VARCHAR2(255); v_message VARCHAR2(4000); v_conn UTL_SMTP.CONNECTION; BEGIN -- 连接SMTP服务器 v_conn := UTL_SMTP.OPEN_CONNECTION(v_mailhost, v_port); UTL_SMTP.HELO(v_conn, v_mailhost); UTL_SMTP.AUTH(v_conn, v_username, v_password); -- 循环遍历邮件表中的每一行数据 FOR r_email IN (SELECT recipient, subject, message FROM email_table) LOOP -- 设置收件人地址、主题和正文 v_recipient := r_email.recipient; v_subject := r_email.subject; v_message := r_email.message; -- 送电子邮件 UTL_SMTP.MAIL(v_conn, v_sender); UTL_SMTP.RCPT(v_conn, v_recipient); UTL_SMTP.DATA(v_conn, 'Subject: ' || v_subject || UTL_TCP.CRLF || 'To: ' || v_recipient || UTL_TCP.CRLF || 'From: ' || v_sender || UTL_TCP.CRLF || UTL_TCP.CRLF || v_message); END LOOP; -- 关闭连接 UTL_SMTP.QUIT(v_conn); EXCEPTION -- 处理异常 WHEN OTHERS THEN UTL_SMTP.CLOSE_CONNECTION(v_conn); RAISE; END; ``` 在上面的存储过程中,你需要将 `v_mailhost`、`v_port`、`v_sender`、`v_username` 和 `v_password` 替换为你自己的邮件服务器和件人信息。该存储过程从 `email_table` 表中选择数据,并将每个电子邮件送给相应的收件人。 3. 最后,你可以使用以下命令调用存储过程送电子邮件: ```sql EXECUTE send_email; ``` 这将会送 `email_table` 表中的所有电子邮件。你可以在表中添加或删除数据,以控制要送的电子邮件。 需要注意的是,为了使用UTL_SMTP包,你需要有相应的权限。另外,如果你的邮件服务器需要SSL或TLS连接,你需要使用UTL_SMTP包的SSL或TLS版本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值