Bỏ qua để đến nội dung

Tham chiếu adapter HTTP chung

Tham chiếu
Dành cho:
Nhà phát triển, Quản trị viên không gian làm việc
Cần quyền:
providers:managenhạy cảm
Trong ứng dụng:
Nhà cung cấp gửi thư, rồi Adapter, rồi Adapter HTTP chung

Trang này liệt kê mọi trường trong ánh xạ của adapter HTTP chung cho email: đối tượng http cho ReputeCast biết cách gọi API HTTP của một nhà cung cấp gửi thư và đọc webhook của họ mà không cần viết mã. Để xem các bước trong ứng dụng, hãy đọc kết nối bất kỳ API email HTTP nào.

Một ánh xạ đến được ReputeCast theo một trong ba cách:

  • Biểu mẫu tại Nhà cung cấp gửi thư, rồi Adapter, rồi Adapter HTTP chung. Lưu thành adapter lưu ánh xạ thành một adapter đã cài thuộc loại http cho mọi không gian làm việc trên hệ thống. Biểu mẫu bao gồm endpoint gửi, header của yêu cầu, mẫu nội dung, đường dẫn mã thư, ánh xạ webhook và xác thực webhook. Mọi trường khác trên trang này cần một manifest.
  • Một manifest thuộc loại http, cài từ URL https:// của nó bằng Nhà cung cấp gửi thư, rồi Adapter, rồi Cài từ kho adapter. reputecast adapter install chỉ cài adapter cộng đồng thuộc loại remote.
  • Settings riêng của một nhà cung cấp ({"http": {…}}), cho nhà cung cấp được kết nối qua adapter có sẵn httpgeneric.

Lưu, cài và thử một ánh xạ cần một quản trị viên hệ thống có quyền providers:manage. Sau đó, các không gian làm việc kết nối nhà cung cấp qua ánh xạ đó từ Nhà cung cấp gửi thư, rồi Thêm nhà cung cấp bằng thông tin xác thực của riêng mình.

Một adapter HTTP đã cài là một manifest JSON, trong đó đối tượng http là ánh xạ.

Trường Quy tắc
name Bắt buộc. Khóa trong sổ đăng ký là community: cộng với tên viết bằng chữ thường và chữ số, nối bằng dấu gạch ngang: “Example ESP” trở thành community:example-esp. Khóa này xuất hiện trong URL webhook. Biểu mẫu nhận từ 2 đến 60 ký tự.
version Bắt buộc khi cài từ URL. Hiển thị trên tab Adapter. Biểu mẫu lưu 0.1.0.
maintainer Hiển thị là community · <maintainer>; là unknown khi để trống. Biểu mẫu lưu local · <your name>.
kind "http".
capabilities Danh sách nhãn không bắt buộc cho tab Adapter, như ["webhooks"]. Huy hiệu trong danh mục được lấy từ chính ánh xạ.
source_url, latest_version, last_release Không bắt buộc. Một latest_version mới hơn sẽ hiển thị bản cập nhật. Một last_release (RFC 3339) cũ hơn 365 ngày đánh dấu adapter là Ngừng duy trì, và adapter không còn được đề xuất cho kết nối mới.
terms bulk là allowed, broadcast_streams_only, forbidden hoặc your_policy (mặc định). note và url (chính sách sử dụng được chấp nhận của nhà cung cấp) hiển thị bên cạnh. Với forbidden hoặc broadcast_streams_only, nhà cung cấp chỉ được đề xuất cho luồng Tự động hóa và Hệ thống.
pricing Văn bản không bắt buộc cho danh mục, như “$0.80 per 1,000”. Mặc định là “do nhà cung cấp của bạn quy định”.
http Ánh xạ: mọi trường bên dưới.

ReputeCast không đọc được điều khoản của một nhà cung cấp được ánh xạ, nên nếu không có terms, màn hình định tuyến sẽ yêu cầu bạn kiểm tra chính sách sử dụng được chấp nhận của nhà cung cấp trước khi định tuyến thư Gửi hàng loạt qua đó. Manifest cài từ URL phải nằm trên một địa chỉ https:// công khai và không quá 256 KiB.

Câu chữ của manifest (name, terms.note, pricing, cùng label và help của các fields) hiển thị đúng như bạn viết, ở mọi ngôn ngữ. Nếu không có terms.note hoặc pricing, câu chữ riêng của ReputeCast sẽ được dùng, bằng ngôn ngữ của từng người đọc, giống như mọi điều khác ReputeCast nói về ánh xạ.

