

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS SCT 延伸套件模擬 PostgreSQL 中的 SQL Server 資料庫郵件
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail"></a>

您可以使用 SQL Server Database Mail，從 SQL Server Database Engine 或 Azure SQL 受管執行個體傳送電子郵件訊息給使用者。這些電子郵件訊息可以包含查詢結果，或包含來自您網路上任何資源的檔案。如需 SQL Server Database Mail 的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver15)。

PostgreSQL 沒有 SQL Server Database Mail 的同等項目。若要模擬 SQL Server Database Mail 功能， AWS SCT 會建立延伸套件。此延伸套件使用 AWS Lambda 和 Amazon Simple Email Service (Amazon SES)。 AWS Lambda 提供使用者與 Amazon SES 電子郵件傳送服務互動的界面。若要設定此互動，請新增 Lambda 函數的 Amazon Resource Name (ARN)。

對於新的電子郵件帳戶，請使用下列命令。

```
do
$$
begin
PERFORM sysmail_add_account_sp (
    par_account_name :='your_account_name',
    par_email_address := 'your_account_email',
    par_display_name := 'your_account_display_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

若要將 Lambda 函數的 ARN 新增至現有的電子郵件帳戶，請使用下列命令。

```
do
$$
begin
PERFORM sysmail_update_account_sp (
    par_account_name :='existind_account_name',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'ARN'
);
end;
$$ language plpgsql;
```

在上述範例中， *`ARN`*是 Lambda 函數的 ARN。

若要模擬 PostgreSQL 中的 SQL Server Database Mail 行為，延伸 AWS SCT 套件會使用下列資料表、檢視和程序。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的資料表
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Tables"></a>

若要模擬 SQL Server Database Mail，延伸套件會使用下列資料表：

**sysmail\$1account**  
儲存電子郵件帳戶的相關資訊。

**sysmail\$1profile**  
儲存有關使用者設定檔的資訊。

**sysmail\$1server**  
存放電子郵件伺服器的相關資訊。

**sysmail\$1mailitems**  
儲存電子郵件訊息的清單。

**sysmail\$1attachments**  
包含每個電子郵件附件的一列。

**sysmail\$1log**  
儲存有關傳送電子郵件訊息的服務資訊。

**sysmail\$1profileaccount**  
儲存使用者設定檔和電子郵件帳戶的相關資訊。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的檢視
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Views"></a>

若要模擬 SQL Server Database Mail， 會在 PostgreSQL 資料庫中 AWS SCT 建立下列檢視，以確保相容性。延伸套件不會使用它們，但轉換後的程式碼可以查詢這些檢視。

**sysmail\$1allitems**  
包含所有電子郵件的清單。

**sysmail\$1faileditems**  
包含無法傳送的電子郵件清單。

**sysmail\$1sentitems**  
包含已傳送的電子郵件清單。

**sysmail\$1unsentitems**  
包含尚未傳送的電子郵件清單。

**sysmail\$1mailattachments**  
包含連接檔案的清單。

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的程序
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Procedures"></a>

若要模擬 SQL Server Database Mail，延伸套件會使用下列程序：

**sp\$1send\$1dbmail**  
傳送電子郵件給指定的收件人。

**sysmail\$1add\$1profile\$1sp**  
建立新的使用者設定檔。

**sysmail\$1add\$1account\$1sp**  
建立新的電子郵件帳戶，以存放 Simple Mail Transfer Protocol (SMTP) 登入資料等資訊。

**sysmail\$1add\$1profileaccount\$1sp**  
將電子郵件帳戶新增至指定的使用者設定檔。

**sysmail\$1update\$1profile\$1sp**  
變更使用者描述檔的屬性，例如描述、名稱等。

**sysmail\$1update\$1account\$1sp**  
變更現有電子郵件帳戶中的資訊。

**sysmail\$1update\$1profileaccount\$1sp**  
更新指定使用者設定檔中的電子郵件帳戶資訊。

**sysmail\$1delete\$1profileaccount\$1sp**  
從指定的使用者設定檔中移除電子郵件帳戶。

**sysmail\$1delete\$1account\$1sp**  
刪除電子郵件帳戶。

**sysmail\$1delete\$1profile\$1sp**  
刪除使用者設定檔。

**sysmail\$1delete\$1mailitems\$1sp**  
從內部資料表刪除電子郵件。

**sysmail\$1help\$1profile\$1sp**  
顯示使用者設定檔的相關資訊。

**sysmail\$1help\$1account\$1sp**  
顯示電子郵件帳戶的相關資訊。

**sysmail\$1help\$1profileaccount\$1sp**  
顯示與使用者設定檔相關聯的電子郵件帳戶資訊。

**sysmail\$1dbmail\$1json**  
產生 AWS Lambda 函數 JSON 請求的內部程序。

**sysmail\$1verify\$1profile\$1sp、sysmail\$1verify\$1account\$1sp、sysmail\$1verify\$1addressparams\$1sp**  
檢查設定的內部程序。

**sp\$1get\$1dbmail、sp\$1set\$1dbmail、sysmail\$1dbmail\$1xml**  
已棄用的內部程序。

## PostgreSQL 中模擬 SQL Server 資料庫郵件的程序語法
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Syntax"></a>

延伸套件中的`aws_sqlserver_ext.sp_send_dbmail`程序會模擬`msdb.dbo.sp_send_dbmail`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-send-dbmail-transact-sql?view=sql-server-ver15)。

```
par_profile_name varchar = NULL::character varying,
par_recipients text = NULL::text,
par_copy_recipients text = NULL::text,
par_blind_copy_recipients text = NULL::text,
par_subject varchar = NULL::character varying,
par_body text = NULL::text,
par_body_format varchar = NULL::character varying,
par_importance varchar = 'NORMAL'::character varying,
par_sensitivity varchar = 'NORMAL'::character varying,
par_file_attachments text = NULL::text,
par_query text = NULL::text,
par_execute_query_database varchar = NULL::character varying,
par_attach_query_result_as_file smallint = 0,
par_query_attachment_filename varchar = NULL::character varying,
par_query_result_header smallint = 1,
par_query_result_width integer = 256,
par_query_result_separator VARCHAR = ' '::character varying,
par_exclude_query_output smallint = 0,
par_append_query_error smallint = 0,
par_query_no_truncate smallint = 0,
par_query_result_no_padding smallint = 0,
out par_mailitem_id integer,
par_from_address text = NULL::text,
par_reply_to text = NULL::text,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_delete_mailitems_sp`程序會模擬`msdb.dbo.sysmail_delete_mailitems_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-mailitems-sp-transact-sql?view=sql-server-ver15)。

