1

我正在尝试在 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|*

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

4

1 回答 1

1

当您的一个子字符串的开头有一个前导点时,就会发生点重复。

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

DATA 例程以 . 序列(一行开头的单个句点),按照 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 ) )
);
于 2013-12-03T17:04:38.133 回答