如何使用Oracle 10 g Forms发送电子邮件

时间:2016-01-09 08:48:02

标签: oracle plsql sendmail

我制作一个我想要的表格,当我点击按钮发送电子邮件时,我会收到来自互联网的电子邮件代码

    CREATE OR REPLACE FUNCTION FSC.SEND_MAIL
(pIssuer IN VARCHAR2,
pReceiver IN VARCHAR2,
pSender IN VARCHAR2,
pSubject IN VARCHAR2,
pMessage IN VARCHAR2) RETURN VARCHAR2 IS

c utl_smtp.connection;
respuesta utl_smtp.reply;
pServer VARCHAR2(50) := '192.168.0.6';

BEGIN

-- Open the connection to the mail server
c := utl_smtp.open_connection(pServer);
respuesta := utl_smtp.helo(c, pServer);

-- Start the Issuer mail.
respuesta := utl_smtp.mail(c, pSender);

-- Starts Receiver
respuesta := utl_smtp.rcpt(c, pReceiver);

respuesta := utl_smtp.open_data(c);
-- Enter the email header
utl_smtp.write_data(c, 'From: ' || pIssuer || utl_tcp.CRLF);
utl_smtp.write_data(c, 'To: ' || pReceiver || utl_tcp.CRLF);
-- Enter the Subject
utl_smtp.write_data(c, 'Subject: ' || pSubject || utl_tcp.CRLF);
-- Write the message text.
utl_smtp.write_data(c, utl_tcp.CRLF || pMessage);
utl_smtp.write_data(c, utl_tcp.CRLF || '.');

respuesta := utl_smtp.close_data(c);

-- Close connection
respuesta := utl_smtp.quit(c);

RETURN '0';

EXCEPTION
WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN
utl_smtp.quit(c);
RETURN sqlerrm;
--raise_application_error(-20000,
-- 'The sending of the email has failed by returning the following error: ' || sqlerrm);
WHEN OTHERS THEN
RETURN sqlerrm;
END;
/

我在sql中创建了这个函数并且它已成功运行但是当我执行时没有电子邮件发送到我的欲望地址

declare

begin

dbms_output.put_line(SEND_MAIL('usmanafb@ctm.com.pk','usmanafb@ctm.com.pk','usmanafb@ctm.com.pk','Testing','email message'));
end;

我使用本地交换机进行eamil发送,该服务器的IP地址为192.168.0.6

这个代码中的第二个问题,当我在Oracle 10 g表单中创建相同的函数时,它会给我这个错误

utl_tcp.CRLF无法直接访问远程包

1 个答案:

答案 0 :(得分:1)

我使用这个通用程序发送邮件。它还支持附件(仅限纯文本),邮件不限于32767个字符。

如果您根本不需要附件,则删除它应该没有问题。

PRIORITY_HIGH           CONSTANT INTEGER := 1;
PRIORITY_NORMAL         CONSTANT INTEGER := 3;
PRIORITY_LOW            CONSTANT INTEGER := 5;


PROCEDURE SendMail(
    Subject IN VARCHAR2, 
    Message IN OUT CLOB, 
    ToMail IN VARCHAR2,   
    FromMail IN VARCHAR2, FromName IN VARCHAR2,
    Attachment IN OUT CLOB, FileName IN VARCHAR2,
    Priority IN INTEGER DEFAULT PRIORITY_NORMAL) IS

    MIME_BOUNDARY   CONSTANT VARCHAR2(50) := '====Multipart.Boundary.689464861147414354====';
    MIME_MIXED      CONSTANT VARCHAR2(50) := 'multipart/mixed;';
    MIME_TEXT       CONSTANT VARCHAR2(50) := 'text/plain;';
    MIME_HTML       CONSTANT VARCHAR2(50) := 'text/html;';  
    MAIL_HOST       CONSTANT VARCHAR2(50) := '192.168.0.6'; -- try also 'mailhost'

    con UTL_SMTP.connection;
    ret UTL_SMTP.reply;
    Charset VARCHAR2(20);
    Footer VARCHAR2(1000);

    ClobLen PLS_INTEGER;
    amount BINARY_INTEGER := 8192;
    buffer VARCHAR2(16384);
    offset PLS_INTEGER := 1;
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i');

