Oracle邮件发送(内容中带有收件人独有信息)

Oracle邮件发送(内容中带有收件人独有信息)

Oracle邮件发送(内容中带有收件人独有信息)

Oracle发送邮件最简单的应该就是用smtp,具体使用和参数讲解我这儿没有

简单来说,发送邮件的思路就是

确认收件人的信息(邮箱账号密码)
确认服务器的信息(SMTP的服务器ip,地址等)
确认邮件头信息(发件人,收件人,主题)
确认邮件内容(内容为HTML格式,可以用编译器(比如vscode)先设计好,然后再往里面塞)

直接拿一个例子来说明(编译器为PL/SQL),需求是从用户表中找到创建时间在两天之内的用户,邮件欢迎并通知相关内容,内容中要带有用户的姓名以及一些独有信息

存储包的头

create or replace package send_email_pak is
  --执行
  procedure send_email_main;
  --发送邮件
  procedure send_mail(p_userid varchar2, p_email varchar2);
end send_email_pak;

存储包的体,打了一堆注释

--------------------以下为体---------------------
create or replace package body send_email_pak is
  type g_email_tbl is table of varchar2(100) index by binary_integer;
  /*==================================================
  获取用户并执行发送邮件,对每个人都发送一封
  ==================================================*/
  procedure send_email_main is
    --获取最近两天的用户,已经发过的就不用发了
    cursor aaa is
      select u.userid, u.email
        from user_table_name u--取出用户表内容
       where u.createtime > to_char(sysdate - 2, 'yyyy-mm-dd')--创建时间在两天之内
         and u.email is not null--只要有邮箱的
         and not exists (select 1 from send_email_log s where s.userid = u.userid);--发过的就不发了
  begin
  --打开游标取内容
    for main in aaa loop
      --执行发送邮件的方法
	  --为什么不直接批量发送,是因为在邮件内容中使用了每个收件人的名字作为其中的内容,所以就直接一对一多次执行实现了
      send_mail(main.userid, main.email);
      --记录发送日志
      insert into send_email_log(userid,logtime)(select main.userid,sysdate from dual);
    end loop;
  end send_email_main;
  /*================================================== 
   初始化邮箱        
  ==================================================*/
  procedure cshyx(p_email varchar2,p_conn  out utl_smtp.connection) is
  begin
    p_conn := utl_smtp.open_connection(smtp服务器主机的ip,smtp服务器正在侦听的端口号); 
    utl_smtp.ehlo(p_conn, smtp服务器地址);
    utl_smtp.command(p_conn, 'auth login');--smtp服务器登录校验
utl_smtp.command(p_conn,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(发件人邮箱账号))));
utl_smtp.command(p_conn,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(发件人邮箱密码))));
    utl_smtp.mail(p_conn, 发件人邮箱账号);
    utl_smtp.rcpt(p_conn, 收件人邮箱账号);
    utl_smtp.open_data(p_conn);
    utl_smtp.write_data(p_conn, 'from: '||p_smtpemail|| utl_tcp.crlf); --发件人地址
    utl_smtp.write_data(p_conn, 'to:'||p_email||''|| utl_tcp.crlf); --收件人地址
    utl_smtp.write_raw_data(p_conn, utl_raw.cast_to_raw(convert('subject:' || '主题' ||utl_tcp.crlf,'zhs16gbk')));--主题
  exception
    when utl_smtp.transient_error or utl_smtp.permanent_error then
      utl_smtp.quit(p_conn);
  end cshyx;
  /*==================================================
   发送短信的主体                            
  ==================================================*/
  procedure send_mail(p_userid varchar2, p_email varchar2) is
    v_body       long;
    v_start      long;
    conn         utl_smtp.connection;
  begin    
    --开始拼接html内容
    v_start := '<html><body>';
    --初始化邮箱
    cshyx(p_email,conn);
    --简体中文
    utl_smtp.write_raw_data(conn,utl_raw.cast_to_raw(convert('content-type:text/html;charset=gb2312' ||utl_tcp.crlf, 'zhs16gbk')));
    utl_smtp.write_data(conn, utl_tcp.crlf);
    --拼出来的html内容主体
    v_body := v_start || '<br><tr><td>'||html不会写的话网上查吧,就不举例子了||'<br></td></tr></body></html>';
	-------------
    utl_smtp.write_data(conn,utl_tcp.crlf);
    utl_smtp.write_raw_data(conn,utl_raw.cast_to_raw(convert(v_body, 'zhs16gbk')));
    utl_smtp.close_data(conn);
    utl_smtp.quit(conn);
  end send_mail;
end send_email_pak;

以上

posted @ 2022-11-23 17:27  DbWong_0918  阅读(257)  评论(0编辑  收藏  举报