定制电子邮件
当用户与应用程序交互时,您可能想要发送回复或请求验证。App ID 提供可用于交互的缺省模板。 此外,您还可以使用这些模板作为指南,定制消息传递以适合您的品牌。
App ID 使用 SendGrid 作为邮件传递服务。 所有电子邮件都会使用单个 SendGrid 帐户发送。
配置电子邮件设置
通过 App ID,您可以选择使用 App ID 缺省 SendGrid 凭证,添加您自己的 SendGrid 帐户,或者配置您自己的定制 Webhook 以在 Cloud Directory 中发送电子邮件消息。
使用 IBM 缺省电子邮件提供者
缺省情况下,App ID 使用 SendGrid 作为 Cloud Directory 的电子邮件传递服务。
-
转到服务控制面板的云目录 > 电子邮件模板 > 电子邮件设置页面。
-
选择 缺省值。 此时将显示需要输入的信息。
-
配置发件人详细信息。
-
在 发件人中,输入您希望用户从中接收电子邮件的电子邮件地址。
-
在 发件人名称中,输入要与“发件人”电子邮件关联的名称。
-
在 回复中,输入要在其中接收某人可能对电子邮件的任何回复的电子邮件地址。
-
-
单击 测试 以使用测试电子邮件尝试配置。
-
单击保存启用配置。
添加您自己的 SendGrid 帐户
通过使用您自己的 SendGrid 帐户来发送 Cloud Directory 电子邮件,您具有完全控制权。 您可以决定如何发送电子邮件,使用您自己的域名以及定义发件人详细信息。 通过定制电子邮件设置,您可以降低将电子邮件作为垃圾邮件进行过滤的机会,同时提高应用程序的品牌知名度。
与电子邮件提供者的直接连接可帮助您获取有关个别消息的信息,例如打开电子邮件的人数以及未传递的消息。 您还可以查看可用于更好地管理电子邮件营销活动的总体统计信息。
没有 SendGrid 帐户? 注册。
-
转到服务控制面板的云目录 > 电子邮件模板 > 电子邮件设置页面。
-
选择 SendGrid。 此时将显示需要输入的信息。
-
在 SendGrid API 密钥中,输入 API 密钥。
-
配置发件人详细信息。
-
在 发件人中,输入您希望用户从中接收电子邮件的电子邮件地址。
-
在 发件人名称中,输入要与“发件人”电子邮件关联的名称。
-
在 回复中,输入要在其中接收某人可能对电子邮件的任何回复的电子邮件地址。
-
-
单击 测试 以使用测试电子邮件尝试配置。
-
单击保存启用配置。
定制电子邮件提供者
通过定义您自己的定制扩展点以发送 Cloud Directory 电子邮件,您具有完全控制权。 您可以决定如何发送电子邮件,使用您自己的域名以及定义发件人详细信息。 通过定制电子邮件设置,您可以降低将电子邮件作为垃圾邮件进行过滤的机会,同时提高应用程序的品牌知名度。
与电子邮件提供者的直接连接可帮助您获取有关个别消息的信息,例如打开电子邮件的人数以及未传递的消息。 您还可以查看可用于更好地管理电子邮件营销活动的总体统计信息。
使用 GUI 配置定制提供程序
您可以使用服务仪表板来配置定制提供程序。
-
转到服务控制面板的云目录 > 电子邮件模板 > 电子邮件设置页面。
-
选择自定义。 此时将显示需要输入的信息。
-
在 Webhook 中,输入您的自定义扩展名 URL。
-
选择授权类型。 可以从以下选项中进行选择:
- 无:webhook 端点或 URL,不需要授权标头。
- 基本:网络钩子端点要求每个请求都包含一个 HTTP 授权标头,以用户名和密码的形式提供。
- 授权标头:Webhook 请求要求您在 HTTP 授权中传递端点的授权信息。 例如,您可以传递一个 OAuth 2.0 令牌:
Authorization: Bearer eyJraWQiOiIyMDIwMDEyNTE2MzMiLCJhbGciOiJSUzI1NiJ9.eyJpYW1faWQiOiJJ
。
-
配置发件人详细信息。
-
在 发件人中,输入您希望用户从中接收电子邮件的电子邮件地址。
-
在 发件人名称中,输入要与“发件人”电子邮件关联的名称。
-
在 回复中,输入要在其中接收任何电子邮件回复的电子邮件地址。
-
-
单击 测试 以使用测试电子邮件尝试配置。
-
单击保存启用配置。
使用 API 配置定制提供程序
您可以使用 Cloud Directory 管理 API 来配置定制电子邮件发件人。
-
配置可监听 POST 请求的扩展点。 端点必须能够:
- 读取来自 App ID的有效内容。
- 从定制提供者发送电子邮件。
- (可选) 验证 第三方未以任何方式变更 App ID 返回的 JSON 有效内容。 将返回格式为
{"jws": "jws-format-string"}
的字符串,其中包含您的租户标识,JWS 令牌的签发者,发送消息的时间戳记,唯一事务标识以及包含发件人详细信息和电子邮件正文内容的实际消息信息。
您的扩展点可能与下面的示例相似:
const sgMail = require('@sendgrid/mail'); const {promisify} = require('bluebird'); const request = promisify(require('request')); const jwtVerify = promisify(require('jsonwebtoken').verify); const jwtDecode = require('jsonwebtoken').decode; const jwkToPem = require('jwk-to-pem'); async function obtainPublicKeys() { // Your instance tenant ID const tenantId = '<tenantID>'; // Send request to App ID's public keys endpoint const keysOptions = { method: 'GET', url: `https://<region>.appid.cloud.ibm.com/oauth/v4/$<tenantID>/publickeys` }; const keysResponse = await request(keysOptions); return JSON.parse(keysResponse.body).keys; } async function verifySignature(keysArray, kid, jws) { const keyJson = keysArray.find(key => key.kid === kid); if (keyJson) { const pem = jwkToPem(keyJson); await jwtVerify(jws, pem); return; } throw new Error ("Unable to verify signature"); } async function verifyAndSendMail(jws) { // The API key for Sendgrid const sgApiKey = '<SengridApiKey>'; // Init Sendgrind sgMail.setApiKey(sgApiKey); // Decode message to get information const data = jwtDecode(jws, {complete: true}); // Extract kid from header const kid = data.header.kid; const keysArray = await obtainPublicKeys(); // Verify the signature of the payload with the public keys await verifySignature(keysArray, kid ,jws); // Send the email with Your Sendgrid account const message = data.payload.message; const msg = { to: message.to, from: message.from.address, subject: message.subject, html: message.body, }; console.log(`Sending email to ${message.to}`); let sendgridResponse = await sgMail.send(msg); return {result : 'email_sent',sendgridResponse}; }
-
向
/management/v4/<tenantID>/config/cloud_directory/email_dispatcher
发送 PUT 请求,提供网络钩子 URL。 您还可以选择提供授权信息。 支持的授权类型包括:Basic authorization
和constant authorization header value
。curl -X PUT https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/config/cloud_directory/email_dispatcher' \ --header 'Accept: application/json' \ --header 'Authorization: Bearer <IAMToken>' \ -d '{ "provider": "custom", "custom": { "url": "https://example.com/send_mail", "authorization": { "type": "basic", "username": "<username>", "password": "<password>" } } }'
-
通过测试电子邮件分派器来验证配置是否已正确设置。 使用 测试 API 向您配置的自定义电子邮件发件人触发请求。
电子邮件模板
向用户发送消息时,可以使用以下模板的任意组合。 或者,可以编辑模板来定制消息。
除以下信息类型外,您还可以使用 MFA 模板。
要进一步定制,可以在消息中使用参数。 请查看下表,了解您可以在所有报文类型中使用的参数。
参数 | 描述 |
---|---|
%{display.logo} |
显示为登录窗口小部件配置的图像。 |
%{user.displayName} |
显示用户所选的在与应用程序交互时要使用的屏幕名称。 |
%{user.email} |
显示用户的注册电子邮件地址。 |
%{user.username} |
当认证方法设置为用户名和密码时,显示用户指定的用户名。 |
%{user.firstName} |
显示用户的指定名字。 |
%{user.formattedName} |
显示用户的全名。 |
%{user.lastName} |
显示用户的指定姓氏。 |
电子邮件:欢迎
用户向应用程序注册时,您可能希望向用户发送一条消息,欢迎他们使用您的应用程序。
电子邮件:验证
用户使用自己的电子邮件注册应用程序时,您可以向他们发送一封电子邮件,要求他们确认自己的身份。 通过请求验证,您可以限制可注册应用程序的伪帐户数。 您可以限制为当用户已验证电子邮件后才可访问应用程序,或用于管理您将为哪些用户创建概要文件。
通过 App ID 仪表板或“创建用户”API 手动添加的用户不会自动收到此电子邮件。
-
转到服务控制面板的云目录 > 电子邮件模板 > 电子邮件验证选项卡。
-
将电子邮件验证设置为已启用。
-
将允许用户在未先验证其电子邮件地址的情况下登录到应用程序设置为是。 设置为“是”时,用户向应用程序注册后,但在验证其电子邮件地址之前,能够与应用程序进行交互。 缺省设置为“否”。
-
定制消息的内容。 您可以使用控制台添加参数和插入图像。 要更改信息的 语言,可以使用 API 设置语言。 不过,您要对信息的内容和转换负责。 请查看下表以了解可以在消息中使用的不同参数。 如果用户未提供参数拉出的信息,那么会显示为空。
您可以在与验证有关的信息中使用的参数 参数 描述 %{linkExpiration.hours}
显示链接保持有效的时数。 %{linkExpiration.minutes}
显示链接保持有效的分钟数。 %{verify.code}
显示一次性验证 URL。 %{verify.link}
显示在设置中指定的操作 URL。 您还可以使用欢迎消息部分中列出的消息参数。
-
为操作 URL 定义到期时间。 URL 到期时间是以分钟为单位的时间量,用户必须在此时间内完成操作,在此时间后验证链接将到期。 此设置还会影响重置密码链接有效的时间量。
-
在感谢页面 URL 框中输入在用户验证其电子邮件后要显示的页面的 URL。 如果选择将此字段保留为空,那么将显示 App ID 缺省页面。
-
单击保存。
电子邮件:重置密码
用户与应用程序进行交互时,可能会忘记自己的密码,或者需要更新密码。 您可以定制对这些请求的电子邮件响应。 当用户请求更改自己的密码时,在他们单击此电子邮件中的链接之前,其密码仍保持未更改状态。
-
转到服务控制面板的云目录 > 电子邮件模板 > 重置密码选项卡。
-
将忘记密码电子邮件设置为已启用。
-
定制消息的内容。 您可以使用控制台添加参数和插入图像。 要更改信息的 语言,可以使用 API 设置语言。 不过,您要对信息的内容和转换负责。 请查看下表以了解可以在消息中使用的不同参数。 如果用户未提供参数拉出的信息,那么会显示为空。
在与忘记密码相关的信息中可以使用的参数 参数 描述 %{linkExpiration.hours}
显示链接保持有效的小时数。 %{linkExpiration.minutes}
显示链接保持有效的分钟数。 %{resetPassword.code}
在 URL 中,显示一次性密码作为其中一部分。 这意味着每个人都会收到不同的代码。 示例: https://us-south.appid.cloud.ibm.com/wfm/verify/6574839563478
%{resetPassword.link}
显示用户单击以重置密码的链接。 您还可以使用欢迎消息部分中列出的消息参数。
-
为操作 URL 定义到期时间。 URL 到期时间是以分钟为单位的时间量,用户必须在此时间内完成操作,在此时间后验证链接将到期。 此设置还会影响重置密码链接有效的时间量。
-
在重置密码页面 URL 框中输入在用户验证其电子邮件后要显示的页面的 URL。 如果选择将此字段保留为空,那么将显示 App ID 缺省页面。
-
单击保存。
电子邮件:密码更改
您可以在用户密码更新时通知用户。 在用户并未请求更改密码时,该通知很有用。 他们可以采取适当步骤来重新保护自己帐户的安全。
-
转到服务控制面板的云目录 > 电子邮件模板 > 密码更改选项卡。
-
将密码已更改电子邮件设置为已启用。
-
定制消息的内容。 您可以使用控制台添加参数和插入图像。 要更改信息的 语言,可以使用 API 设置语言。 不过,您要对信息的内容和转换负责。 请查看下表以了解可以在消息中使用的不同参数。 如果用户未提供参数拉出的信息,那么会显示为空。
在更改密码的相关信息中可以使用的参数 参数 描述 %{passwordChangeInfo.time}
显示新密码生效的时间。 %{passwordChangeInfo.ipAddress}
显示请求更改密码的 IP 地址。 您还可以使用欢迎消息部分中列出的消息参数。
-
单击保存。
支持的语言
您可以使用 语言管理 API 来设置用户通信的语言。 但是,仅英语开箱即用。 您负责信息的转换。 在使用 API 设置配置后,GUI 将更新,从而使您能够更改模板文本。
代码 | 语言 | 区域 |
---|---|---|
af-ZA |
南非荷兰语 | 南非 |
sq-AL |
阿尔巴尼亚语 | 阿尔巴尼亚 |
am-ET |
阿姆哈拉语 | 埃塞俄比亚 |
ar-DZ |
阿拉伯语 | 阿尔及利亚 |
ar-BH |
阿拉伯语 | 巴林 |
ar-EG |
阿拉伯语 | 埃及 |
ar-IQ |
阿拉伯语 | 伊拉克 |
ar-JO |
阿拉伯语 | 约旦 |
ar-KW |
阿拉伯语 | 科威特 |
ar-LB |
阿拉伯语 | 黎巴嫩 |
ar-LY |
阿拉伯语 | 利比亚 |
ar-MR |
阿拉伯语 | 毛里塔尼亚 |
ar-MA |
阿拉伯语 | 摩洛哥 |
ar-OM |
阿拉伯语 | 阿曼 |
ar-QA |
阿拉伯语 | 卡塔尔 |
ar-SA |
阿拉伯语 | 沙特阿拉伯 |
ar-SY |
阿拉伯语 | 叙利亚 |
ar-YE |
阿拉伯语 | 突尼斯 |
ar-AE |
阿拉伯语 | 阿拉伯联合酋长国 |
ar-YE |
阿拉伯语 | 也门 |
hy-AM |
亚美尼亚语 | 亚美尼亚 |
as-IN |
阿萨姆语 | 印度 |
az-AZ |
阿塞拜疆语 | 阿塞拜疆 |
eu-ES |
巴斯克语 | 西班牙 |
be-BY |
白俄罗斯语 | 白俄罗斯 |
bn-BD |
孟加拉语 | 孟加拉国 |
be-BY |
白俄罗斯语 | 白俄罗斯 |
bn-BD |
孟加拉语 | 孟加拉国 |
bn-IN |
孟加拉语 | 印度 |
bs-Latn-BA |
波斯尼亚语 | 波斯尼亚 |
bg-BG |
保加利亚语 | 保加利亚 |
my-MM |
缅甸语 | 缅甸 |
ca-ES |
加泰罗尼亚语 | 西班牙 |
zh-Hans-CN |
简体中文 | 中国 |
zh-Hans-SG |
简体中文 | 新加坡 |
zh-Hant-HK |
繁体中文 | 中国香港特别行政区 |
zh-Hant-MO |
繁体中文 | 澳门 S.A.R |
zh-Hant-TW |
繁体中文 | 台湾 |
hr-HR |
克罗地亚语 | 克罗地亚 |
cs-CZ |
捷克语 | 捷克共和国 |
da-DK |
丹麦语 | 丹麦 |
nl-BE |
荷兰语 | 比利时 |
nl-NL |
荷兰语 | 荷兰 |
en-AU |
英语 | 澳大利亚 |
eu-BE |
英语 | 比利时 |
en-CM |
英语 | 喀麦隆 |
eu-CA |
英语 | 加拿大 |
en-GH |
英语 | 加纳 |
eu-HK |
英语 | 中国香港特别行政区 |
en-IN |
英语 | 印度 |
en-IE |
英语 | 爱尔兰 |
en-KE |
英语 | 肯尼亚 |
en-MU |
英语 | 毛里求斯 |
en-NZ |
英语 | 新西兰 |
en-NG |
英语 | 尼日利亚 |
en-PH |
英语 | 菲律宾 |
en-SG |
英语 | 新加坡 |
en-ZA |
英语 | 南非 |
en-TZ |
英语 | 坦桑尼亚 |
en-GB |
英语 | 英国 |
en-US |
英语 | 美国 |
en-ZM |
英语 | 赞比亚 |
en |
英语 | |
et-EE |
爱沙尼亚语 | 爱沙尼亚 |
fil-PH |
菲律宾语 | 菲律宾 |
fi-FI |
芬兰语 | 芬兰 |
fr-DZ |
法语 | 阿尔及利亚 |
fr-CM |
法语 | 喀麦隆 |
fr-CD |
法语 | 刚果民主共和国 |
fr-BE |
法语 | 比利时 |
fr-CA |
法语 | 加拿大 |
fr-FR |
法语 | 法国 |
fr-CI |
法语 | 科特迪瓦 |
fr-LU |
法语 | 卢森堡 |
fr-MR |
法语 | 毛里塔尼亚 |
fr-MU |
法语 | 毛里求斯 |
fr-MA |
法语 | 摩洛哥 |
fr-SN |
法语 | 塞内加尔 |
fr-CH |
法语 | 瑞士 |
fr-TN |
法语 | 突尼斯 |
gl-ES |
加利西亚语 | 西班牙 |
lg-UG |
干达语 | 乌干达 |
ka-GE |
格鲁吉亚语 | 格鲁吉亚 |
de-AT |
德语 | 奥地利 |
de-DE |
德语 | 德国 |
de-LU |
德语 | 卢森堡 |
de-CH |
德语 | 瑞士 |
el-GR |
希腊语 | 希腊 |
gu-IN |
古吉拉特语 | 印度 |
ha-NG |
蒙撒语 | 尼日利亚 |
he-IL |
希伯莱语 | 以色列 |
hi-IN |
印地语 | 印度 |
hu-HU |
匈牙利语 | 匈牙利 |
is-IS |
冰岛语 | 冰岛 |
ig-NG |
伊博语 | 尼日利亚 |
id-ID |
印度尼西亚语 | 印度尼西亚 |
it-IT |
意大利语 | 意大利 |
it-CH |
意大利语 | 瑞士 |
ja-JP |
日语 | 日本 |
kn-IN |
卡纳达语 | 印度 |
kk-KZ |
哈萨克语 | 哈萨克斯坦 |
km-KH |
高棉语 | 柬埔寨 |
rw-RW |
卢旺达语 | 卢旺达 |
kok-IN |
孔卡尼语 | 印度 |
ko-KR |
韩语 | 韩国 |
lo-LA |
立陶宛语 | 立陶宛 |
lv-LV |
拉脱维亚语 | 拉脱维亚 |
lt-LT |
高棉语 | 柬埔寨 |
mk-MK |
马其顿语 | 马其顿 |
ms-Latn-MY |
马来西亚拉丁语 | 马来西亚 |
ml-IN |
马拉雅拉姆语 | 印度 |
mt-MT |
马耳他语 | 马耳他 |
mr-IN |
马拉地语 | 印度 |
mn-Cyrl-MN |
蒙古斯拉夫语 | 蒙古 |
ne-IN |
尼泊尔语 | 印度 |
ne-NP |
尼泊尔语 | 尼泊尔 |
nb-NO |
挪威博克马尔语 | 挪威 |
nn-NO |
西挪威语 | 挪威 |
or-IN |
奥里雅语 | 印度 |
om-ET |
奥罗莫语 | 埃塞俄比亚 |
pl-PL |
波兰语 | 波兰 |
pt-AO |
葡萄牙语 | 安哥拉 |
pt-BR |
葡萄牙语 | 巴西 |
pt-MO |
葡萄牙语 | 澳门 S.A.R |
pt-MZ |
葡萄牙语 | 莫桑比克 |
pt-PT |
葡萄牙语 | 葡萄牙 |
pa-IN |
旁遮普语 | 印度 |
ro-RO |
罗马尼亚语 | 罗马尼亚 |
ru-RU |
俄语 | 俄罗斯 |
sr-Cyrl-RS |
塞尔维亚西里尔语 | 塞尔维亚 |
sr-Latn-ME |
塞尔维亚拉丁语 | 黑山 |
sr-Latn-RS |
塞尔维亚拉丁语 | 塞尔维亚 |
si-LK |
锡兰语 | 斯里兰卡 |
sk-SK |
斯洛伐克语 | 斯洛伐克 |
sl-SI |
斯洛文尼亚语 | 斯洛文尼亚 |
es-AR |
西班牙语 | 阿根廷 |
es-BO |
西班牙语 | 玻利维亚 |
es-CL |
西班牙语 | 智利 |
es-CO |
西班牙语 | 哥伦比亚 |
es-CR |
西班牙语 | 哥斯达黎加 |
es-DO |
西班牙语 | 多米尼加共和国 |
es-EC |
西班牙语 | 厄瓜多尔 |
es-SV |
西班牙语 | 萨尔瓦多 |
es-GT |
西班牙语 | 危地马拉 |
es-HN |
西班牙语 | 洪都拉斯 |
es-MX |
西班牙语 | 墨西哥 |
es-NI |
西班牙语 | 尼加拉瓜 |
es-PA |
西班牙语 | 巴拿马 |
es-PY |
西班牙语 | 巴拉圭 |
es-PE |
西班牙语 | 秘鲁 |
es-PR |
西班牙语 | 波多黎各 |
es-ES |
西班牙语 | 西班牙 |
es-US |
西班牙语 | 美国 |
es-UY |
西班牙语 | 乌拉圭 |
es-VE |
西班牙语 | 委内瑞拉 |
sw-KE |
斯瓦希里语 | 肯尼亚 |
sw-TZ |
斯瓦希里语 | 坦桑尼亚 |
sv-SE |
瑞典语 | 瑞典 |
ta-IN |
泰米尔语 | 印度 |
te-IN |
泰卢固语 | 印度 |
th-TH |
泰国语 | 泰国 |
tr-TR |
土耳其语 | 土耳其 |
uk-UA |
乌克兰语 | 乌克兰 |
ur-IN |
乌尔都语 | 印度 |
ur-PK |
乌尔都语 | 巴基斯坦 |
uz-Cyrl-UZ |
乌兹别克西里尔语 | 乌兹别克斯坦 |
uz-Latn-UZ |
乌兹别克拉丁语 | 乌兹别克斯坦 |
vi-VN |
越南语 | 越南 |
cy-GB |
威尔士语 | 英国 |
yo-NG |
约鲁巴语 | 尼日利亚 |
zu-ZA |
祖鲁 | 南非 |