• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > oracle教程 >

ORACLE自动发邮件代码(4)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-04-16点击:

PROCEDURE P_SPLITE_STR (P_STR VARCHAR2, P_SPLITE_FLAG INT DEFAULT 1 )
    IS
    L_ADDR VARCHAR2 (254) := '';
    L_LEN INT;
    L_STR VARCHAR2 (4000);
    J INT := 0; --表示邮件地址或者附件的个数
    BEGIN
    /*处理接收邮件地址列表,包括去空格、将;转换为,等*/
    L_STR :=
    TRIM (RTRIM (REPLACE (REPLACE (P_STR, ';', ','), ' ', ''), ','));
    L_LEN := LENGTH (L_STR);
    FOR I IN 1 .. L_LEN
    LOOP
    IF SUBSTR (L_STR, I, 1) <> ','
    THEN
    L_ADDR := L_ADDR || SUBSTR (L_STR, I, 1);
    ELSE
    J := J + 1;
    IF P_SPLITE_FLAG = 1
    THEN --表示处理邮件地址
    --前后需要加上'<>',否则很多邮箱将不能发送邮件
    L_ADDR := '<' || L_ADDR || '>';
    --调用邮件发送过程
    MY_ADDRESS_LIST (J) := L_ADDR;
    ELSIF P_SPLITE_FLAG = 2
    THEN --表示处理附件名称
    MY_ACCT_LIST (J) := L_ADDR;
    END IF;
    L_ADDR := '';
    END IF;
    IF I = L_LEN
    THEN
    J := J + 1;
    IF P_SPLITE_FLAG = 1
    THEN
    --调用邮件发送过程
    L_ADDR := '<' || L_ADDR || '>';
    MY_ADDRESS_LIST (J) := L_ADDR;
    ELSIF P_SPLITE_FLAG = 2
    THEN
    MY_ACCT_LIST (J) := L_ADDR;
    END IF;
    END IF;
    END LOOP;
    END;
    ------------------------------------------------写邮件头和邮件内容------------------------------------------
    PROCEDURE WRITE_DATA (P_CONN IN OUT NOCOPY UTL_SMTP.CONNECTION,
    P_NAME IN VARCHAR2,
    P_VALUE IN VARCHAR2,
    P_SPLITE VARCHAR2 DEFAULT ':' ,
    P_CRLF VARCHAR2 DEFAULT L_CRLF )
    IS
    BEGIN
    /* utl_raw.cast_to_raw 对解决中文乱码问题很重要*/
    UTL_SMTP.WRITE_RAW_DATA (
    P_CONN,
    UTL_RAW.CAST_TO_RAW (
    CONVERT (P_NAME || P_SPLITE || P_VALUE || P_CRLF, 'ZHS16GBK')
    )
    );
    END;
    ----------------------------------------写MIME邮件尾部-----------------------------------------------------
    PROCEDURE END_BOUNDARY (CONN IN OUT NOCOPY UTL_SMTP.CONNECTION,
    LAST IN BOOLEAN DEFAULT FALSE )
    IS
    BEGIN
    UTL_SMTP.WRITE_DATA (CONN, UTL_TCP.CRLF);
    IF (LAST)
    THEN
    UTL_SMTP.WRITE_DATA (CONN, LAST_BOUNDARY);
    END IF;
    END;
    ----------------------------------------------发送附件----------------------------------------------------
    PROCEDURE ATTACHMENT (
    CONN IN OUT NOCOPY UTL_SMTP.CONNECTION,
    MIME_TYPE IN VARCHAR2 DEFAULT 'text/plain' ,
    INLINE IN BOOLEAN DEFAULT TRUE ,
    FILENAME IN VARCHAR2 DEFAULT 't.txt' ,
    TRANSFER_ENC IN VARCHAR2 DEFAULT '7 bit' ,
    DT_NAME IN VARCHAR2 DEFAULT '0'
    )
    IS
    L_FILENAME VARCHAR2 (1000);
    BEGIN
    --写附件头
    UTL_SMTP.WRITE_DATA (CONN, FIRST_BOUNDARY);
    --设置附件格式
    WRITE_DATA (CONN, 'Content-Type', MIME_TYPE);
    --如果文件名称非空,表示有附件
    DROP_DIRECTORY (DT_NAME);
    --创建directory
    CREATE_DIRECTORY (DT_NAME, GET_FILE (FILENAME, 1));
    --得到附件文件名称
    L_FILENAME := GET_FILE (FILENAME, 2);
    IF (INLINE)
    THEN
    WRITE_DATA (CONN,
    'Content-Disposition',
    'inline; filename="' || L_FILENAME || '"');
    ELSE
    WRITE_DATA (CONN,
    'Content-Disposition',
    'attachment; filename="' || L_FILENAME || '"');
    END IF;
    --设置附件的转换格式
    IF (TRANSFER_ENC IS NOT NULL)
    THEN
    WRITE_DATA (CONN, 'Content-Transfer-Encoding', TRANSFER_ENC);
    END IF;
    UTL_SMTP.WRITE_DATA (CONN, UTL_TCP.CRLF);
    --begin 贴附件内容
    IF TRANSFER_ENC = 'bit 7'
    THEN
    --如果是文本类型的附件
    BEGIN
    L_FILE_HANDLE := UTL_FILE.FOPEN (DT_NAME, L_FILENAME, 'r'); --打开文件
    --把附件分成多份,这样可以发送超过32K的附件
    LOOP
    UTL_FILE.GET_LINE (L_FILE_HANDLE, L_LINE);
    L_MESG := L_LINE || L_CRLF;
    WRITE_DATA (CONN,
    '',
    L_MESG,
    '',
    '');
    END LOOP;
    UTL_FILE.FCLOSE (L_FILE_HANDLE);
    END_BOUNDARY (CONN);
    EXCEPTION
    WHEN OTHERS
    THEN
    UTL_FILE.FCLOSE (L_FILE_HANDLE);
    END_BOUNDARY (CONN);
    NULL;
    END; --结束文本类型附件的处理
    ELSIF TRANSFER_ENC = 'base64'
    THEN
    --如果是二进制类型的附件
    BEGIN

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1978130638@qq.com ,  QQ