暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 向多个收件人发送带有UTL_SMTP的电子邮件仅显示列表中的第一个收件人

ASKTOM 2020-10-27
969

问题描述

你好,
我有一个使用UTL_SMTP发送电子邮件的存储过程。它准备接受 “收件人” 和 “抄送” 参数中的电子邮件地址列表。
在功能上,它按预期工作: 它将电子邮件发送到提供的列表。

问题是,当收件人打开电子邮件时,他们只看到列表中的第一个电子邮件地址,如果他们想回复,他们将无法做到这一点,因为其余的电子邮件地址不会显示。

例如,如果我使用以下代码:

BEGIN
IVC_SEND_MAIL('no-reply@mydomain.com', 'alex@mydomain.com', 'one@mydomain.com;two@mydomain.com;three@mydomain.com',NULL, 'Subject', 'Body');
END;


它会将电子邮件发送给alex,一,二,三; 但是,电子邮件将显示电子邮件的标题为:
到: alex@mydomain.com
Cc: one@mydomain.com

它不会显示two@mydomain.com或three@mydomain.com

所以,问题是: 我错过了什么?如何确保显示整个通讯组列表?

谢谢。

这是我正在使用的过程的代码:

CREATE OR REPLACE PROCEDURE IVC_SEND_MAIL (v_from in varchar2, v_to in varchar2, v_cc in varchar2, v_bcc in varchar2, v_subj in varchar2,v_body in varchar2) 
IS

    
    v_crlf          VARCHAR2(2)  := CHR( 13 ) || CHR( 10 );
    v_mesg       VARCHAR2(10000);
    v_conn         utl_smtp.connection;
    v_email_svr  VARCHAR2(4) := 'mailserver';
    v_port          NUMBER := 25;
    v_cc_msg VARCHAR2(2000);
    
BEGIN

                v_conn  := utl_smtp.open_connection( v_email_svr, v_port );
                utl_smtp.helo( v_conn, v_email_svr );
                        
                utl_smtp.mail( v_conn, v_from);
                        
                FOR x IN (SELECT LEVEL AS id, REGEXP_SUBSTR(v_to, '[^;]+', 1, LEVEL) AS TO_EMAIL_NAME FROM DUAL
                               CONNECT BY REGEXP_SUBSTR(v_to, '[^;]+', 1, LEVEL) IS NOT NULL) LOOP
                                  utl_smtp.Rcpt(v_conn,x.TO_EMAIL_NAME);
                END LOOP;
                
                IF v_cc IS NOT NULL THEN
                    FOR x IN (SELECT LEVEL AS id, REGEXP_SUBSTR(v_cc, '[^;]+', 1, LEVEL) AS CC_EMAIL_NAME FROM DUAL
                               CONNECT BY REGEXP_SUBSTR(v_cc, '[^;]+', 1, LEVEL) IS NOT NULL) LOOP
                                  utl_smtp.Rcpt(v_conn,x.CC_EMAIL_NAME);
                    END LOOP;
                    v_cc_msg := 'CC: '  || v_cc || v_crlf;
                ELSE
                    v_cc_msg := '';
                END IF; 
                
                IF v_bcc IS NOT NULL THEN
                    FOR x IN (SELECT LEVEL AS id, REGEXP_SUBSTR(v_bcc, '[^;]+', 1, LEVEL) AS BCC_EMAIL_NAME FROM DUAL
                               CONNECT BY REGEXP_SUBSTR(v_bcc, '[^;]+', 1, LEVEL) IS NOT NULL) LOOP
                                  utl_smtp.Rcpt(v_conn,x.BCC_EMAIL_NAME);
                    END LOOP;
                END IF; 
                    
                                v_mesg   := 'Date: '    || TO_CHAR( SYSDATE, 'dd Mon yy hh24:mi:ss' ) || v_crlf ||
                                          'From:'     || v_from    || v_crlf ||
                                          'Subject: ' || v_subj    || v_crlf ||
                                          'To: '      || v_to    || v_crlf ||
                                          v_cc_msg || 
                                          'Mime-Version: 1.0;' || v_crlf ||
                                          'Content-Type: text/html; charset="ISO-8859-1";' || v_crlf ||
                                          ''          || v_crlf                 ||
                                          ''|| v_crlf||v_body;
                utl_smtp.data( v_conn, v_mesg );
                utl_smtp.quit( v_conn );
END;
/

专家解答

你需要一个抄送行 * 每个 * 收件人,因此类似


IF v_cc IS NOT NULL THEN
                    FOR x IN (SELECT LEVEL AS id, REGEXP_SUBSTR(v_cc, '[^;]+', 1, LEVEL) AS CC_EMAIL_NAME FROM DUAL
                               CONNECT BY REGEXP_SUBSTR(v_cc, '[^;]+', 1, LEVEL) IS NOT NULL) LOOP
                                  utl_smtp.Rcpt(v_conn,x.CC_EMAIL_NAME);
                                  v_cc_msg := 'CC: '  || x.CC_EMAIL_NAME || v_crlf;
                    END LOOP;
                ELSE
                    v_cc_msg := '';
                END IF; 

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论