The body of the DATA command may be transferred in full 8 bits, but the rest of the SMTP command and response should be in 7 bits. When the target SMTP server supports 8BITMIME extension, users of multibyte databases may convert their non-US7ASCII, multibyte VARCHAR2 data to RAW and use the write_raw_data() API to send multibyte data using 8-bit MIME encoding

解决方案 »

  1.   

    使用 write_raw_data 代替 write_data 试试看!
      

  2.   

    试过了,在Message里可以。但是Subject却有问题,不知道为什么。
      

  3.   

    那 Subject 中的中文同样用 write_raw_data() ,试试看。
      

  4.   

    create or replace procedure CBP_SEND_MAIL
    (sender in varchar2, 
     recipient in varchar2, 
     message in varchar2, 
     title in varchar2,
     nStatus out number) 
     is
     mailhost varchar2(255) := '3.243.221.8'; --replace with your mail server 
     mail_conn utl_smtp.connection; 
     vrData RAW(32767);
     vrTitle RAW(32767);
     
     --write title
      PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
      BEGIN
      utl_smtp.write_data(mail_conn, NAME||': '|| HEADER||utl_tcp.CRLF);
      END;begin nStatus := 0; 
          mail_conn := utl_smtp.open_connection(mailhost, 25); 
          utl_smtp.helo(mail_conn, mailhost); 
          utl_smtp.mail(mail_conn, sender); 
          utl_smtp.rcpt(mail_conn, recipient);
          --utl_smtp.data(mail_conn, message); 
          --utl_smtp.quit(mail_conn);       utl_smtp.open_data(mail_conn);
          --write title
          --send_header('From', 'Oracle Database');
          --send_header('To', '"Recipient" <'||rcpter||'>');
          vrTitle := utl_raw.cast_to_raw(title);
          --utl_smtp.write_raw_data(mail_conn, 'Subject'||': '||vrTitle);
          --send_header('Subject', title);
          --write mail content
          
          utl_smtp.write_data(mail_conn, 'MIME-Version: ' || '1.0' || UTL_tcp.CRLF);
          utl_smtp.write_data(mail_conn, 'Content-Type: ' || 'text/plain; charset=utf-8' || UTL_tcp.CRLF);
          utl_smtp.write_data(mail_conn, 'Content-Transfer-Encoding: ' || '8bit' || UTL_tcp.CRLF);
          
          UTL_smtp.write_data(mail_conn, UTL_tcp.CRLF);
          
          vrData := utl_raw.cast_to_raw(message);
          utl_smtp.write_raw_data(mail_conn, 'Subject'||': '||vrTitle||vrData);
          --utl_smtp.write_raw_data(mail_conn, 'Subject: ' || vrTitle);
          --utl_smtp.write_data(mail_conn, utl_tcp.crlf || message);
          --close connect 
          utl_smtp.close_data(mail_conn);
         
          utl_smtp.quit(mail_conn);
          
    exception when others then 
              nStatus := SQLCODE; 
              dbms_output.put_line(Sqlerrm || to_char(SQLCODE));
    end CBP_SEND_MAIL;
      

  5.   

    create or replace procedure CBP_SEND_MAIL
    (sender in varchar2, 
     recipient in varchar2, 
     message in varchar2, 
     title in varchar2,
     nStatus out number) 
     is
     mailhost varchar2(255) := '3.243.221.8'; --replace with your mail server 
     mail_conn utl_smtp.connection; 
     vrData RAW(32767);
     vrTitle RAW(32767);
     
     --write title
      PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
      BEGIN
      utl_smtp.write_data(mail_conn, NAME||': '|| HEADER||utl_tcp.CRLF);
      END;begin nStatus := 0; 
          mail_conn := utl_smtp.open_connection(mailhost, 25); 
          utl_smtp.helo(mail_conn, mailhost); 
          utl_smtp.mail(mail_conn, sender); 
          utl_smtp.rcpt(mail_conn, recipient);
          --utl_smtp.data(mail_conn, message); 
          --utl_smtp.quit(mail_conn);       utl_smtp.open_data(mail_conn);
          --write title
          --send_header('From', 'Oracle Database');
          send_header('To', '<'||recipient||'>');
          vrTitle := utl_raw.cast_to_raw('Subject'||': '||title);
          utl_smtp.write_raw_data(mail_conn, vrTitle);
          --send_header('Subject', title);
          --write mail content----这一段我不太清楚为什么,不加会出点儿问题
          utl_smtp.write_data(mail_conn, '' || UTL_tcp.CRLF);
    --
          utl_smtp.write_data(mail_conn, 'MIME-Version: ' || '1.0' || UTL_tcp.CRLF);
          utl_smtp.write_data(mail_conn, 'Content-Type: ' || 'text/plain; charset=utf-8' || UTL_tcp.CRLF);
          utl_smtp.write_data(mail_conn, 'Content-Transfer-Encoding: ' || '8bit' || UTL_tcp.CRLF);
          
          UTL_smtp.write_data(mail_conn, UTL_tcp.CRLF);
          
          vrData := utl_raw.cast_to_raw(message);
          
          utl_smtp.write_raw_data(mail_conn, vrData);
          --utl_smtp.write_data(mail_conn, utl_tcp.crlf || message);
          --close connect 
          utl_smtp.close_data(mail_conn);
         
          utl_smtp.quit(mail_conn);
          
    exception when others then 
              nStatus := SQLCODE; 
              dbms_output.put_line(Sqlerrm || to_char(SQLCODE));
    end CBP_SEND_MAIL;
      

  6.   

    把 PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) AS
      BEGIN
      utl_smtp.write_data(mail_conn, NAME||': '|| HEADER||utl_tcp.CRLF);
      END;中的 utl_smtp.write_data 改为 utl_smtp.write_raw_data 试试看
      

  7.   

    哦,问题你是不是已经解决了?
    你提到的 ----这一段我不太清楚为什么,不加会出点儿问题
    下面的东西是 snmp 的标准格式
    如果想了解具体的,你需要查看 RFC 的文档了
      

  8.   

    我倒有个建议,你把收到的格式正确的邮件和你发出去不正确的邮件原始信息对比一下,在邮件头中可能有区别,那么把你写得不正确的更改一下,很快就解决了。一般我不太愿先去查RFC,因为毕竟只用一两次这个东西,不想花太多时间研究
      

  9.   

    wxdsun(森):如果有RFC的电子文档,请给我发一份,谢谢。
    [email protected]