Trường Quy tắc
method POST (mặc định), PUT hoặc PATCH.
url Một URL https://. Hãy viết rõ host; trường mẫu chỉ được xuất hiện trong path và query. Không có #fragment. Manifest có thể dùng http:// cho máy chủ thử nghiệm loopback (localhost, 127.0.0.1), mà hệ thống chỉ kết nối được khi bật providers.allow_private_networks. Biểu mẫu chỉ nhận https://.
headers Tên header → mẫu giá trị, chẳng hạn "Authorization": "Bearer {{ secrets.api_key }}". Content-Type mặc định là application/json. Không đặt được Host, Content-Length, Transfer-Encoding và Connection. Biểu mẫu nhận tối đa 20 header.
body Bắt buộc. Mẫu nội dung JSON. Mẫu phải là JSON hợp lệ sau khi điền các trường: khi lưu, ReputeCast kiểm tra mẫu với một thư mẫu, và thư nào có nội dung không kết xuất ra JSON sẽ bị từ chối với mã Template. Biểu mẫu nhận tối đa 20.000 ký tự.
message_id_path Đường dẫn tới mã thư của nhà cung cấp trong nội dung phản hồi 2xx, như $.data.id.
message_id_header Một header phản hồi mang mã thư thay cho nội dung. Dùng một trong hai trường, không dùng cả hai. Dấu ngoặc nhọn quanh mã sẽ bị bỏ. Nếu không có cả hai, mã thư ReputeCast được dùng thay.
error_code_path Đường dẫn tới mã lỗi của nhà cung cấp trong phản hồi thất bại.
error_message_path Đường dẫn tới thông báo lỗi của nhà cung cấp. Nếu không có hai đường dẫn này, nội dung phản hồi được dùng làm thông báo lỗi.
check.url Một yêu cầu GET không bắt buộc, trả lời 2xx khi thông tin xác thực còn hợp lệ. ReputeCast gọi nó khi một nhà cung cấp được kết nối và từ tác vụ kiểm tra tình trạng nhà cung cấp. Nếu không có, tình trạng chỉ dựa vào kết quả gửi.
check.headers Header của yêu cầu kiểm tra. Mặc định: các header của yêu cầu gửi.
fields Các trường kết nối bổ sung: key, label, secret, required, options, help. Mẫu đọc một trường bí mật là secrets.<key> và mọi trường khác là settings.<key>.

Biểu mẫu kết nối luôn có hai trường bí mật không bắt buộc: API key (secrets.api_key) và Webhook signing secret (secrets.webhook_signing_key). Thông tin bí mật là chỉ ghi: được niêm phong khi lưu trữ và không bao giờ được trả về.

ReputeCast gửi một yêu cầu cho mỗi thư và đọc câu trả lời như sau:

Phản hồi ReputeCast làm gì
2xx Được chấp nhận. Mã thư lấy từ message_id_path hoặc message_id_header.
401, 403 Thông tin xác thực bị từ chối: lần gửi thất bại và tình trạng của nhà cung cấp báo lại điều này.
429 Bị giới hạn tốc độ: thư đó được thử lại sau.
408, 5xx Sự cố ngừng hoạt động của nhà cung cấp: xem tình trạng nhà cung cấp và sự cố.
4xx khác Thư đó thất bại vĩnh viễn, kèm mã và thông báo mà các đường dẫn lỗi đọc được.

Mẫu chỉ dùng thẻ xuất kiểu Liquid: {{ name }}, kèm bộ lọc tùy chọn. Không có thẻ {% %}; một ánh xạ mô tả một yêu cầu cố định.

Trường Giá trị
sender From dạng "Name" <address>, hoặc chỉ địa chỉ khi không có tên.
sender_email, sender_name Địa chỉ và tên của From.
recipient, recipient_name, recipient_formatted Địa chỉ, tên của To, và "Name" <address>.
reply_to, reply_to_name Địa chỉ và tên của Reply-To, để trống khi không có.
subject, html, text Thư đã kết xuất và cá nhân hóa.
headers, headers_json Các header của thư dưới dạng đối tượng: List-Unsubscribe, List-Unsubscribe-Post và các header khác do ReputeCast đặt, cộng X-ReputeCast-Message.
headers_list Cùng các header đó dưới dạng [{"name": …, "value": …}], sắp xếp theo tên.
tags Tag của thư dưới dạng đối tượng.
message_id Mã thư ReputeCast. Hãy gửi mã này cho nhà cung cấp để webhook của họ gửi lại nó.
stream broadcast, automation hoặc system.
settings.<key>, secrets.<key> Settings và thông tin xác thực của nhà cung cấp đã kết nối.