BEGIN

    SELECT UTL_I18N.MAP_CHARSET(VALUE)
    INTO Charset
    FROM V$NLS_PARAMETERS
    WHERE PARAMETER = 'NLS_CHARACTERSET';

    -- setup mail header
    con := UTL_SMTP.OPEN_CONNECTION(MAIL_HOST, 25);
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); -- assuming your database is in the same domain as your mail server
    ret := UTL_SMTP.Mail(con, FromMail);
    ret := UTL_SMTP.rcpt(con, ToMail);
    -- simply call "UTL_SMTP.rcpt(con, ...);" again in order to add further recipient
    ret := UTL_SMTP.open_data(con);

    IF FromName IS NOT NULL THEN
        UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||Utl_Tcp.CRLF);
    ELSE
        UTL_SMTP.write_data(con, 'From: <'||FromMail||'>'||Utl_Tcp.CRLF);
    END IF;
    UTL_SMTP.write_data(con, 'To: <'||ToMail||'>'||Utl_Tcp.CRLF);
    --  UTL_SMTP.write_data(con, 'Cc: <'||CcMail||'>'||Utl_Tcp.CRLF);       
    UTL_SMTP.write_data(con, 'Subject: '||Subject||Utl_Tcp.CRLF);
    UTL_SMTP.write_data(con, 'X-Priority: '||Priority||Utl_Tcp.CRLF);

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN
        UTL_SMTP.write_data(con, 'Mime-Version: 1.0' || Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, 'Content-Type: '||MIME_MIXED||' boundary="'||MIME_BOUNDARY||'"' || Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, 'This is a multipart message in MIME format.' || Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF);
    END IF;

    Footer := 'Message from '||SYS_CONTEXT('USERENV', 'DB_NAME')||' sent at '||TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss');
    IF isHTML THEN
        UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || Utl_Tcp.CRLF);
        Message := REPLACE(message, '</body>', '<p>'||Footer||'</p></body>');
    ELSE 
        UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || Utl_Tcp.CRLF);
    END IF;

    -- Mail Body
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
    ClobLen := DBMS_LOB.GETLENGTH(Message);
    LOOP
        EXIT WHEN offset > ClobLen;
        DBMS_LOB.READ(Message, amount, offset, BUFFER);
        UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(BUFFER));
        offset := offset + amount;
    END LOOP;   
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
    IF NOT isHTML THEN
        UTL_SMTP.write_data(con, Utl_Tcp.CRLF || Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, Footer);
        UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
    END IF;

    IF Attachment IS NOT NULL AND FileName IS NOT NULL THEN
        -- Mail Attachment
        UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY || Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, 'Content-Type: '||MIME_TEXT||' name="'||Filename||'"'|| Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, 'Content-Disposition: attachment; filename="'||Filename||'"'|| Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, Utl_Tcp.CRLF);

        offset := 1;
        ClobLen := DBMS_LOB.GETLENGTH(Attachment);
        LOOP
            EXIT WHEN offset > ClobLen;
            DBMS_LOB.READ(Attachment, amount, offset, BUFFER);
            UTL_SMTP.write_raw_data(con, Utl_Raw.cast_to_raw(BUFFER));
            offset := offset + amount;
        END LOOP;
        UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
        UTL_SMTP.write_data(con, '--'||MIME_BOUNDARY||'--' || Utl_Tcp.CRLF);
    END IF;

    -- finish mail
    ret := UTL_SMTP.close_data(con);
    ret := UTL_SMTP.quit(con);

EXCEPTION
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
        UTL_SMTP.quit(con);
        RAISE;
END SendMail;

请注意,不要错过UTL_SMTP.write_data(con, UTL_TCP.CRLF)行。它们看起来多余,但大多数都是必需的!还有礼貌的消息,例如“这是MIME格式的多部分消息”。如果是附件,需要正确显示您的邮件。

如果您仍遇到问题,请在UTL_SMTP上的每个函数调用后生成dbms_output.put_line(ret.code||': '||ret.text);

这里的程序相同,但可以根据您的需要进行操作:

FUNCTION SendMail(
    Subject IN VARCHAR2, 
    Message IN VARCHAR2, 
    FromMail IN VARCHAR2, FromName IN VARCHAR2, 
    ToMail IN VARCHAR2) RETURN VARCHAR2 IS

    MIME_TEXT       CONSTANT VARCHAR2(50) := 'text/plain;';
    MIME_HTML       CONSTANT VARCHAR2(50) := 'text/html;';  
    MAIL_HOST       CONSTANT VARCHAR2(50) := '192.168.0.6'; -- try also 'mailhost'

    con UTL_SMTP.connection;
    ret UTL_SMTP.reply;
    Charset VARCHAR2(20);
    isHTML BOOLEAN := REGEXP_LIKE(DBMS_LOB.SUBSTR(Message, 1000, 1), '<(html)|(body)', 'i');

BEGIN

    SELECT UTL_I18N.MAP_CHARSET(VALUE)
    INTO Charset
    FROM V$NLS_PARAMETERS
    WHERE PARAMETER = 'NLS_CHARACTERSET';

    -- setup mail header
    con := UTL_SMTP.OPEN_CONNECTION(MAIL_HOST, 25);
    ret := UTL_SMTP.helo(con, SYS_CONTEXT('USERENV', 'DB_DOMAIN')); -- assuming your database is in the same domain as your mail server
    ret := UTL_SMTP.Mail(con, FromMail);
    ret := UTL_SMTP.rcpt(con, ToMail);
    ret := UTL_SMTP.open_data(con);

    UTL_SMTP.write_data(con, 'From: "'||FromName||'" <'||FromMail||'>'||Utl_Tcp.CRLF);
    UTL_SMTP.write_data(con, 'To: <'||ToMail||'>'||Utl_Tcp.CRLF);
    UTL_SMTP.write_data(con, 'Subject: '||Subject||Utl_Tcp.CRLF);
    UTL_SMTP.write_data(con, 'X-Priority: 3'||Utl_Tcp.CRLF);

    IF isHTML THEN
        UTL_SMTP.write_data(con, 'Content-type: '||MIME_HTML||' charset='||Charset || Utl_Tcp.CRLF);
    ELSE 
        UTL_SMTP.write_data(con, 'Content-type: '||MIME_TEXT||' charset='||Charset || Utl_Tcp.CRLF);
    END IF;

    -- Mail Body
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF);
    UTL_SMTP.write_raw_data(con, UTL_RAW.cast_to_raw(Message));
    UTL_SMTP.write_data(con, Utl_Tcp.CRLF);

    -- finish mail
    ret := UTL_SMTP.close_data(con);
    ret := UTL_SMTP.quit(con);
    RETURN '0';    
EXCEPTION
    WHEN UTL_SMTP.TRANSIENT_ERROR OR UTL_SMTP.PERMANENT_ERROR THEN
        UTL_SMTP.quit(con);
        RETURN SQLERRM;
END SendMail;