pg_utl_smtp
Oracle UTL_SMTP 兼容扩展(基于 plperlu)
仓库
hexacluster/pg_utl_smtp
https://github.com/hexacluster/pg_utl_smtp
源码
pg_utl_smtp-1.0.tar.gz
pg_utl_smtp-1.0.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_utl_smtp | 1.0.0 | SIM | PostgreSQL | SQL |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 9290 | pg_utl_smtp | 否 | 否 | 否 | 是 | 否 | 否 | utl_smtp |
| 相关扩展 | plperlu |
|---|
runtime requires plperlu and Perl Net::SMTP
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PGDG | 1.0.0 | 1817161514 | pg_utl_smtp | plperlu |
| RPM | PGDG | 1.0 | 1817161514 | pg_utl_smtp_$v | - |
| DEB | PIGSTY | 1.0.0 | 1817161514 | postgresql-$v-utl-smtp | - |
构建
您可以使用 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
用法
启用
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_path和wallet_password参数未使用