```
par_sent_before timestamp = NULL::timestamp without time zone,
par_sent_status varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_add_profile_sp`程序會模擬`msdb.dbo.sysmail_add_profile_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_name varchar,
par_description varchar = NULL::character varying,
out par_profile_id integer,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_add_account_sp`程序會模擬`msdb.dbo.sysmail_add_account_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql?view=sql-server-ver15)。

```
par_account_name varchar
par_email_address varchar
par_display_name varchar = NULL::character varying
par_replyto_address varchar = NULL::character varying
par_description varchar = NULL::character varying
par_mailserver_name varchar = NULL::character varying
par_mailserver_type varchar = 'SMTP'::bpchar
par_port integer = 25
par_username varchar = NULL::character varying
par_password varchar = NULL::character varying
par_use_default_credentials smallint = 0
par_enable_ssl smallint = 0
out par_account_id integer
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_add_profileaccount_sp`程序會模擬`msdb.dbo.sysmail_add_profileaccount_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_help_profile_sp`程序會模擬`msdb.dbo.sysmail_help_profile_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profile-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_update_profile_sp`程序會模擬`msdb.dbo.sysmail_update_profile_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profile-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_description varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_delete_profile_sp`程序會模擬`msdb.dbo.sysmail_delete_profile_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profile-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_force_delete smallint = 1,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_help_account_sp`程序會模擬`msdb.dbo.sysmail_help_account_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-account-sp-transact-sql?view=sql-server-ver15)。

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_update_account_sp`程序會模擬`msdb.dbo.sysmail_update_account_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-account-sp-transact-sql?view=sql-server-ver15)。

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_email_address varchar = NULL::character varying,
par_display_name varchar = NULL::character varying,
par_replyto_address varchar = NULL::character varying,
par_description varchar = NULL::character varying,
par_mailserver_name varchar = NULL::character varying,
par_mailserver_type varchar = NULL::character varying,
par_port integer = NULL::integer,
par_username varchar = NULL::character varying,
par_password varchar = NULL::character varying,
par_use_default_credentials smallint = NULL::smallint,
par_enable_ssl smallint = NULL::smallint,
par_timeout integer = NULL::integer,
par_no_credential_change smallint = NULL::smallint,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_delete_account_sp`程序會模擬`msdb.dbo.sysmail_delete_account_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-account-sp-transact-sql?view=sql-server-ver15)。

