问题描述
你好,
我有一个使用UTL_SMTP发送电子邮件的存储过程。它准备接受 “收件人” 和 “抄送” 参数中的电子邮件地址列表。
在功能上,它按预期工作: 它将电子邮件发送到提供的列表。
问题是,当收件人打开电子邮件时,他们只看到列表中的第一个电子邮件地址,如果他们想回复,他们将无法做到这一点,因为其余的电子邮件地址不会显示。
例如,如果我使用以下代码:
它会将电子邮件发送给alex,一,二,三; 但是,电子邮件将显示电子邮件的标题为:
到: alex@mydomain.com
Cc: one@mydomain.com
它不会显示two@mydomain.com或three@mydomain.com
所以,问题是: 我错过了什么?如何确保显示整个通讯组列表?
谢谢。
这是我正在使用的过程的代码:
我有一个使用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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




