Oracle 10g中使用UTL_SMTP向多个收件人批量发送邮件的方法
Oracle 10g UTL_SMTP 多收件人同邮件发送方案
首先明确一个常见误区:多次调用UTL_SMTP.rcpt 本身不会生成多封独立邮件,只要所有调用都在同一个SMTP会话的UTL_SMTP.mail(指定发件人)和UTL_SMTP.data(写入邮件内容)之间执行,最终只会生成一封邮件。
如果要让所有收件人互相可见对方的收件信息,只需要额外完成以下两步即可:
- 第一步:把所有收件人地址用英文逗号拼接后,写入邮件头的
To字段 - 第二步:对每一个收件人地址,单独调用一次
UTL_SMTP.rcpt完成SMTP会话级的收件人注册
示例代码
DECLARE l_mail_conn UTL_SMTP.connection; l_smtp_host VARCHAR2(100) := '你的SMTP服务器地址'; l_from VARCHAR2(100) := 'sender@example.com'; -- 多个收件人列表 l_rcpt_list DBMS_SQL.varchar2_table; l_to_header VARCHAR2(1000); BEGIN -- 初始化收件人列表 l_rcpt_list(1) := 'user1@example.com'; l_rcpt_list(2) := 'user2@example.com'; l_rcpt_list(3) := 'user3@example.com'; -- 拼接邮件头To字段,用于展示给所有收件人 FOR i IN 1..l_rcpt_list.COUNT LOOP IF i > 1 THEN l_to_header := l_to_header || ', '; END IF; l_to_header := l_to_header || l_rcpt_list(i); END LOOP; -- 建立SMTP连接 l_mail_conn := UTL_SMTP.open_connection(l_smtp_host, 25); UTL_SMTP.helo(l_mail_conn, l_smtp_host); UTL_SMTP.mail(l_mail_conn, l_from); -- 循环注册所有收件人,同一SMTP会话内多次调用不会生成多封邮件 FOR i IN 1..l_rcpt_list.COUNT LOOP UTL_SMTP.rcpt(l_mail_conn, l_rcpt_list(i)); END LOOP; -- 写入邮件内容,包含To头字段 UTL_SMTP.open_data(l_mail_conn); UTL_SMTP.write_data(l_mail_conn, 'From: ' || l_from || UTL_TCP.crlf); UTL_SMTP.write_data(l_mail_conn, 'To: ' || l_to_header || UTL_TCP.crlf); UTL_SMTP.write_data(l_mail_conn, 'Subject: 测试多收件人邮件' || UTL_TCP.crlf); UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf); -- 空行分隔头和正文 UTL_SMTP.write_data(l_mail_conn, '这是测试邮件正文' || UTL_TCP.crlf); UTL_SMTP.close_data(l_mail_conn); UTL_SMTP.quit(l_mail_conn); END; /
说明
- Oracle 10g的
UTL_SMTP包本身没有提供一次性传入多收件人的rcpt重载方法,循环调用是官方推荐的标准实现方式,不会产生多封独立邮件 - 邮件头的
To字段仅用于展示,和SMTP会话实际注册的收件人可以独立配置,如果要实现密送(收件人看不到其他收件人),只需要把对应地址从To头字段里移除,仅调用rcpt注册即可
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