```
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_help_profileaccount_sp`程序會模擬`msdb.dbo.sysmail_help_profileaccount_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-help-profileaccount-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_update_profileaccount_sp`程序會模擬`msdb.dbo.sysmail_update_profileaccount_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-update-profileaccount-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
par_sequence_number integer = NULL::integer,
out returncode integer
```

延伸套件中的`aws_sqlserver_ext.sysmail_delete_profileaccount_sp`程序會模擬`msdb.dbo.sysmail_delete_profileaccount_sp`程序。如需來源 SQL Server Database Mail 程序的詳細資訊，請參閱 [Microsoft 技術文件](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-delete-profileaccount-sp-transact-sql?view=sql-server-ver15)。

```
par_profile_id integer = NULL::integer,
par_profile_name varchar = NULL::character varying,
par_account_id integer = NULL::integer,
par_account_name varchar = NULL::character varying,
out returncode integer
```

## 在 PostgreSQL 中使用模擬 SQL Server 資料庫郵件的程序範例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.Examples"></a>

若要傳送電子郵件，請使用如下所示`aws_sqlserver_ext.sp_send_dbmail`的程序。

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Automated Success Message',
    par_body := 'The stored procedure finished'
);
```

下列範例示範如何傳送包含查詢結果的電子郵件。

```
PERFORM sp_send_dbmail (
    par_profile_name := 'Administrator',
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Account with id = 1',
    par_query := 'SELECT COUNT(*)FROM Account WHERE id = 1'
);
```

下列範例示範如何使用 HTML 程式碼傳送電子郵件。

```
DECLARE var_tableHTML TEXT;
SET var_tableHTML := CONCAT(
    '<H1>Work Order Report</H1>',
    '<table border="1">',
    '<tr><th>Work Order ID</th><th>Product ID</th>',
    '<th>Name</th><th>Order Qty</th><th>Due Date</th>',
    '<th>Expected Revenue</th></tr>',
    '</table>'
);
PERFORM sp_send_dbmail (
    par_recipients := 'hello@rusgl.info',
    par_subject := 'Work Order List',
    par_body := var_tableHTML,
    par_body_format := 'HTML'
);
```

若要刪除電子郵件，請使用 程序`aws_sqlserver_ext.sysmail_delete_mailitems_sp`，如下所示。

```
DECLARE var_GETDATE datetime;
SET var_GETDATE = NOW();
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := var_GETDATE
);
```

下列範例示範如何刪除最舊的電子郵件。

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_before := '31.12.2015'
);
```

下列範例顯示如何刪除無法傳送的所有電子郵件。

```
PERFORM sysmail_delete_mailitems_sp (
    par_sent_status := 'failed'
);
```

若要建立新的使用者設定檔，請使用 程序`aws_sqlserver_ext.sysmail_add_profile_sp`，如下所示。

```
PERFORM sysmail_add_profile_sp (
    profile_name := 'Administrator',
    par_description := 'administrative mail'
);
```

下列範例示範如何建立新的設定檔，並將唯一的設定檔識別符儲存在變數中。

```
DECLARE var_profileId INT;
SELECT par_profile_id
    FROM sysmail_add_profile_sp (
        profile_name := 'Administrator',
        par_description := ' Profile used for administrative mail.')
    INTO var_profileId;
    
SELECT var_profileId;
```

若要建立新的電子郵件帳戶，請使用 程序`aws_sqlserver_ext.sysmail_add_account_sp`，如下所示。

```
PERFORM sysmail_add_account_sp (
    par_account_name :='Audit Account',
    par_email_address := 'dba@rusgl.info',
    par_display_name := 'Test Automated Mailer',
    par_description := 'Account for administrative e-mail.',
    par_mailserver_type := 'AWSLAMBDA'
    par_mailserver_name := 'arn:aws:lambda:us-west-2:555555555555:function:pg_v3'
);
```

