【DM版本】:03134284604-20260707-335949-20228
【操作系统】:Kylin V10
【CPU】:x86
【问题描述】*:在达梦端使用UTL_SMTP替换sp_send_dbmail,测试用例如下报错。
已提前执行创建系统包:
CALL SP_CREATE_SYSTEM_PACKAGES(1,'UTL_SMTP');
CALL SP_CREATE_SYSTEM_PACKAGES(1,'UTL_TCP');
CALL SP_CREATE_SYSTEM_PACKAGES(1,'UTL_RAW');
DECLARE
conn UTL_SMTP.CONNECTION;
v_subject VARCHAR(100) := '达梦UTL_SMTP直发测试';
v_body VARCHAR(500) := '达梦端 直发链路测试邮件,收到即链路闭环。';
BEGIN
conn := UTL_SMTP.OPEN_CONNECTION('192.168.xx.xx', 25);
UTL_SMTP.HELO(conn, 'xxx.com.cn');
UTL_SMTP.COMMAND(conn, 'AUTH LOGIN');
UTL_SMTP.COMMAND(conn, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('test@xxx.com.cn'))));
UTL_SMTP.COMMAND(conn, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('********'))));
UTL_SMTP.COMMAND(conn, 'MAIL FROM:<test@xxx.com.cn>');
UTL_SMTP.COMMAND(conn, 'RCPT TO:<test01@xxx.com.cn>');
UTL_SMTP.OPEN_DATA(conn);
UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW('From: test@xxx.com.cn'||UTL_TCP.CRLF));
UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW('To: test01@xxx.com.cn'||UTL_TCP.CRLF));
UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW('Subject: =?GBK?B?'||UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(v_subject)))||'?='||UTL_TCP.CRLF));
UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW('MIME-Version: 1.0'||UTL_TCP.CRLF||'Content-Type: text/plain; charset=GBK'||UTL_TCP.CRLF||UTL_TCP.CRLF));
UTL_SMTP.WRITE_DATA(conn, v_body);
UTL_SMTP.CLOSE_DATA(conn);
UTL_SMTP.QUIT(conn);
DBMS_OUTPUT.PUT_LINE('测试邮件已提交');
END;
执行失败(语句1)
-20021: 一般网络错误 250 2.1.0 Sender OK
-20021: utl_smtp.command line 195
-20021: anonymous block line 11

返回的信息Sender OK,状态码是250,被误认为是错误码抛出,这应该是bug。套一层子过程,判断返回的状态码大于400才抛出,即可绕过解决。