设置邮件发送
一、設(shè)置郵箱服務(wù)器連接
BEGIN
--1.創(chuàng)建訪問控制列表sendmail.xml,sendmail.xml控制列表擁有connect權(quán)限,并把這個權(quán)限給了B用戶,
? DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
?????????????????????? acl=> 'sendmail.xml',?????????????????????? -- ACL的名字,自己定義?? ?
?????????????????????? description => 'sendmail ACL',????????? -- ACL的描述
?????????????????????? principal?? => 'TANG',????????????????????????????? -- 這里是用戶名,大寫,表示把這個ACL的權(quán)限賦給B用戶
?????????????????????? is_grant??? => true,??????????????????????????? --true:授權(quán) ;false:禁止
??????????????????????? privilege?? => 'connect');???????????????????? --授予或者禁止的網(wǎng)絡(luò)權(quán)限
--2.為sendmail.xml控制列表添加resolve權(quán)限,且賦給B用戶
? DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
?????????????????????????? acl=> 'sendmail.xml',
?????????????????????????????????????? principal => 'TANG',
?????????????????????????????????????? is_grant? => true,
?????????????????????????????????????? privilege => 'resolve');
--3.為控制列表ACL sendmail.xml分配可以connect和resolve的host
? DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
??????????????????????? acl? => 'sendmail.xml',
??????????????????????????????????? host => '192.168.10.202');? --smtp.163.com是郵箱服務(wù)器主機(jī)名
COMMIT;
END;
設(shè)置成功可以查詢到:
SELECT host, lower_port, upper_port, acl
FROM dba_network_acls;
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 dba_network_acl_privileges;
二、郵件發(fā)送存儲過程:
CREATE OR REPLACE PROCEDURE send_mail2
(
? p_recipient VARCHAR2 default '*',
?? -- 郵件接收人
? p_subject VARCHAR2 default 'Oracle郵件:' || to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),
?? -- 郵件標(biāo)題
? p_message VARCHAR2 default 'Oracle郵件正文'
) IS
? --下面四個變量請根據(jù)實際郵件服務(wù)器進(jìn)行賦值
? v_mailhost VARCHAR2(30) := '192.168.10.202'; --SMTP服務(wù)器地址
? v_user???? VARCHAR2(30) := 'oracle@mail.server.com'; --登錄SMTP服務(wù)器的用戶名
? v_pass???? VARCHAR2(20) := 'oracle'; --登錄SMTP服務(wù)器的密碼
? v_sender?? VARCHAR2(50) := 'oracle@mail.server.com'; --發(fā)送者郵箱,一般與 ps_user 對應(yīng)
? v_conn UTL_SMTP.connection; --到郵件服務(wù)器的連接
? v_msg? VARCHAR2(4000); --郵件內(nèi)容
BEGIN
? v_conn := UTL_SMTP.open_connection(v_mailhost, 25);
? UTL_SMTP.helo(v_conn, v_mailhost); --有些服務(wù)器要用UTL_SMTP.ehlo() 來與服務(wù)器打招呼
? UTL_SMTP.command(v_conn, 'AUTH LOGIN'); -- smtp服務(wù)器登錄校驗
? UTL_SMTP.command(v_conn, UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));
? UTL_SMTP.command(v_conn, UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));
? UTL_SMTP.mail(v_conn, '<' || v_sender || '>'); --設(shè)置發(fā)件人
? UTL_SMTP.rcpt(v_conn, '<' || p_recipient || '>'); --設(shè)置收件人
? -- 創(chuàng)建要發(fā)送的郵件內(nèi)容 注意報頭信息和郵件正文之間要空一行
? v_msg := 'Date:' || to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') || UTL_TCP.CRLF || 'From: ' || v_sender || '' ||
?????????? UTL_TCP.CRLF || 'To: ' || p_recipient || '' || UTL_TCP.CRLF || 'Subject: ' || p_subject || UTL_TCP.CRLF ||
?????????? UTL_TCP.CRLF -- 這前面是報頭信息
?????????? || p_message; -- 這個是郵件正文
? UTL_SMTP.open_data(v_conn); --打開流
? UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --這樣寫標(biāo)題和內(nèi)容都能用中文
? UTL_SMTP.close_data(v_conn); --關(guān)閉流
? UTL_SMTP.quit(v_conn); --關(guān)閉連接
? dbms_output.put_line('郵件發(fā)送成功!');
EXCEPTION
? WHEN OTHERS THEN
??? dbms_output.put_line('郵件發(fā)送失敗!');
??? DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
??? DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
END;
總結(jié)
- 上一篇: RMAN的设置引起删除归档日志无法删除的
- 下一篇: 关于 运行root.sh 时出错误Tim