采用oracle过程发邮件
收件人只有一個(gè)的過(guò)程如下:
?
CREATE OR REPLACE PROCEDURE p_mail_sina(sender IN VARCHAR2,--發(fā)送人
recipient IN VARCHAR2,--接收人
subject IN VARCHAR2,--郵件主題
message IN VARCHAR2) IS --郵件內(nèi)容
mailhost VARCHAR2(30) := 'smtp.sina.com' ; --新浪郵箱服務(wù)器
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 --發(fā)送郵箱用戶名
utl_smtp.command(c, --4
utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('密碼'))));--5 --發(fā)送郵箱密碼
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;
注意事項(xiàng):
1.由于在測(cè)試中我采用的都是外網(wǎng)的方式發(fā)送接收郵件,因此必須加上用***圈出的這部分代碼進(jìn)行認(rèn)證。內(nèi)網(wǎng)內(nèi)部發(fā)送就不需要了,不過(guò)沒(méi)測(cè)試。
2. ***圈出的這部分代碼第三行和第五行填寫(xiě)的內(nèi)容分別是郵箱服務(wù)器對(duì)應(yīng)的郵箱用戶名和密碼。
3.用于發(fā)送的郵箱的服務(wù)器必須創(chuàng)建acl,主要是三個(gè)步驟
1)創(chuàng)建訪問(wèn)控制列表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',--進(jìn)行操作的數(shù)據(jù)庫(kù)用戶且用戶要大寫(xiě)
is_grant => TRUE,
privilege => 'connect');
END;
2)將ACL與郵件服務(wù)器關(guān)聯(lián)(這一步,采用不同的郵箱服務(wù)器就需要分別執(zhí)行,如想用qq郵箱發(fā)送,那么就必須換成qq郵箱服務(wù)器執(zhí)行一遍)
?
BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'email_server_permissions.xml',
host => 'smtp.sina.com', /*新浪的郵箱服務(wù)器地址,如果是用qq作為發(fā)送郵件,
則用qq郵箱服務(wù)器地址smtp.qq.com*/
lower_port => 25,
upper_port => NULL);
COMMIT;
END;
關(guān)聯(lián)后,可用dba_network_acls查看是否已經(jīng)生成
?
SELECT host, lower_port, upper_port, acl FROM sys.dba_network_acls;
?
3)為執(zhí)行的數(shù)據(jù)庫(kù)用戶授予連接郵件服務(wù)器的權(quán)限
?
?
BEGIN
dbms_network_acl_admin.add_privilege(
acl => 'email_server_permissions.xml',
principal =>'database_user',--進(jìn)行操作的數(shù)據(jù)庫(kù)用戶且用戶要大寫(xiě)
is_grant => TRUE,
privilege => 'connect');
END;
采用dba_network_acl_privileges視圖查看授予的權(quán)限
?
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作用:換行
注意在寫(xiě)郵件標(biāo)題,發(fā)送人,接收人,郵件內(nèi)容時(shí),各個(gè)之間一定要有換行,否則會(huì)無(wú)法發(fā)送或者是郵件內(nèi)容為空。
?
5.中文亂碼問(wèn)題
utl_smtp.write_raw_data 用該過(guò)程替代utl_smtp.write_data可以解決中文亂碼的問(wèn)題。
?
?
6.自己測(cè)試中發(fā)現(xiàn)如果采用qq郵箱發(fā)送郵件,則
utl_smtp.helo(c, mailhost);語(yǔ)句必須放在utl_smtp.command之前,否則無(wú)法發(fā)送,但是新浪郵箱則無(wú)所謂,這個(gè)不知何故。 ???
?
?
發(fā)給多個(gè)人
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;
轉(zhuǎn)載于:https://blog.51cto.com/ecloud/1441728
總結(jié)
以上是生活随笔為你收集整理的采用oracle过程发邮件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SVN常见错误
- 下一篇: rhel5 给grub 加密,亲测!