采用oracle过程发邮件

简介:
+关注继续查看

收件人只有一个的过程如下: 

 

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: <' || sender || '>' || utl_tcp.crlf ||
'subject: ' || subject || utl_tcp.crlf || 'To: <' || recipient || '>' ||
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: <' || sender || '>' || utl_tcp.crlf ||
'subject: ' || subject || utl_tcp.crlf || 'To: <' || recipient1 ||
'>;<' || recipient2 || '>' || utl_tcp.crlf || 'Cc: <' ||
recipient3 || '>' || 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;













本文转自东方之子736651CTO博客,原文链接:http://blog.51cto.com/ecloud/1441728 ,如需转载请自行联系原作者

相关文章
|
3月前
|
人工智能 运维 Oracle
ChatGPT能代替Oracle DBA吗?用Oracle OCP(1z0-083)的真题测试一下(文末投票)
ChatGPT已经通过了很多考试,姚远老师是Oracle OCP和MySQL OCP讲师,我很好奇ChatGPT能不能通过Oracle OCP的考试呢?让我们拿Oracle 19c OCP考试(1z0-082)的真题对ChatGPT进行一个测试。
|
7月前
|
Oracle 关系型数据库
oracle复杂查询备忘
oracle复杂查询备忘
|
Oracle 关系型数据库 Windows
oracle学习27-ora-12154和客户端版本低
oracle学习27-ora-12154和客户端版本低
81 0
oracle学习27-ora-12154和客户端版本低
|
SQL Oracle 关系型数据库
oracle学习39-oracle11g密码过期后的解决方法
oracle学习39-oracle11g密码过期后的解决方法
68 0
|
Oracle 关系型数据库
Oracle 12c连接时报错ORA-28040问题解决方法
ORA-28040,:ORA-28040: No matching authentication protocol
21580 0
|
SQL Oracle Java
关于安装Oracle——安装流程
  这次安装Oracle出现了很多错误,在此记下以防再次出错,也记录下我整个的安装流程 1.下载        我下载安装的是企业版 2.安装   解压完安装包运行setuo.exe就可以     首先是安全更新(安全更新我直接点击下一步跳过了)          这一项选择创建和配置数据库          因为只是在单机安装,所以选择了桌面类          本来想使用现有windows用户来着,但是一直提示没有管理员权限,就直接创建了一个新的用户     用户名:oracle  密码:123456          接下来就是确认安装目录,和全局数据库名。
1174 0
|
Oracle 关系型数据库 数据库
|
监控 Oracle 关系型数据库
|
监控 Oracle 关系型数据库
推荐文章
更多