设为首页 收藏本站
查看: 845|回复: 0

[经验分享] 采用oracle过程发邮件

[复制链接]

尚未签到

发表于 2018-9-11 11:51:57 | 显示全部楼层 |阅读模式
  收件人只有一个的过程如下:
  CREATE OR REPLACE PROCEDURE p_mail_sina(sender IN VARCHAR2,--发送人
  recipient IN VARCHAR2,--接收人
  subject IN VARCHAR2,--邮件主题
  message IN VARCHAR2) IS --邮件内容
  mailhost VARCHAR2(30) := 'smtp.sina.com' ; --新浪邮箱服务器
  c utl_smtp.connection;
  msg VARCHAR2(1000);
  BEGIN
  msg := 'Date: ' || to_char(SYSDATE - 1, 'dd mon yy hh24:mi:ss') ||
  utl_tcp.crlf || 'From: ' || utl_tcp.crlf ||
  'subject: ' || subject || utl_tcp.crlf || 'To: ' ||
  utl_tcp.crlf || '' || utl_tcp.crlf || message;
  c := utl_smtp.open_connection(mailhost, 25);
  utl_smtp.command(c, 'auth login'); --1
  utl_smtp.command(c, --2
  utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('用户名')))); --3 --发送邮箱用户名
  utl_smtp.command(c, --4
  utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('密码'))));--5 --发送邮箱密码
  utl_smtp.helo(c, mailhost);
  utl_smtp.mail(c, sender);
  utl_smtp.rcpt(c, recipient);
  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 OR utl_smtp.permanent_error THEN
  BEGIN
  utl_smtp.quit(c);
  EXCEPTION
  WHEN OTHERS THEN
  NULL;
  END;
  WHEN OTHERS THEN
  dbms_output.put_line(SQLERRM);
  END p_mail_sina;
  注意事项:
  1.由于在测试中我采用的都是外网的方式发送接收邮件,因此必须加上用***圈出的这部分代码进行认证。内网内部发送就不需要了,不过没测试。
  2. ***圈出的这部分代码第三行和第五行填写的内容分别是邮箱服务器对应的邮箱用户名和密码。
  3.用于发送的邮箱的服务器必须创建acl,主要是三个步骤
  1)创建访问控制列表acl
  BEGIN
  DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
  acl => 'email_server_permissions.xml',
  description => 'Enables network permissions for the e-mail server',
  principal => 'database_user',--进行操作的数据库用户且用户要大写
  is_grant => TRUE,
  privilege => 'connect');
  END;
  2)将ACL与邮件服务器关联(这一步,采用不同的邮箱服务器就需要分别执行,如想用qq邮箱发送,那么就必须换成qq邮箱服务器执行一遍)
  BEGIN
  DBMS_NETWORK_ACL_ADMIN.assign_acl (
  acl => 'email_server_permissions.xml',
  host => 'smtp.sina.com', /*新浪的邮箱服务器地址,如果是用qq作为发送邮件,
  则用qq邮箱服务器地址smtp.qq.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 => 'email_server_permissions.xml',
  principal =>'database_user',--进行操作的数据库用户且用户要大写
  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;
  4.utl_tcp.crlf作用:换行
  注意在写邮件标题,发送人,接收人,邮件内容时,各个之间一定要有换行,否则会无法发送或者是邮件内容为空。
  5.中文乱码问题
  utl_smtp.write_raw_data 用该过程替代utl_smtp.write_data可以解决中文乱码的问题。
  6.自己测试中发现如果采用qq邮箱发送邮件,则
  utl_smtp.helo(c, mailhost);语句必须放在utl_smtp.command之前,否则无法发送,但是新浪邮箱则无所谓,这个不知何故。 ???
  发给多个人
  CREATE OR REPLACE PROCEDURE p_sendmailto_many(sender IN VARCHAR2,
  recipient1 IN VARCHAR2,
  recipient2 IN VARCHAR2,
  recipient3 IN VARCHAR2,
  subject IN VARCHAR2,
  message IN VARCHAR2) IS
  mailhost VARCHAR2(30) := 'smtp.qq.com';
  c utl_smtp.connection;
  msg VARCHAR2(1000);
  BEGIN
  msg := 'Date: ' || to_char(SYSDATE - 1, 'dd mon yy hh24:mi:ss') ||
  utl_tcp.crlf || 'From: ' || utl_tcp.crlf ||
  'subject: ' || subject || utl_tcp.crlf || 'To: ;' || utl_tcp.crlf || 'Cc: ' || utl_tcp.crlf || '' || utl_tcp.crlf ||
  message;
  c := utl_smtp.open_connection(mailhost, 25);
  utl_smtp.helo(c, mailhost);
  utl_smtp.command(c, 'auth login');
  utl_smtp.command(c,
  utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(sender))));
  utl_smtp.command(c,
  utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('password'))));
  utl_smtp.mail(c, sender);
  utl_smtp.rcpt(c, recipient1);
  utl_smtp.rcpt(c, recipient2);
  utl_smtp.rcpt(c, recipient3);
  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);
  END p_sendmailto_many;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-571980-1-1.html 上篇帖子: oracle 运行startup报错failure in processing system parameters 下篇帖子: Linux下oracle显示乱码解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表