ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
PL/SQL でメール送信 ( No.10 )
日時: 2008/07/05 13:26
名前: lightbox



日本語に UTF-8 を使用しているので、正式な使用と言うより、
ログ代わりで使うと良いと思います。
また、メールサーバがOracleサーバと同じネットワークであると想定して、
PLAIN 認証でログインしています。

PROCEDURE SEND_MAIL
(
	PM_SERVER IN VARCHAR2
	,PM_PORT IN PLS_INTEGER
	,PM_USER IN VARCHAR2
	,PM_PASS IN VARCHAR2
	,PM_TO IN VARCHAR2
	,PM_FROM IN VARCHAR2
	,PM_SUBJECT IN VARCHAR2
	,PM_BODY IN VARCHAR2
)

/**********************************************************/
/* 変数の定義 */
/**********************************************************/
AS
	con UTL_SMTP.CONNECTION;
	ret UTL_SMTP.reply;

/**********************************************************/
/* 内部プロシージャ */
/**********************************************************/
PROCEDURE send_header(name IN VARCHAR2, header IN VARCHAR2)
AS
BEGIN
	UTL_SMTP.WRITE_DATA(con, name || ': ' || header || UTL_TCP.CRLF);
END;

/**********************************************************/
/* 処理開始 */
/**********************************************************/
BEGIN
	con := UTL_SMTP.OPEN_CONNECTION(PM_SERVER,PM_PORT,60);
	UTL_SMTP.EHLO(con, 'localhost');

	ret := UTL_SMTP.COMMAND(
		con,
		'AUTH',
		'PLAIN ' || 
		UTL_ENCODE.TEXT_ENCODE(
			chr(0)||PM_USER||chr(0)||PM_PASS,null,1
		)
	);
	DBMS_OUTPUT.PUT_LINE(ret.text);

	UTL_SMTP.MAIL(con, PM_FROM);
	UTL_SMTP.RCPT(con, PM_TO);

	UTL_SMTP.OPEN_DATA(con);

	send_header('From', '<'||PM_FROM||'>');
	send_header('To', '<'||PM_TO||'>');
	send_header('Date', TO_CHAR(
		sysdate,
		'Dy, dd Mon yyyy HH24:MI:SS',
		'NLS_DATE_LANGUAGE = AMERICAN')||' +0900'
	);

	send_header('Subject', 
		UTL_ENCODE.MIMEHEADER_ENCODE(PM_SUBJECT,'UTF8',1) );
	send_header('content-type', 
		'text/plain; charset=utf-8' );
	send_header('content-transfer-encoding', 
		'base64' );

	UTL_SMTP.WRITE_DATA(con, UTL_TCP.CRLF || 
		UTL_ENCODE.TEXT_ENCODE(PM_BODY,'UTF8',1) );
	UTL_SMTP.CLOSE_DATA(con);

	UTL_SMTP.QUIT(con);

/**********************************************************/
/* 一番外側のブロックの例外処理 */
/**********************************************************/
EXCEPTION
	WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
	BEGIN
		DBMS_OUTPUT.PUT_LINE(
		'メール送信でエラー:'||SQLCODE||':'||SQLERRM);
		UTL_SMTP.QUIT(con);
	EXCEPTION
		WHEN
		   UTL_SMTP.TRANSIENT_ERROR OR
		   UTL_SMTP.PERMANENT_ERROR THEN
			DBMS_OUTPUT.PUT_LINE(
			'QUITが失敗しました:'||SQLCODE||':'||SQLERRM);
	END;
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生:'||SQLCODE||':'||SQLERRM);
END;