pg_utl_smtp

Oracle UTL_SMTP 兼容扩展(基于 plperlu)

概览

扩展包名版本分类许可证语言
pg_utl_smtp1.0.0SIMPostgreSQLSQL
ID扩展名BinLibLoadCreateTrustReloc模式
9290pg_utl_smtputl_smtp
相关扩展plperlu

runtime requires plperlu and Perl Net::SMTP

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.0.01817161514pg_utl_smtpplperlu
RPMPGDG1.01817161514pg_utl_smtp_$v-
DEBPIGSTY1.0.01817161514postgresql-$v-utl-smtp-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
d13.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
d13.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u22.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u22.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u24.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
u24.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0
PIGSTY 1.0.0

构建

您可以使用 pig build 命令构建 pg_utl_smtp 扩展的 DEB 包:

pig build pkg pg_utl_smtp         # 构建 DEB 包

安装

您可以直接安装 pg_utl_smtp 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_utl_smtp;          # 当前活跃 PG 版本安装
pig ext install -y pg_utl_smtp -v 18  # PG 18
pig ext install -y pg_utl_smtp -v 17  # PG 17
pig ext install -y pg_utl_smtp -v 16  # PG 16
pig ext install -y pg_utl_smtp -v 15  # PG 15
pig ext install -y pg_utl_smtp -v 14  # PG 14
dnf install -y pg_utl_smtp_18       # PG 18
dnf install -y pg_utl_smtp_17       # PG 17
dnf install -y pg_utl_smtp_16       # PG 16
dnf install -y pg_utl_smtp_15       # PG 15
dnf install -y pg_utl_smtp_14       # PG 14
apt install -y postgresql-18-utl-smtp   # PG 18
apt install -y postgresql-17-utl-smtp   # PG 17
apt install -y postgresql-16-utl-smtp   # PG 16
apt install -y postgresql-15-utl-smtp   # PG 15
apt install -y postgresql-14-utl-smtp   # PG 14

创建扩展

CREATE EXTENSION pg_utl_smtp CASCADE;  -- 依赖: plperlu

用法

pg_utl_smtp: PostgreSQL 的 Oracle UTL_SMTP 兼容扩展

启用

CREATE EXTENSION plperlu;
CREATE EXTENSION pg_utl_smtp;

发送邮件

DO $$
DECLARE
    c utl_smtp.connection;
BEGIN
    c := utl_smtp.open_connection('smtp.example.com', 25);
    CALL utl_smtp.ehlo(c, 'mydomain.com');
    CALL utl_smtp.mail(c, 'sender@example.com');
    CALL utl_smtp.rcpt(c, 'recipient@example.com');
    CALL utl_smtp.open_data(c);
    CALL utl_smtp.write_data(c, 'From: sender@example.com' || E'\r\n');
    CALL utl_smtp.write_data(c, 'To: recipient@example.com' || E'\r\n');
    CALL utl_smtp.write_data(c, 'Subject: Test Email' || E'\r\n');
    CALL utl_smtp.write_data(c, E'\r\n');
    CALL utl_smtp.write_data(c, 'Hello from PostgreSQL!');
    CALL utl_smtp.close_data(c);
    CALL utl_smtp.quit(c);
END;
$$;

过程

  • OPEN_CONNECTION(host, port, tx_timeout, …) - 打开到 SMTP 服务器的连接。返回 utl_smtp.connection 类型。通过 secure_connection_before_smtp 支持 SSL/TLS。
  • EHLO(c, domain) / HELO(c, domain) - 执行初始 SMTP 握手。
  • MAIL(c, sender) - 发起邮件事务。
  • RCPT(c, recipient) - 指定邮件收件人。多个收件人可多次调用。
  • OPEN_DATA(c) - 发送 DATA 命令开始消息正文。
  • WRITE_DATA(c, data) - 写入消息正文的一部分。
  • WRITE_RAW_DATA(c, data) - 向消息正文写入原始数据。
  • CLOSE_DATA(c) - 关闭数据会话。
  • QUIT(c) - 终止 SMTP 会话并断开连接。

连接类型

-- utl_smtp.connection 复合类型
(host varchar(255), port integer, tx_timeout integer,
 private_tcp_con integer, private_state integer)

注意事项

  • 需要系统上安装 Perl Net::SMTP 模块
  • 使用 E'\r\n' 作为换行符替代 utl_tcp.crlf
  • wallet_pathwallet_password 参数未使用

最后修改 2026-03-14: update extension metadata (953cbd0)