UTL_SMTP.WRITE_DATA - 在Oracle中返回双DOT

时间:2013-09-10 15:20:57

标签: oracle smtp

我正在尝试将以下格式内容作为邮件附件发送到oracle。

ADV|ESCROW|514838|20130823
CRN|SF|20130727|20130823|20130823|0.00|-25.28|0.00|0.00|0.00|-25.28
CCT|B|0.00|*
CCT|E|0.00|*
CCT|I|0.00|*
CCT|N|0.00|*
CCT|R|0.00|*
CCT|S|0.00|*
CRN|SF|20130726|20130823|20130823|0.00|35638.70|0.00|0.00|0.00|35638.70
CCT|B|0.00|*
CCT|E|0.00|*
CCT|I|0.00|*
CCT|N|0.00|*
CCT|R|0.00|*
CCT|S|0.00|*
PRN|SF|20130725|20130822|0.00
PCT|B|0.00|*
PCT|E|0.00|*
PCT|I|0.00|*
PCT|N|0.00|*
PCT|R|0.00|*
PCT|S|0.00|*
CRN|SF|20130725|20130823|20130822|0.00|1672.95|0.00|0.00|0.00|1672.95
CCT|B|0.00|*
CCT|E|0.00|*
CCT|I|0.00|*
CCT|N|0.00|*
CCT|R|0.00|*
CCT|S|0.00|*

这些内容非常庞大。它几乎是109250个字符。所以我使用下面的代码发送此文本。

l_offset  number := 1;
l_amount number := 1500;    
while l_offset < dbms_lob.getlength(l_in_mail_attach) loop
   utl_smtp.write_data(smtp_connection,
                       dbms_lob.substr(l_in_mail_attach,l_amount,l_offset));
   l_offset  := l_offset + l_amount ;
   l_amount := least(1900,dbms_lob.getlength(l_in_mail_attach) - l_amount);
 end loop; 

我已成功收到邮件附件。但问题是文本中附加了一个点(。)。见下文:PCT | R | 0..00 | *这应该是PCT | R | 0.00 | *。

PRN|R1|20130606|20130819|0.00
PCT|B|0.00|*
PCT|B|0.00|*
PCT|E|0.00|*
PCT|E|0.00|*
PCT|I|0.00|*
PCT|I|0.00|*
PCT|N|0.00|*
PCT|N|0.00|*
PCT|R|0..00|*
PCT|R|0.00|*
PCT|S|0.00|*
PCT|S|0.00|*

任何人都可以建议如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

如果在其中一个子字符串的开头有一个前导点,则会出现点重复。

根据: http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_smtp.htm#ARPLS71529 应用程序必须确保body参数的内容符合MIME(RFC822)规范。

DATA例程用a终止消息。序列(一行开头的一个句点), 根据RFC821的要求。它还可以翻译任何序列。 (单身期)在体内 到..(双倍期)。此转换提供了RFC821的第4.5.2节中描述的透明性。

在编写邮件正文和附件时,尝试通过替换以下内容隐藏点复制器中的点:

utl_smtp.write_data(smtp_connection,
                       dbms_lob.substr(l_in_mail_attach,l_amount,l_offset));

使用:

utl_smtp.write_RAW_data
( smtp_connection
, utl_raw.cast_to_raw( dbms_lob.substr ( l_in_mail_attach, l_amount, l_offset ) )
);