You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snowflake中使用带模板的CALL SYSTEM$SEND_EMAIL?

在Snowflake的SYSTEM$SEND_EMAIL中插入图片与实现邮件模板化

一、插入图片的两种可行方案

1. 使用公网可访问的图片URL

如果图片托管在公网公开可访问的位置(比如云存储的公开文件),可以直接在邮件内容里用HTML的<img>标签引用:

SET content = '<html><body>
<p>这是待上传的文件通知</p>
<img src="https://example.com/your-image.png" alt="文件状态图" width="300">
</body></html>';

CALL SYSTEM$SEND_EMAIL(notif, mlist, 'New files are ready to upload...', content);

注意需确保邮件客户端支持HTML显示,且图片URL无访问限制。

2. 使用Base64编码内嵌图片

若不想依赖外部链接,可将图片转换为Base64编码,通过Data URI嵌入HTML:

-- 提前将图片转换为Base64字符串(可通过在线工具或本地脚本完成转换)
SET img_base64 = 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHklEQVQ4T2NkwA7+YxFmxKYUXRCmEZtirHLICkEKsNqCZjOKOpgGYjXDzIKrp4oBpNqO4gG6U13gMufhEIIQ8E+uYHkAvM8fRrNxG6l4wZBgBnQAvwF8dE4AHmG4BcWX9a0gCdXa0kAJ1W5xgCw20y6EOI4H3QAtwG7ZxI2MSA6wG6hT4tBQJ8H8cxwsB0M+L8U1uQfQH6b6zBmH7a2wE8M+F8U1uQfQH6b6zBmH7a2wE8M+F8U1uQfQH6b6zBmH7a2wE8M+F8U1uQfQ==';

SET content = '<html><body>
<p>文件上传就绪通知</p>
<img src="data:image/png;base64,' || img_base64 || '" alt="内嵌图片">
</body></html>';

CALL SYSTEM$SEND_EMAIL(notif, mlist, 'New files are ready to upload...', content);

这种方式无需外部依赖,但Base64编码会增大邮件体积,不建议用于大尺寸图片。

二、实现邮件完全模板化

1. 基础方案:字符串拼接与变量替换

先定义HTML模板字符串,再用Snowflake的REPLACE函数替换动态变量:

-- 定义模板
SET email_template = '<html><body>
<h1>通知:{{FILE_COUNT}}个文件待上传</h1>
<p>您好,以下{{FILE_COUNT}}个文件已准备完成:</p>
<ul>{{FILE_LIST}}</ul>
<img src="https://example.com/upload-icon.png" alt="上传图标">
</body></html>';

-- 准备动态变量
SET file_count = '5';
SET file_list = '<li>file1.csv</li><li>file2.json</li><li>file3.parquet</li><li>file4.txt</li><li>file5.xlsx</li>';

-- 替换模板变量
SET content = REPLACE(REPLACE(email_template, '{{FILE_COUNT}}', file_count), '{{FILE_LIST}}', file_list);

-- 发送邮件
CALL SYSTEM$SEND_EMAIL(notif, mlist, 'New files are ready to upload...', content);

2. 进阶方案:模板存储在表中

若需管理多个模板,可将模板存入Snowflake表,查询后替换变量:

-- 创建模板表(首次执行)
CREATE TABLE IF NOT EXISTS EMAIL_TEMPLATES (
    TEMPLATE_ID VARCHAR(50),
    TEMPLATE_CONTENT VARCHAR(16777216)
);

-- 插入上传通知模板
INSERT INTO EMAIL_TEMPLATES VALUES (
    'UPLOAD_NOTIFICATION',
    '<html><body>
    <h1>通知:{{FILE_COUNT}}个文件待上传</h1>
    <p>收件人:{{RECIPIENT_NAME}}</p>
    <ul>{{FILE_LIST}}</ul>
    </body></html>'
);

-- 查询模板并替换变量
SELECT TEMPLATE_CONTENT INTO :email_template FROM EMAIL_TEMPLATES WHERE TEMPLATE_ID = 'UPLOAD_NOTIFICATION';

SET recipient_name = 'Philippe';
SET content = REPLACE(REPLACE(REPLACE(email_template, '{{FILE_COUNT}}', file_count), '{{FILE_LIST}}', file_list), '{{RECIPIENT_NAME}}', recipient_name);

CALL SYSTEM$SEND_EMAIL(notif, mlist, 'New files are ready to upload...', content);

3. 简化你的现有代码

你当前用EXECUTE IMMEDIATE拼接字符串的方式可以优化,直接调用SYSTEM$SEND_EMAIL即可避免复杂的引号转义:

-- 替换为直接调用,无需拼接执行语句
CALL SYSTEM$SEND_EMAIL(
    notif,  -- 发件人标识符(Snowflake中配置的通知集成)
    mlist,  -- 收件人列表
    'New files are ready to upload...',  -- 邮件主题
    content  -- HTML格式的邮件内容
);

注意事项

  • 确保Snowflake通知集成(Notification Integration)配置正确,支持发送HTML格式邮件。
  • 部分邮件客户端可能会阻止外部图片或内嵌Base64图片,建议测试主流客户端(Outlook、Gmail、Apple Mail)的显示效果。
  • 邮件内容长度不能超过Snowflake的字符串限制(VARCHAR(16777216)),大体积Base64图片可能触发限制。

内容的提问来源于stack exchange,提问作者Philippe Corrèges

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:22:41