CREATE OR REPLACE PROCEDURE p_sendmail
( p_recipient IN varchar2, -- 邮件接收人
p_subject IN varchar2, -- 邮件标题
p_message IN varchar2 -- 邮件正文
)
IS
v_mailhost varchar2(50) := 'smtp.163.com'; -- SMTP服务器地址
v_user varchar2(50) := 'oracle11gocp'; -- 登录SMTP服务器的用户名;只是用户名,不包括163.com部分
v_pass varchar2(50) := 'xxxxxxxxxxxxxxx'; -- 登录SMTP服务器的密码
v_sender varchar2(50) := 'oracle11gocp@163.com'; -- 发送者邮箱
v_conn utl_smtp.connection; -- 到邮件服务器的连接
v_msg varchar2(4000); -- 邮件内容
BEGIN
v_conn := utl_smtp.open_connection(v_mailhost, 25);
utl_smtp.ehlo(v_conn, v_mailhost);
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, ' '); -- 设置发件人
utl_smtp.rcpt(v_conn, ' '); -- 设置收件人
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));-- write_raw_data函数支持中文
utl_smtp.close_data(v_conn); -- 关闭流
utl_smtp.quit(v_conn); -- 关闭连接
exception
WHEN others THEN
dbms_output.put_line(dbms_utility.format_error_stack);
dbms_output.put_line(dbms_utility.format_call_stack);
dbms_output.put_line('sqlcode is :' || sqlcode);
dbms_output.put_line('sqlerrm is :' || sqlerrm);
END p_sendmail;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class CallProc {
public static void main(String[] args) {
try {
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.106.161:1521:oradb";
String username = "test";
String password = "test";
Connection conn = DriverManager.getConnection(url, username,
password);
String sql = "{call p_sendmail(?,?,?)}";
CallableStatement cstmt = conn.prepareCall(sql);
cstmt.setString(1, "805779675@qq.com");
cstmt.setString(2, "title test");
cstmt.setString(3, "content test");
cstmt.execute();
cstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}