设置邮件发送
一、設置郵箱服務器連接
BEGIN
--1.創建訪問控制列表sendmail.xml,sendmail.xml控制列表擁有connect權限,并把這個權限給了B用戶,
? DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
?????????????????????? acl=> 'sendmail.xml',?????????????????????? -- ACL的名字,自己定義?? ?
?????????????????????? description => 'sendmail ACL',????????? -- ACL的描述
?????????????????????? principal?? => 'TANG',????????????????????????????? -- 這里是用戶名,大寫,表示把這個ACL的權限賦給B用戶
?????????????????????? is_grant??? => true,??????????????????????????? --true:授權 ;false:禁止
??????????????????????? privilege?? => 'connect');???????????????????? --授予或者禁止的網絡權限
--2.為sendmail.xml控制列表添加resolve權限,且賦給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是郵箱服務器主機名
COMMIT;
END;
設置成功可以查詢到:
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;
二、郵件發送存儲過程:
CREATE OR REPLACE PROCEDURE send_mail2
(
? p_recipient VARCHAR2 default '*',
?? -- 郵件接收人
? p_subject VARCHAR2 default 'Oracle郵件:' || to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),
?? -- 郵件標題
? p_message VARCHAR2 default 'Oracle郵件正文'
) IS
? --下面四個變量請根據實際郵件服務器進行賦值
? v_mailhost VARCHAR2(30) := '192.168.10.202'; --SMTP服務器地址
? v_user???? VARCHAR2(30) := 'oracle@mail.server.com'; --登錄SMTP服務器的用戶名
? v_pass???? VARCHAR2(20) := 'oracle'; --登錄SMTP服務器的密碼
? v_sender?? VARCHAR2(50) := 'oracle@mail.server.com'; --發送者郵箱,一般與 ps_user 對應
? v_conn UTL_SMTP.connection; --到郵件服務器的連接
? v_msg? VARCHAR2(4000); --郵件內容
BEGIN
? v_conn := UTL_SMTP.open_connection(v_mailhost, 25);
? UTL_SMTP.helo(v_conn, v_mailhost); --有些服務器要用UTL_SMTP.ehlo() 來與服務器打招呼
? UTL_SMTP.command(v_conn, 'AUTH LOGIN'); -- smtp服務器登錄校驗
? 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 || '>'); --設置發件人
? UTL_SMTP.rcpt(v_conn, '<' || p_recipient || '>'); --設置收件人
? -- 創建要發送的郵件內容 注意報頭信息和郵件正文之間要空一行
? 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)); --這樣寫標題和內容都能用中文
? UTL_SMTP.close_data(v_conn); --關閉流
? UTL_SMTP.quit(v_conn); --關閉連接
? dbms_output.put_line('郵件發送成功!');
EXCEPTION
? WHEN OTHERS THEN
??? dbms_output.put_line('郵件發送失敗!');
??? DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
??? DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
END;
總結
- 上一篇: RMAN的设置引起删除归档日志无法删除的
- 下一篇: ORACLE RAC 中 SRVCTL