Hãy gửi mọi header trong headers_json hoặc headers_list: nhà cung cấp hộp thư yêu cầu các header hủy đăng ký một lần nhấp. Hãy tắt tính năng theo dõi lượt mở và lượt nhấp riêng của nhà cung cấp trong nội dung nếu API của họ cho phép, vì ReputeCast tự theo dõi lượt mở và lượt nhấp.

Viết bộ lọc sau dấu gạch đứng: {{ settings.region | default: 'eu' }}. Bộ lọc chạy từ trái sang phải, và đối số là một chuỗi trong dấu nháy ('…' hoặc "…") hoặc một tên trường.

Bộ lọc Đối số Kết quả
default 1 Đối số, khi giá trị bị thiếu, là chuỗi rỗng, hoặc là đối tượng hay danh sách rỗng.
prepend 1 Đối số, rồi đến giá trị.
append 1 Giá trị, rồi đến đối số.
base64_encode không Base64 chuẩn.
url_encode không Mã hóa theo query URL.
downcase không Chữ thường.
upcase không Chữ hoa.
strip không Bỏ khoảng trắng ở đầu và cuối.
json không Giá trị được mã hóa thành văn bản JSON.

Mọi bộ lọc khác bị từ chối khi bạn lưu. Header sau tạo giá trị basic auth từ API key:

Header basic auth
"Authorization": "Basic {{ 'api:' | append: secrets.api_key | base64_encode }}"

Giá trị được thoát (escape) theo vị trí xuất hiện, để dữ liệu không làm hỏng yêu cầu:

  • Bên trong một chuỗi JSON ("subject": "{{ subject }}"), giá trị được thoát theo JSON.
  • Bên ngoài chuỗi ("headers": {{ headers_json }}), giá trị được mã hóa thành JSON: đối tượng vẫn là đối tượng, và giá trị bị thiếu trở thành null.
  • Trong URL, giá trị được thoát theo path, hoặc theo query sau dấu ?.
  • Trong header, ký tự xuống dòng trở thành khoảng trắng.

