代码之家  ›  专栏  ›  技术社区  ›  Dan Maharry

使用Oracle的utl_smtp进行调试

  •  3
  • Dan Maharry  · 技术社区  · 16 年前

    我的一个客户使用Oracle9i的utl_smtp向经理发送邮件通知,当他们的员工提出旅行请求时,他们会很喜欢对邮件发送所做的一些更改。

    我们在让utl_smtp与网络上的任何smtp服务器通信时遇到了很多问题。我们甚至尝试在Oracle设备上安装免费的smtp服务器,但它不会发现在端口25上运行的邮件服务器。错误代码是ORA-29278。

    所以有两个问题。

    1. 是否有任何人有使用Oracle的utl_smtp实用程序设置电子邮件的经验,并对我们可能出错的地方有任何建议?

    2. 如果您使用System.NET.Mail的指定pickupdirectory配置设置,是否有人知道是否可以让utl_smtp将文本电子邮件转储到目录中。这是迄今为止最好的选择。

    谢谢,丹

    4 回复  |  直到 11 年前
        1
  •  2
  •   cagcowboy    16 年前

    看来问题出在直升机上。请我们用一个简单的测试用例检查一下…

    set serveroutput on
    
    declare
          lConnection UTL_SMTP.CONNECTION;
    begin
          lConnection := UTL_SMTP.OPEN_CONNECTION(your_smtp_server);
          DBMS_OUTPUT.PUT_LINE('Opened ok');
    
          UTL_SMTP.HELO(lConnection, your_client_machine_name);
          DBMS_OUTPUT.PUT_LINE('HELO ok');
    
          UTL_SMTP.MAIL(lConnection, your_email_address);
          UTL_SMTP.RCPT(lConnection, your_email_address);
          DBMS_OUTPUT.PUT_LINE('Addressing ok');
    end;
    /
    
        2
  •  2
  •   Dan Maharry    16 年前

    看来我们已经解决了这个问题。 回答这两个问题。

    1. 再次检查模式调用 utl_smtp 对具有执行权限 sys.utl_smtp , sys.utl_tcp sys.dbms_lob . 还要检查正在发送的消息是否为32KB。

    2. 不,没有办法让utl_smtp将电子邮件转储到la system.net.mail目录。

    感谢篮球队员的帮助。

        3
  •  1
  •   Dan Maharry    16 年前

    是的,我们可以打电话到服务器。

    -- ****** Object: Stored Procedure TRAVELADMIN_DEV.HTML_EMAIL Script Date: 22/08/2008 12:41:02 ******
    CREATE PROCEDURE "HTML_EMAIL"  (
        p_to            in varchar2,
        p_cc            in varchar2,
        p_from          in varchar2,
        p_subject       in varchar2,
        p_text          in varchar2 default null,
        p_html          in varchar2 default null
        )
    is
        l_boundary      varchar2(255) default 'a1b2c3d4e3f2g1';
        l_connection    utl_smtp.connection;
        l_body_html     clob := empty_clob;  --This LOB will be the email message
        l_offset        number;
        l_ammount       number;
        l_temp          varchar2(32767) default null;
        p_smtp_hostname varchar2(30):= 'rockies';
        p_smtp_portnum  varchar2(2) := '25';
    begin
        l_connection := utl_smtp.open_connection( p_smtp_hostname, p_smtp_portnum );
        utl_smtp.helo( l_connection, p_smtp_hostname );
        utl_smtp.mail( l_connection, p_from );
        utl_smtp.rcpt( l_connection, p_to );
        l_temp := l_temp || 'MIME-Version: 1.0' ||  chr(13) || chr(10);
        l_temp := l_temp || 'To: ' || p_to || chr(13) || chr(10);
        IF ((p_cc <> NULL) OR (LENGTH(p_cc) > 0)) THEN
          l_temp := l_temp || 'Cc: ' || p_cc || chr(13) || chr(10);
          utl_smtp.rcpt( l_connection, p_cc );
        END IF;
        l_temp := l_temp || 'From: ' || p_from || chr(13) || chr(10);
        l_temp := l_temp || 'Subject: ' || p_subject || chr(13) || chr(10);
        l_temp := l_temp || 'Reply-To: ' || p_from ||  chr(13) || chr(10);
        l_temp := l_temp || 'Content-Type: multipart/alternative; boundary=' ||
                             chr(34) || l_boundary ||  chr(34) || chr(13) ||
                             chr(10);
        ----------------------------------------------------
        -- Write the headers
        dbms_lob.createtemporary( l_body_html, false, 10 );
        dbms_lob.write(l_body_html,length(l_temp),1,l_temp);
        ----------------------------------------------------
        -- Write the text boundary
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        l_temp   := '--' || l_boundary || chr(13)||chr(10);
        l_temp   := l_temp || 'content-type: text/plain; charset=us-ascii' ||
                      chr(13) || chr(10) || chr(13) || chr(10);
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);
        ----------------------------------------------------
        -- Write the plain text portion of the email
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(p_text),l_offset,p_text);
        ----------------------------------------------------
        -- Write the HTML boundary
        l_temp   := chr(13)||chr(10)||chr(13)||chr(10)||'--' || l_boundary ||
                        chr(13) || chr(10);
        l_temp   := l_temp || 'content-type: text/html;' ||
                       chr(13) || chr(10) || chr(13) || chr(10);
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);
        ----------------------------------------------------
        -- Write the HTML portion of the message
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(p_html),l_offset,p_html);
        ----------------------------------------------------
        -- Write the final html boundary
        l_temp   := chr(13) || chr(10) || '--' ||  l_boundary || '--' || chr(13);
        l_offset := dbms_lob.getlength(l_body_html) + 1;
        dbms_lob.write(l_body_html,length(l_temp),l_offset,l_temp);
        ----------------------------------------------------
        -- Send the email in 1900 byte chunks to UTL_SMTP
        l_offset  := 1;
        l_ammount := 1900;
        utl_smtp.open_data(l_connection);
        while l_offset < dbms_lob.getlength(l_body_html) loop
            utl_smtp.write_data(l_connection,
                                dbms_lob.substr(l_body_html,l_ammount,l_offset));
            l_offset  := l_offset + l_ammount ;
            l_ammount := least(1900,dbms_lob.getlength(l_body_html) - l_ammount);
        end loop;
        utl_smtp.close_data(l_connection);
        utl_smtp.quit( l_connection );
        dbms_lob.freetemporary(l_body_html);
    end;
    
        4
  •  0
  •   cagcowboy    16 年前
    • open_connection参数应该是要连接的服务器的fqdn或ip地址。
    • helo参数应该是正在连接的计算机的fqdn。

    如果这行不通,你知道哪行出错了吗?