若要將電子郵件帳戶新增至使用者設定檔，請使用如下所示`aws_sqlserver_ext.sysmail_add_profileaccount_sp`的程序。

```
PERFORM sysmail_add_profileaccount_sp (
    par_account_name := 'Administrator',
    par_account_name := 'Audit Account',
    par_sequence_number := 1
);
```

## 在 PostgreSQL 中模擬 SQL Server 資料庫郵件的使用案例範例
<a name="CHAP_Source.SQLServer.ToPostgreSQL.ExtensionPack.Mail.UseCases"></a>

如果您的來源資料庫程式碼使用 SQL Server Database Mail 來傳送電子郵件，您可以使用 AWS SCT 延伸套件將此程式碼轉換為 PostgreSQL。

**從 PostgreSQL 資料庫傳送電子郵件**

1. 建立和設定您的 AWS Lambda 函數。

1. 套用 AWS SCT 延伸套件。

1. 使用 `sysmail_add_profile_sp`函數建立使用者設定檔，如下所示。

1. 使用 `sysmail_add_account_sp`函數建立電子郵件帳戶，如下所示。

1. 使用 `sysmail_add_profileaccount_sp`函數將此電子郵件帳戶新增至您的使用者設定檔，如下所示。

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_settings_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sysmail_add_profile_sp(
       par_profile_name := 'Administrator',
       par_description := 'administrative mail'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_account_sp(
       par_account_name := 'Audit Account',
       par_description := 'Account for administrative e-mail.',
       par_email_address := 'dba@rusgl.info',
       par_display_name := 'Test Automated Mailer',
       par_mailserver_type := 'AWSLAMBDA'
       par_mailserver_name := 'your_ARN'
   );
   PERFORM aws_sqlserver_ext.sysmail_add_profileaccount_sp(
       par_profile_name := 'Administrator',
       par_account_name := 'Audit Account',
       par_sequence_number := 1
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

1. 使用 `sp_send_dbmail`函數傳送電子郵件，如下所示。

   ```
   CREATE OR REPLACE FUNCTION aws_sqlserver_ext.
   proc_dbmail_send_msdb()
   RETURNS void
   AS
   $BODY$
   BEGIN
   PERFORM aws_sqlserver_ext.sp_send_dbmail(
       par_profile_name := 'Administrator',
       par_recipients := 'hello@rusgl.info',
       par_body := 'The stored procedure finished',
       par_subject := 'Automated Success Message'
   );
   END;
   $BODY$
   LANGUAGE plpgsql;
   ```

若要檢視所有使用者設定檔的相關資訊，請使用 程序`sysmail_help_profile_sp`，如下所示。

```
SELECT FROM aws_sqlserver_ext.sysmail_help_profile_sp();
```

下列範例顯示特定使用者設定檔的相關資訊。

```
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profile_sp(par_profile_name := 'Administrator');
```

若要檢視所有電子郵件帳戶的相關資訊，請使用 程序`sysmail_help_account_sp`，如下所示。

```
select from aws_sqlserver_ext.sysmail_help_account_sp();
```

下列範例顯示特定電子郵件帳戶的相關資訊。

```
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_account_sp(par_account_name := 'Audit Account');
```

若要檢視與使用者設定檔關聯之所有電子郵件帳戶的相關資訊，請使用如下所示`sysmail_help_profileaccount_sp`的程序。

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp();
```

下列範例依識別符、設定檔名稱或帳戶名稱篩選記錄。

```
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_id := 1, par_account_id := 1);
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_profile_name := 'Administrator');
select from aws_sqlserver_ext.sysmail_help_profileaccount_sp(par_account_name := 'Audit Account');
```

若要變更使用者設定檔名稱或描述，請使用 程序`sysmail_update_profile_sp`，如下所示。

```
select aws_sqlserver_ext.sysmail_update_profile_sp(
    par_profile_id := 2,
    par_profile_name := 'New profile name'
);
```

若要變更電子郵件帳戶設定，請使用 程序`ysmail_update_account_sp`，如下所示。

```
select from aws_sqlserver_ext.sysmail_update_account_sp (
    par_account_name := 'Audit Account',
    par_mailserver_name := 'arn:aws:lambda:region:XXXXXXXXXXXX:function:func_test',
    par_mailserver_type := 'AWSLAMBDA'
);
```