通过Oracle发送的电子邮件丢失了点(。)

时间:2015-08-26 18:16:46

标签: oracle email smtp

我有一个发送电子邮件的oracle程序,并且消息中的点(。)发生了一些不一致。

问题在于,在这种特定情况下,电子邮件正文正在构建为HTML,并且电子邮件正文中有一个链接,其中一个点正在从此链接中删除。例如,xxx.xxx.xxx在电子邮件中显示为xxxxxx.xxx。这导致接收器无法访问所需链路。

在我研究这个问题的解决方案期间,我偶然发现了SMTP标准RFC2821的4.5.2部分:

  • 当SMTP服务器收到一行邮件文本时,它会进行检查 这条线。如果该行由单个句点组成,则对其进行处理 作为邮件指示符的结尾。如果第一个字符是句点而且 线上还有其他字符,第一个字符是 删除。

但是我如何处理这个问题才能使电子邮件中的链接正常工作?

在用于发送电子邮件的程序代码下方:

CREATE OR REPLACE PROCEDURE SEND_MAIL (p_from in VARCHAR2,
                                                p_to in VARCHAR2,  
                                                p_subject in VARCHAR2, 
                                                p_message in VARCHAR2)
IS
  lv_server      VARCHAR2(255) := 'xxx.xxx.xxx.xxx';
  lv_port        NUMBER(10)    := 25;
  lv_rcpt        VARCHAR2(255) := p_to;
  lv_from        VARCHAR2(255) := p_from;
  lv_subject     VARCHAR2(255) := p_subject;
  lv_message     VARCHAR2(20000) := p_message;
  lv_conn        UTL_SMTP.CONNECTION;
BEGIN

  lv_Conn := UTL_SMTP.Open_Connection(lv_server, lv_port);
  UTL_SMTP.Helo(lv_conn, lv_server);
  UTL_SMTP.Mail(lv_conn, lv_from);
  UTL_SMTP.Rcpt(lv_conn, lv_rcpt);
  UTL_SMTP.OPEN_DATA(lv_conn);
  UTL_SMTP.WRITE_DATA(lv_conn, 'Subject: =?ISO-8859-1?Q?' ||
                                UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(lv_subject))) ||
                                '?=' || UTL_TCP.CRLF);


  UTL_SMTP.WRITE_DATA(lv_conn, 'MIME-version: 1.0' || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(lv_conn, 'Content-Type: text/html;charset=iso-8859-1' || UTL_TCP.CRLF);

  UTL_SMTP.WRITE_DATA(lv_conn, 'Content-Transfer-Encoding: quoted-printable '|| UTL_TCP.CRLF);

  UTL_SMTP.WRITE_DATA(lv_conn, 'From: ' || lv_from || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(lv_conn, 'To: ' || lv_rcpt || UTL_TCP.CRLF);
  UTL_SMTP.WRITE_DATA(lv_conn,  UTL_TCP.CRLF);
  UTL_SMTP.WRITE_RAW_DATA(lv_conn, UTL_ENCODE.QUOTED_PRINTABLE_ENCODE(UTL_RAW.CAST_TO_RAW(Utl_Tcp.Crlf || lv_message)));
  UTL_SMTP.WRITE_DATA(lv_conn, UTL_TCP.CRLF);
  UTL_SMTP.CLOSE_DATA(lv_conn);
  UTL_SMTP.QUIT(lv_conn);
END;

0 个答案:

没有答案