3

我在发送的邮件正文格式方面遇到问题:

这是 KO 版本(没有新行):

declare
  crlf                     VARCHAR2(2) := chr(13)||chr(10); 
  msg_body                 VARCHAR2(2000);
begin
  msg_body := msg_body || ('Blablah  : '|| SYSTIMESTAMP ) || crlf;
  msg_body := msg_body || ('Blablah  : '|| SYSTIMESTAMP ) || crlf;
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1''';
  UTL_MAIL.send(sender => 'xx@xx.com', recipients => 'yy@yy.com', subject => 'Blah', MESSAGE => msg_body);
end;

这是 OK 版本(漂亮的新行):

declare
  crlf                     VARCHAR2(2) := chr(13)||chr(10);
  msg_body                 VARCHAR2(2000);
begin
  msg_body := msg_body || ('Blablah  : ') || crlf;
  msg_body := msg_body || ('Blablah  : ') || crlf;
  EXECUTE IMMEDIATE 'ALTER SESSION SET smtp_out_server = ''127.0.0.1''';
  UTL_MAIL.send(sender => 'xx@xx.com', recipients => 'yy@yy.com', subject => 'Blah', MESSAGE => msg_body);
end;

最好的祝福

4

1 回答 1

6

您的两个版本之间的唯一区别是在有效的版本中排除了 SYSTIMESTAMP。

您没有明确地将 SYSTIMESTAMP 转换为使用TO_CHAR(). 它将根据您的NLS_DATE_FORMAT进行隐式转换。

使用您希望的任何格式模型将其正确转换为字符;例如

to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss:ff3')

ff是小数秒。

去引用

Oracle 建议您指定显式转换,而不是依赖隐式或自动转换,原因如下:

  • 使用显式数据类型转换函数时,SQL 语句更容易理解。

  • 隐式数据类型转换会对性能产生负面影响,尤其是在将列值的数据类型转换为常量而不是相反时。

  • 隐式转换取决于它发生的上下文,并且可能不会在每种情况下都以相同的方式工作。例如,从日期时间值到 VARCHAR2 值的隐式转换可能会返回意外年份,具体取决于 NLS_DATE_FORMAT 参数的值。

  • 隐式转换的算法可能会随着软件版本和 Oracle 产品的变化而变化。显式转换的行为更可预测。


我建议调查使用UTL_SMTP而不是 UTL_MAIL。您无需更改会话。一个非常简单的发送过程可能如下所示:

declare

   l_to_list  long;
   l_crlf varchar2(2) := chr(13) || chr(10);
   l_conn utl_smtp.connection;
   l_date     varchar2(255) default to_char(sysdate, 'dd Mon yyyy hh24:mi:ss');

begin

   l_conn := utl_smtp.open_connection(<mailhost>, 25);
   utl_smtp.helo(l_conn, <mailhost>);
   utl_smtp.mail(l_conn, <sender>);

   l_to_list := address_email('To: ', <recipients>);

   utl_smtp.open_data(l_conn);

   utl_smtp.write_data('Date: ' || l_date);
   utl_smtp.write_data('From: ' || <sender>);
   utl_smtp.write_data('Subject: ' || nvl(<subject>, '(No Subject)'));
   utl_smtp.write_data('X-Mailer: ' || <mailer_id>);

   utl_smtp.write_data(l_to_list);

   utl_smtp.write_data(l_conn, '' || l_crlf);
   utl_smtp.write_data(l_conn, <msg>);
   utl_smtp.close_data(l_conn);
   utl_smtp.quit(l_conn);

end;
于 2013-01-18T11:57:33.243 回答