2008-09-26 73 views
3

我的一位客户使用Oracle 9i的utl_smtp在员工发出旅行请求时向管理员发送邮件通知,并且他们会对已完成的邮件发送进行一些更改。使用Oracle调试utl_smtp

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

所以真的有两个问题。

  1. 没有人有使用Oracle的UTL_SMTP工具的经验,设置电子邮件,并有任何建议,我们可能会错误。

  2. 有没有人知道是否有可能让utl_smtp将文本电子邮件转储到目录,就像您使用system.net.mail的specifiedpickupdirectory配置设置一样。这将是更好的选择。

感谢,丹

+0

什么是oracle版本? – 2008-09-26 12:11:44

回答

2

看起来像HELO是问题。我们可以用简单的测试用具来检查...

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; 
/
1

是的,我们可以远程连接到服务器。

-- ****** 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; 
0
  • 的OPEN_CONNECTION参数应该是FQDN或要连接到服务器的IP地址。
  • HELO参数应该是您连接的机器的FQDN。

如果这不起作用,你知道它出错哪一行吗?

2

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

  1. 仔细检查的模式主叫utl_smtpsys.utl_smtpsys.utl_tcpsys.dbms_lob执行权限。同时检查发送的消息是否大于32Kb。

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

感谢cagcowboy的帮助。