采用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;

时间: 2024-11-03 18:13:17

采用oracle过程发邮件的相关文章

oracle 存储过程发邮件

CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT       VARCHAR2,                                           P_SUB       VARCHAR2,                                           P_SENDOR    VARCHAR2,                                           P_RECEIVER  VARC

System.Web.Mail发邮件引发0x80040217错误的解决过程

 使用System.Web.Mail 写了一个发送邮件程序,一直都工作正常. 最近更换新邮件服务器后,发送邮件时出现0x80040217错误. 从网上搜了一下,有用的结果不多,有说是Web.Mail过时,要改用system.net.mail等等. 后来跟踪代码,发现是进行到验证的步骤时出的问题,于是尝试去掉"@域名",真的可以了. 那为什么不提示用户名错误呢,通过使用控制台telnet测试发现, 新邮件服务的连接,在任何指令出错后都会立即断开,从而引发代码0x80040217错误.

如何通过Oracle实现自动发邮件功能

在内网项目.外网项目中多有 需要自动监控发邮件提醒的功能,因为邮件功能最便捷.便宜.不用开接口,不用接口费用.现 提供 我在一个内网项目中的使用案例: 案例背景: 在有限的资源下,能够自动给下级单位发布 数据考核评分(自动评分)和各 业务数据扣分 汇总统计后的数量(当然可进行拓展邮件信息) 案例工具: oracle;一个邮箱的对外服务调用地址:账号:密码: ----------------------------------------------------------------------

Java Mail---SMTP协议-Java发邮件(带附件)演示过程

转载请注明出处: http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] JavaMail-API简介: 邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件. Sun公司制定了一套API,它封装了邮件通信的各种协议.为Java开发者提供了收发电子邮件的公共接口. 需要的jar包 mail.jar和activation-1.1.0.jar链接: https://github.com/chenhaoxiang/Java/tree/ma

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

利用Laravel自带的Mail类发邮件

由于项目在运行过程中经常用到邮件检测报警的功能,而在之前我都是用shell脚本发送邮件.shell脚本的优点是可以直接处理服务器指令,但是其缺点就是处理数据的能力效率太低,取数据库的许多数据要先把数据写入文件里,然后每行读文件并且分割来取出你想要的数据,相对来说麻烦太多.所以本人就准备直接利用Laravel框架封装好的Mail类直接发邮件,而且php语言相对shell来说数据处理能力简直强太多,所以果断弃坑了. 首先新建一个Laravel项目,在其.env文件里找到MAIL相关值,配好邮件发送账

Mac如何自动发邮件给kindle推送文档

买过kindle的人一定对于它推送的服务印象深刻,只要你的kindle联网在,即便它被放在家里,你也可以在办公室给它发送书籍,等你回家就会发现,书籍已经自动下载好了,在不同平台下(Mac,windows等)都有相应的Send to kindle应用程序,有些程序是不支持中国亚马逊账户的,但我们可以采用通用的方式,通过邮件推送,可能有些人觉得发邮件很麻烦,但如果能实现自动发送邮件,你是否还这样觉得呢 首先需要准备如下几点 kindle绑定一个Amazon账号 在Amazon账户的个人文档设置里添加

发邮件的礼仪汇总---让优秀成为习惯

发邮件的礼仪汇总---让优秀成为习惯 一.关于主题 主题要提纲挈领,添加邮件主题是电子邮件和信笺的主要不同之处,在主题栏里用短短的几个字概括出整个邮件的内容,便于收件人权衡邮件的轻重缓急,分别处理. 1.一定不要空白标题,这是最失礼的. 2.标题要简短,不宜冗长,不要让outlook用…才能显示完你的标题. 3.最好写上来自**公司的邮件,以便对方一目了然又便于留存,时间可以不用注明,因为一般的邮箱会自动生成,写了反而累赘. 4. 标题要能真实反映文章的内容和重要性,切忌使用含义不清的标题,如

发邮件 用base64解码账号密码 方便调试

有时候 需要用各种语言来发邮件. 比如我写过用PHP ,Python, 和Perl的.每个邮件都有自己的邮件模块, 略有不同. 这里要说的是 用base64来 查看 账号 密码 是否正确. 首先打开详细的错误信息, 在登陆的时候,通常会有这么一段 验证登陆 s sendEmail[1805]: DEBUG => SMTP-AUTH: Using LOGIN authentication method s sendEmail[1805]: INFO => Sending: AUTH LOGIN