Để gửi nguyên văn {{ bên trong một chuỗi JSON (placeholder riêng của một API), hãy viết \{{: "Hi \{{first_name}}" gửi đi "Hi {{first_name}}". {{ '{{' }} có tác dụng tương tự ở mọi vị trí.

Thử với một thư mẫu kết xuất yêu cầu cho một thư mẫu (từ Acme Newsletter gửi Linh Nguyen) với mọi thông tin bí mật hiển thị là ••••. Không có gì được gửi đi.

Các trường *_path dùng một tập con của JSONPath:

Cú pháp Chọn
$ Gốc.
.name, ['name'], ["name"] Một thành viên.
[0] Một phần tử mảng (từ 0 trở lên).
[*], .* Mọi phần tử của một mảng hoặc đối tượng.

Bộ lọc ([?(…)]), duyệt đệ quy (..), slice và chỉ số âm bị từ chối khi bạn lưu. Khi một đường dẫn chọn được nhiều giá trị, giá trị đầu tiên được dùng, trừ events_path. Số được đọc chính xác, nên mã của nhà cung cấp lớn hơn 2^53 vẫn giữ đủ mọi chữ số.

webhook.auth cho biết một yêu cầu webhook chứng minh nó đến từ nhà cung cấp bằng cách nào. Biểu mẫu cung cấp cùng năm chế độ trong Xác thực webhook.

auth Yêu cầu được chấp nhận khi
hmac (mặc định) signature_header (mặc định X-Signature) chứa HMAC của signed_payload tạo bằng khóa bí mật. signed_payload dùng {body} và {timestamp}; mặc định là {body}, hoặc {timestamp}.{body} khi đặt timestamp_header. algorithm là sha256 (mặc định), sha1 hoặc sha512. encoding là hex (mặc định) hoặc base64. signature_prefix (như sha256=) được bỏ trước khi so sánh. Header có thể liệt kê nhiều chữ ký, phân cách bằng dấu phẩy hoặc khoảng trắng; chỉ cần một chữ ký khớp.
standard Yêu cầu mang chữ ký Standard Webhooks hợp lệ (webhook-id, webhook-timestamp, webhook-signature, hoặc các header svix-) tạo bằng một khóa bí mật whsec_.
basic Người dùng basic auth là username (mặc định reputecast) và mật khẩu là khóa bí mật.
header token_header chứa nguyên văn khóa bí mật. ReputeCast không bao giờ lưu header đó cùng sự kiện gốc.
none Không có gì ngoài URL webhook, vốn không thể đoán được. Chỉ dùng khi nhà cung cấp không hỗ trợ cách nào ở trên.

Với hmac có timestamp_header, hoặc với standard, timestamp (giây hoặc mili giây Unix) cũ hơn hoặc đi trước quá năm phút sẽ bị từ chối như một lần phát lại (replay).

Khóa bí mật là mẫu secret khi mẫu này được đặt (mẫu đọc được secrets.<key> và settings.<key>). Nếu không, khóa bí mật là Webhook signing secret của kết nối, và nếu vẫn không có thì là khóa bí mật webhook mà ReputeCast tạo cho nhà cung cấp. Khi hoàn toàn không có khóa bí mật, mọi yêu cầu đều bị từ chối.

Hãy trỏ webhook của nhà cung cấp tới URL trên thẻ của nhà cung cấp: <public URL>/hooks/community:<name>/<token> cho nhà cung cấp được kết nối qua một adapter HTTP đã cài, hoặc <public URL>/hooks/httpgeneric/<token>. Nội dung webhook giới hạn ở 5 MiB.

webhook_mapping chọn cách đọc sự kiện: status (mặc định) hoặc jsonpath. Trong biểu mẫu, Ánh xạ webhook cung cấp status → delivered | bounced | complained và Ánh xạ JSONPath tùy chỉnh.

Một ánh xạ hoàn toàn không có trường webhook nào (webhook_mapping, webhook.auth, webhook.signature_header, webhook.type_path, webhook.types) thì không có webhook: nhà cung cấp gửi thư nhưng không báo về lượt gửi thành công, thư trả lại hay khiếu nại.

Trường Đọc Mặc định với status
webhook.events_path Các sự kiện trong một yêu cầu $ (cả hai kiểu ánh xạ)
webhook.type_path Loại sự kiện (bắt buộc với jsonpath) $.status
webhook.recipient_path Người nhận $.recipient, rồi $.email
webhook.message_id_path Mã thư của nhà cung cấp $.message_id
webhook.reputecast_id_path Mã thư ReputeCast được gửi lại $.reputecast_id
webhook.code_path Phản hồi SMTP, hoặc mã riêng của nhà cung cấp $.code
webhook.diagnostic_path Văn bản chẩn đoán $.reason
webhook.time_path Thời điểm xảy ra $.timestamp
webhook.url_path Liên kết của một lượt nhấp $.url
webhook.user_agent_path User agent của một lượt mở hoặc lượt nhấp $.user_agent

Với jsonpath, chỉ những đường dẫn bạn đặt mới được đọc. Ánh xạ tùy chỉnh trong biểu mẫu đặt Các sự kiện trong một yêu cầu, Loại sự kiện, Người nhận và Mã thư.

events_path có thể chọn một sự kiện, một mảng sự kiện, hoặc nhiều mục thuộc một trong hai dạng; các mảng được làm phẳng. Người nhận được chuyển sang chữ thường. Mã ReputeCast được gửi lại phải là một mã thư ReputeCast (một UUID) thì mới khớp. Thời gian là giây hoặc mili giây Unix, RFC 3339 hoặc YYYY-MM-DD hh:mm:ss; nếu không có, thời điểm sự kiện đến được dùng.

Với status, giá trị loại (không phân biệt hoa thường) được ánh xạ thành một sự kiện chuẩn hóa:

Giá trị của nhà cung cấp Sự kiện
delivered, delivery delivered
deferred, delayed, delivery_delayed deferred
bounced, bounce, failed do mã của sự kiện quyết định (bên dưới)
hard_bounce, hard_bounced, hardbounce, permanent_failure hard_bounce
soft_bounce, soft_bounced, softbounce, temporary_failure soft_bounce
complained, complaint, spam, spam_report, spamreport complaint
rejected, dropped, blocked rejected
opened, open open
clicked, click click
unsubscribed, unsubscribe unsubscribe

Mọi giá trị khác bị bỏ qua. Với jsonpath, webhook.types ánh xạ các loại của nhà cung cấp (không phân biệt hoa thường) thành delivered, deferred, hard_bounce, soft_bounce, bounce, complaint, rejected, open, click, unsubscribe hoặc ignore. Loại bạn không liệt kê sẽ dùng bảng ở trên, và nếu không khớp thì bị bỏ qua.

ReputeCast chỉ chặn gửi một địa chỉ khi có bằng chứng, vì các trường hợp trả thư vĩnh viễn và khiếu nại được đưa vào danh sách chặn gửi dùng chung:

  • Một thư trả lại thông thường (bounced hoặc bounce) là vĩnh viễn, trừ khi mã của nó cho biết khác. Phản hồi SMTP quyết định theo lớp: 5xx là vĩnh viễn, 4xx là tạm thời. Mã riêng của nhà cung cấp (invalid_recipient, mailbox_full) chỉ là vĩnh viễn khi mã đó chỉ ra hộp thư hoặc tên miền không tồn tại, hoặc có chữ “hard” hay “permanent”; mọi mã khác là tạm thời. Không có mã thì là vĩnh viễn.
  • Một hard_bounce có phản hồi SMTP 4xx trở thành tạm thời.
  • Một trường hợp trả thư vĩnh viễn do phía người gửi gây ra (được phân loại là bị chặn vì spam, uy tín hoặc chính sách) trở thành tạm thời, bất kể mã là gì.

Thư trả lại, thư hoãn nhận và thư bị từ chối được gán một lớp thư trả lại dựa trên mã và văn bản chẩn đoán.

Manifest này ánh xạ một nhà cung cấp hư cấu, Example ESP. Ánh xạ gửi một thư cho mỗi POST, đọc mã thư từ phản hồi, kiểm tra thông tin xác thực với một endpoint tài khoản, hỏi Account ID khi kết nối một nhà cung cấp, và đọc webhook có chữ ký HMAC với một bảng ánh xạ loại tùy chỉnh.

example-esp.manifest.json
{
"name": "Example ESP",
"version": "1.0.0",
"maintainer": "[email protected]",
"kind": "http",
"source_url": "https://github.com/you/example-esp-mapping",
"terms": {
"bulk": "allowed",
"note": "Opted-in lists only.",
"url": "https://example-esp.com/aup"
},
"pricing": "$0.80 per 1,000",
"http": {
"method": "POST",
"url": "https://api.example-esp.com/v1/{{ settings.account }}/messages",
"headers": {
"Authorization": "Bearer {{ secrets.api_key }}"
},
"body": "{\"from\": \"{{ sender }}\", \"to\": [{\"email\": \"{{ recipient }}\", \"name\": \"{{ recipient_name }}\"}], \"reply_to\": {{ reply_to | default: sender_email }}, \"subject\": \"{{ subject }}\", \"html\": \"{{ html }}\", \"text\": \"{{ text }}\", \"headers\": {{ headers_json }}, \"metadata\": {\"reputecast_id\": \"{{ message_id }}\", \"stream\": \"{{ stream }}\"}, \"tracking\": {\"opens\": false, \"clicks\": false}}",
"message_id_path": "$.data.id",
"error_code_path": "$.error.code",
"error_message_path": "$.error.message",
"check": {
"url": "https://api.example-esp.com/v1/{{ settings.account }}/me"
},
"fields": [
{
"key": "account",
"label": "Account ID",
"required": true,
"help": "Example ESP › Settings › Account."
}
],
"webhook_mapping": "jsonpath",
"webhook": {
"auth": "hmac",
"signature_header": "X-Example-Signature",
"signature_prefix": "sha256=",
"timestamp_header": "X-Example-Timestamp",
"events_path": "$.events[*]",
"type_path": "$.event",
"recipient_path": "$.recipient",
"message_id_path": "$.message_id",
"reputecast_id_path": "$.metadata.reputecast_id",
"code_path": "$.smtp.code",
"diagnostic_path": "$.smtp.message",
"time_path": "$.ts",
"url_path": "$.link",
"types": {
"delivered": "delivered",
"delayed": "deferred",
"bounce_permanent": "hard_bounce",
"bounce_temporary": "soft_bounce",
"complaint": "complaint",
"click": "click",
"sent": "ignore"
}
}
}
}

Với thư mẫu, nội dung được kết xuất thành:

Nội dung yêu cầu đã kết xuất
{
"from": "\"Acme Newsletter\" <[email protected]>",
"to": [{ "email": "[email protected]", "name": "Linh Nguyen" }],
"reply_to": "[email protected]",
"subject": "Your October update",
"html": "<p>Hello \"Linh\" — this is a <b>sample</b>.</p>",
"text": "Hello \"Linh\" — this is a sample.",
"headers": {
"List-Unsubscribe": "<https://news.acme.io/p/acme/unsubscribe/abc>",
"List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
"X-ReputeCast-Message": "0199d5a8-2b6e-7c41-9a0e-5b8f1c2d3e40"
},
"metadata": { "reputecast_id": "0199d5a8-2b6e-7c41-9a0e-5b8f1c2d3e40", "stream": "broadcast" },
"tracking": { "opens": false, "clicks": false }
}

Example ESP ký mỗi webhook với X-Example-Timestamp: <Unix seconds> và X-Example-Signature: sha256=<hex HMAC-SHA256 of "<timestamp>.<body>">, với khóa là khóa bí mật được nhập vào Webhook signing secret của kết nối. Yêu cầu sau:

Nội dung webhook từ Example ESP
{
"events": [
{ "event": "delivered", "recipient": "[email protected]", "message_id": "msg_7fa3", "metadata": { "reputecast_id": "0199d5a8-2b6e-7c41-9a0e-5b8f1c2d3e40" }, "smtp": { "code": "250 2.0.0", "message": "OK" }, "ts": 1791882062 },
{ "event": "bounce_permanent", "recipient": "[email protected]", "message_id": "msg_7fa4", "metadata": { "reputecast_id": "0199d5a8-2b6e-7c41-9a0e-5b8f1c2d3e41" }, "smtp": { "code": "550 5.1.1", "message": "The email account that you tried to reach does not exist." }, "ts": 1791882065123 },
{ "event": "bounce_permanent", "recipient": "[email protected]", "message_id": "msg_7fa5", "smtp": { "code": "550 5.7.1", "message": "Message rejected as spam" }, "ts": "2026-10-13T09:01:05Z" },
{ "event": "sent", "recipient": "[email protected]", "message_id": "msg_7fa6" },
{ "event": "opened", "recipient": "[email protected]", "message_id": "msg_7fa6" }
]
}

tạo ra bốn sự kiện:

Sự kiện của nhà cung cấp Sự kiện Người nhận Mã Lớp thư trả lại
delivered delivered [email protected] 250 2.0.0 —
bounce_permanent, 5.1.1 hard_bounce [email protected] 550 5.1.1 mailbox_unknown
bounce_permanent, spam soft_bounce [email protected] 550 5.7.1 spam_block
opened (không có trong types) open [email protected] — —

Sự kiện sent bị bỏ qua. Hai sự kiện đầu khớp với thư của chúng qua mã ReputeCast được gửi lại, các sự kiện còn lại khớp qua mã thư của nhà cung cấp.

  • Adapter HTTP chung gửi một thư cho mỗi yêu cầu, thiết lập tên miền qua bản ghi DNS thủ công, và tự áp dụng danh sách chặn gửi tại chỗ (Chỉ cục bộ); adapter này không tự phát hiện hạn mức. Khi nhà cung cấp cần gửi theo lô, API tên miền, đồng bộ danh sách chặn gửi hoặc nhiều lệnh gọi cho mỗi thư, hãy viết một adapter cộng đồng.
  • Khi lưu, ReputeCast từ chối ánh xạ có vấn đề và nêu tên trường (body, url, webhook.type_path…). Nhật ký kiểm tra ghi lại phương thức, URL, tên header, ánh xạ webhook và chế độ xác thực, không bao giờ ghi giá trị header.
  • Mỗi adapter đã cài xuất hiện trong Nhà cung cấp gửi thư, rồi Thêm nhà cung cấp ở mọi không gian làm việc, kèm điều khoản, giá và các trường kết nối. Mọi tiến trình đọc lại danh sách adapter đã cài sau mỗi 15 giây.