Tích hợp quy trình email và các SDK
Khám phá các API và tích hợp của SendRepute dành cho phân tích email, các công cụ thiết kế và viết lại bằng AI có tính phí riêng. Các điểm cuối (endpoints) phân tích trung tâm, viết lại và trình dựng không gửi email; tính năng phân phối Campaigns được bật có chủ đích và một số bộ điều hợp (adapters) của nhà cung cấp nhất định có thể gửi email bằng nhà cung cấp đã được bạn cấu hình. Không có kết quả nào đảm bảo việc email sẽ vào hộp thư đến.
Gói Node.js hiện đã có trên npm. Các tích hợp khác có thể được tải xuống tại đây hoặc cài đặt từ kho lưu trữ GitHub công khai đã được xác minh. Hãy chọn một bản tích hợp, làm theo hướng dẫn và xem lại các quyền, mức giá hiện tại cũng như cài đặt thất bại trước khi kích hoạt.
Giữ nguyên quy trình làm việc qua email hiện tại của bạn. Các ví dụ API trung tâm này chỉ phân tích, viết lại hoặc xây dựng nội dung; chúng không bao giờ gửi email. Riêng biệt, tính năng phân phối Chiến dịch được kích hoạt có chủ ý và một số bộ điều hợp nhất định của nhà cung cấp có thể gửi thông qua nhà cung cấp đã cấu hình của bạn. Chọn một công cụ dựa trên các bước cài đặt, cấu hình, ví dụ và giới hạn hoạt động của nó. Các ví dụ không chạy trên trang này; hãy xem xét các hoạt động trả phí và hành động gửi một cách riêng biệt.
WordPress plugin
0.2.0
Yêu cầu WordPress 5.7+, PHP 7.4+ và OpenSSL. Tải lên tệp ZIP thông qua Plugins > Add New > Upload Plugin, sau đó mở Settings > SendRepute. Cấu hình mã token của mỗi trang web và sự đồng ý phân tích trả phí một cách riêng biệt. Bằng chứng vòng đời cài đặt bao gồm WordPress 6.8.3 với WooCommerce 10.4.3; bằng chứng plugin SMTP riêng biệt bao gồm WordPress 7.1.2 với WP Mail SMTP 4.9.0 và FluentSMTP 2.4.0.
Kiểm tra tin nhắn thông qua pre_wp_mail mà không thay thế SMTP hoặc ghi đè tin nhắn. Chế độ cố vấn cho phép gửi thư; chế độ chặn áp dụng một ngưỡng xác suất. Chính sách lỗi API được cấu hình riêng biệt. Các plugin bỏ qua wp_mail sẽ không được hỗ trợ; các thay đổi vận chuyển sau đó sẽ không được phân tích. Việc chặn không đưa tin nhắn vào hàng đợi.
Chế độ phân tích bị tắt theo mặc định. Cấu hình một mã thông báo khách hàng theo phạm vi, chạy kiểm tra kết nối không trả phí, xem xét bảng giá và đồng ý rõ ràng trước khi kích hoạt phân tích trả phí. Các hành động AI thủ công yêu cầu xác nhận riêng biệt.
Tải xuống WordPress ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Chạy các lệnh này từ thư mục WordPress với WP-CLI có sẵn, hoặc tải lên tệp ZIP đã tải xuống thông qua Plugins > Add New > Upload Plugin và kích hoạt nó. Mở Settings > SendRepute. Cấu hình và kích hoạt riêng từng trang web trên hệ thống multisite. Duy trì sự kết hợp WordPress/PHP được hỗ trợ; phiên bản tối thiểu không phải là khuyến nghị để chạy phần mềm đã hết vòng đời.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Cấu hình bảo mật
Tạo token khách hàng phía máy chủ với các phạm vi classify, account:read và catalog:read, ngày hết hạn và hạn mức chi tiêu. Nhập token vào cài đặt hoặc tải SENDREPUTE_API_TOKEN từ kho lưu trữ bí mật máy chủ của bạn như hướng dẫn. Các token được lưu trữ sử dụng mã hóa xác thực với WordPress salts và OpenSSL; hãy nhập lại chúng sau khi thay đổi salt. Chạy kiểm tra kết nối không trả phí, xem xét giá phân loại, sau đó kích hoạt phân tích tự động một cách rõ ràng. Thiết lập chế độ tư vấn/chặn, ngưỡng và chính sách fail-open/fail-closed độc lập.
// wp-config.php — optional server-secret alternative to settings storage.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Sử dụng có chủ đích
Hàm bên dưới sử dụng wp_mail thông thường và chỉ gửi khi ứng dụng của bạn gọi nó. Khi phân tích trả phí được kích hoạt, plugin sẽ phân tích tại pre_wp_mail và sau đó cho phép hoặc chặn phương thức vận chuyển hiện tại. Cung cấp người nhận được ủy quyền của riêng bạn; hãy thử nghiệm với một bộ tiếp nhận thư cục bộ (local mail sink) không chuyển tiếp trước. Kết quả sai (false) có nghĩa là trình gọi phải xử lý việc gửi bị từ chối—nó không được đưa vào hàng đợi.
// Call deliberately: this sends through your existing WordPress transport.
function sendrepute_reviewed_message($recipient) {
return wp_mail(
$recipient,
'Your requested account summary',
'Here is the account summary you requested.'
);
}
Các khả năng khác
Cài đặt cũng cung cấp các hành động viết lại bằng AI và tạo mẫu thủ công với xác nhận trả phí riêng biệt. Hiển thị giá cần vip:read; viết lại cần rewrite; tạo mẫu cần ai:generate, và tạo mẫu VIP yêu cầu tư cách thành viên VIP đang hoạt động. Kết quả là văn bản chỉ để sao chép đã được xử lý thoát ký tự (escaped): không bao giờ được tự động áp dụng hoặc gửi đi. Các token hiện có không tự động nhận được các phạm vi mới.
Kết quả, lỗi và giới hạn
Chế độ tư vấn cho phép phân phối; việc chặn so sánh xác suất thư rác hữu hạn với ngưỡng của bạn. API timeout và lỗi tuân theo chính sách lỗi riêng biệt, không phải nhãn spam. Các khóa cục bộ mờ đục ngăn chặn việc phân tích lặp lại trong 24 giờ; các kết quả mạng không xác định không được thử lại tự động. Bản thân việc gửi không được loại bỏ trùng lặp. Các kiểm tra cập nhật đã cài đặt bao gồm tệp ZIP 0.1.0 đã theo dõi được nâng cấp lên 0.2.0, việc từ chối/lưu nonce của quản trị viên và đường dẫn WooCommerce đã chọn. Một ma trận 40 kịch bản riêng biệt đã bao gồm cả thứ tự tải plugin với WP Mail SMTP và FluentSMTP, bao gồm To/Cc/Bcc, Reply-To, tiêu đề, tệp đính kèm, từ chối SMTP và kết quả chính sách. Các bộ giá trị chính xác này không chứng nhận cho các phiên bản CMS, plugin SMTP hoặc nhà cung cấp khác. Các hook bỏ qua wp_mail và các thay đổi vận chuyển sau đó nằm ngoài phạm vi bao phủ. Việc hủy kích hoạt sẽ giữ lại các cài đặt; việc gỡ cài đặt sẽ xóa thông tin xác thực ngay cả khi giữ lại các cài đặt đã bị vô hiệu hóa. Hãy tự xóa mã thông báo wp-config.
Bộ điều hợp email cho WooCommerce
0.2.0
Đã bao gồm trong cùng một tệp ZIP SendRepute 0.2.0 như plugin WordPress; không có tiện ích mở rộng hoặc bản tải xuống WooCommerce riêng biệt. Nó yêu cầu nền tảng WordPress 5.7+, PHP 7.4+ và OpenSSL của plugin. Bộ điều hợp đã được đánh giá mã nguồn dựa trên WooCommerce 10.4.3, không được chứng nhận trên mọi phiên bản WooCommerce hoặc tiện ích mở rộng thư.
Phân tích WooCommerce có công tắc quản trị riêng và các lựa chọn loại email tích hợp chính xác, tất cả đều tắt theo mặc định. Các điều khiển phân tích toàn cục và sự đồng ý trả phí cũng phải được bật. Các loại không được chọn và do tiện ích mở rộng định nghĩa sẽ bỏ qua phân tích. Mọi loại customer_* tích hợp được chọn đều được bảo vệ và chỉ mang tính cố vấn: nó có thể được phân tích nhưng không bao giờ bị chặn. Thư multipart được chọn sẽ thất bại trong phân loại trước bất kỳ yêu cầu trả phí nào; chế độ cố vấn hoặc mở khi lỗi giúp bảo toàn việc gửi thư, trong khi đóng khi lỗi chỉ chặn các thư không được bảo vệ.
Tải xuống tệp ZIP dùng chung cho WordPress và WooCommerce
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Đây là cùng một tệp ZIP có thể cài đặt được sử dụng bởi hướng dẫn WordPress. Cài đặt nó một lần; không cài đặt tiện ích bổ sung WooCommerce thứ hai. Kích hoạt SendRepute, sau đó mở Settings > SendRepute. Giữ cho WordPress, WooCommerce, PHP và bộ vận chuyển mail thực được hỗ trợ và cập nhật.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Cấu hình bảo mật
Sử dụng mã thông báo khách hàng có phạm vi từ các bí mật của máy chủ hoặc cài đặt WordPress được mã hóa. Đầu tiên, hãy cấu hình kiểm tra kết nối không trả phí dùng chung, xem lại giá hiện tại, sự đồng ý trả phí toàn cục, chế độ rủi ro, ngưỡng và chính sách khi có lỗi. Sau đó, bật riêng phân tích WooCommerce và chỉ chọn các loại email tích hợp sẵn mà bạn đã xem xét. Các loại do tiện ích mở rộng định nghĩa không bao giờ được chọn tự động.
// wp-config.php — keep the shared WordPress/WooCommerce token server-side.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Sử dụng có chủ đích
Tiếp tục gửi qua WooCommerce như bình thường. Bộ điều hợp bao bọc callback đã được WooCommerce chọn và bảo toàn các đối số gốc cũng như transport của nó; nó không cung cấp phương thức gửi mới. Nếu một bộ lọc khác làm thay đổi các đối số callback, mail thông thường được lồng trong callback đó, hoặc một callback tùy chỉnh không bao giờ gọi wp_mail, việc phân tích sẽ được bỏ qua một cách thận trọng thay vì rơi vào luồng trả phí (paid path) chung. Kiểm tra các loại thư không quan trọng đã chọn với một mail sink không chuyển tiếp.
Kết quả, lỗi và giới hạn
Thư đơn phần (single-part) được chọn sẽ tuân theo các chính sách WordPress advisory, threshold và failure dùng chung, ngoại trừ mọi loại customer_* đều được bảo vệ và chỉ mang tính chất tư vấn (advisory-only). Thư khách hàng được bảo vệ luôn tiếp tục sau khi có kết quả rủi ro cao, API failure hoặc nội dung không được hỗ trợ. WooCommerce xây dựng các bản thay thế đa phần (multipart) sau pre_wp_mail, vì vậy thư đa phần được chọn sẽ thất bại trước bất kỳ yêu cầu trả phí nào thay vì bị phân loại một phần; chỉ những thư không được bảo vệ đã chọn mới có thể bị từ chối bởi fail-closed. Ngữ cảnh callback được gỡ bỏ sau khi thành công, thất bại và các lần gửi lồng nhau.
Backend thư cho Drupal
0.1.0
Yêu cầu Drupal 10.3+ hoặc 11.x và PHP 8.1+. Cài đặt tệp ZIP như một module, chỉ cấp quyền administer sendrepute cho các quản trị viên đáng tin cậy, cấu hình tên hiển thị người gửi không phải địa chỉ được giới hạn, và chọn các tuyến thư module/key chính xác. Phiên bản 0.1.0 chỉ hỗ trợ Drupal core php_mail; đây là một backend thư, không phải là nhà cung cấp hoặc phương thức vận chuyển thay thế. Bằng chứng trang web đã cài đặt bao gồm các bản phát hành Drupal 10.6.17 và 11.4.7 chính xác với PHP 8.4.10.
Sự đồng ý trả phí và mọi tuyến đều được tắt theo mặc định. Mỗi tuyến chính xác sử dụng đại diện php_mail cố định của lõi, chế độ cố vấn hoặc chặn, một chính sách lỗi bảo lưu hoặc chặn độc lập, ngưỡng, và lựa chọn thư quan trọng có chủ đích. Thư tài khoản và bảo mật vẫn có thể gửi được trừ khi tuyến chính xác đó cho phép chặn các thư quan trọng một cách rõ ràng. Cùng một phiên bản php_mail sẽ định dạng và gửi một nội dung cuối cùng dạng scalar; đầu ra đa thành phần và có chứa tệp đính kèm không được hỗ trợ.
Tải xuống tệp ZIP cho Drupal
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Chạy từ thư mục gốc của dự án Drupal, hoặc tải lên tệp ZIP bằng trình cài đặt mô-đun của Drupal. Bản lưu trữ chứa một thư mục gốc mô-đun sendrepute phù hợp cho modules/contrib. Kích hoạt nó, chỉ cấp quyền administer sendrepute cho các quản trị viên đáng tin cậy và mở Configuration > System > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Cấu hình bảo mật
Chỉ lưu trữ một SENDREPUTE_API_TOKEN có phạm vi classify trong môi trường tiến trình web/PHP. Nó không bao giờ được chấp nhận bởi biểu mẫu hoặc xuất ra trong cấu hình Drupal. Trong biểu mẫu, nhập tên hiển thị người gửi bắt buộc tối đa 320 bytes không có địa chỉ, dấu ngoặc nhọn hoặc ký tự điều khiển. Thêm một dòng bảy trường cho mỗi tuyến chính xác như hướng dẫn; delegate phải là php_mail. Chọn chế độ advisory/block, chính sách failure_policy là preserve/block, ngưỡng threshold, và lựa chọn critical là yes/no. Bắt đầu với advisory, preserve và no.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Enter a non-address sender display name in Configuration > System > SendRepute.
# One exact route in Configuration > System > SendRepute:
# contact|page_mail|php_mail|advisory|preserve|0.90|no
3. Sử dụng có chủ đích
Tiếp tục gọi mail manager bình thường của Drupal. Đối với một tuyến đã được chọn (opted-in), sendrepute_mail sẽ gọi format() của core php_mail, phân tích nội dung scalar cuối cùng đó, áp dụng chính sách, và sau đó gọi mail() của cùng instance php_mail đã lưu đệm. Các ID delegate khác sẽ bị từ chối. Nó không sử dụng hook_mail_alter và không ghi lại tin nhắn.
Kết quả, lỗi và giới hạn
Một thành công đã được xác thực chỉ chặn ở mức hoặc cao hơn ngưỡng đã định cấu hình trong chế độ chặn. Kết quả phân loại lồng nhau đầy đủ và phản hồi thanh toán được xác thực trước khi spamProbability có thể ảnh hưởng đến việc phân phối. Các lỗi API, xác thực, số dư, giới hạn tốc độ, sai định dạng, multipart, chỉ báo tệp đính kèm và kích thước sẽ tuân theo failure_policy định tuyến độc lập, ngoại trừ thư quan trọng được bảo vệ vẫn tiếp tục. Ma trận 10.6.17/11.4.7 đã cài đặt bao gồm việc cài đặt và thay thế ZIP tại chỗ khi đang bật, đăng nhập quản trị viên thực, từ chối/lưu Form API CSRF, khám phá plugin, chọn tham gia lộ trình, phân loại tổng hợp, bảo tồn thư quan trọng và php_mail lõi thông qua một sink cục bộ. Kiểm tra nguồn cơ sở cũng bao gồm các kho lưu trữ 10.3.0 và 11.0.0 bất biến; không kết quả nào chứng nhận cho mọi bản vá sau đó hoặc trình gửi thư đóng góp. Tên hiển thị đã định cấu hình, tiêu đề không trống và thân bài có khung độ dài được gửi; địa chỉ, người nhận, tiêu đề, tham số và tệp đính kèm bị loại trừ. Tiêu đề bị giới hạn ở 998 byte và thân bài ở 256 KiB. Có một lần thử HTTPS đã xác minh, không chuyển hướng, thử lại hoặc xếp hàng.
Module mail cho PrestaShop
0.1.1
Phiên bản 0.1.1 hỗ trợ chính xác PrestaShop 9.0.0, 9.0.1, 9.0.2 và 9.0.3 với PHP 8.1–8.4. Tải lên tệp ZIP trong Modules > Module Manager, sau đó cấu hình phân loại thư SendRepute. Cả bốn bản phát hành classic được dựng sẵn chính thức đã vượt qua kiểm tra cài đặt riêng biệt, cấu hình quản trị viên đã xác thực và kiểm tra cập nhật ZIP; các triển khai Mail::send() không thay đổi của chúng cũng đã vượt qua ma trận thư thực tế ngoại tuyến. PrestaShop 8, 9.1+ và các bản vá 9.0 chưa được liệt kê sau này không được hỗ trợ.
Module, sự đồng ý trả phí/nội dung, và việc chọn mẫu chính xác đều bị tắt theo mặc định. Nó phân tích tiêu đề cuối cùng đã được render và mọi phần thân được hỗ trợ hiển thị mà không cần dựng lại Symfony message. Một tin nhắn chứa cả text/plain và text/html được gửi trong một yêu cầu phân loại có giới hạn: bản thay thế plain được làm trơ, HTML gốc được giữ nguyên, và dịch vụ phân tích từng bản thay thế theo loại một cách độc lập mà không nối chuỗi. Kết quả sử dụng mức rủi ro cao nhất với các cuộc kiểm tra nội dung đầy đủ, tạo ra một lượt phân loại trả phí và không bao giờ trả về điểm an toàn một phần. Chế độ cố vấn không bao giờ làm gián đoạn việc gửi. Việc chặn theo ngưỡng và đóng khi lỗi sẽ ném ra một ngoại lệ thực thi cả ExceptionInterface của Symfony Mailer và ModuleErrorInterface của PrestaShop; trên mọi bản phát hành được hỗ trợ, thử nghiệm đã cài đặt quan sát thấy Mail::send() trả về false mà không có việc phân phối SMTP nào. Chính sách lỗi độc lập với ngưỡng rủi ro.
Tải xuống tệp ZIP cho PrestaShop
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Tải xuống bản ZIP 0.1.1, sau đó sử dụng Modules > Module Manager > Upload a module và chọn tệp đó. Mở Configure cho SendRepute mail classification. Không bắt buộc cài đặt ngoài phạm vi chính xác PrestaShop 9.0.0–9.0.3: hành vi hủy và ký phụ thuộc vào các đường dẫn Mail::send() đã được kiểm tra.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Cấu hình bảo mật
Đặt SENDREPUTE_API_BASE thành nguồn HTTPS SendRepute chính thức được cung cấp cho mô-đun này và SENDREPUTE_API_TOKEN thành một token máy chủ có phạm vi trong môi trường PHP-FPM/server. Base phải là một nguồn HTTPS DNS công khai không có đường dẫn; các giá trị thô, thông tin đăng nhập, chuyển hướng và phản hồi DNS riêng tư đều bị từ chối. Chạy kiểm tra kết nối tài khoản/giá không trả phí, sau đó bật rõ ràng mô-đun, sự đồng ý trả phí/nội dung và tên mẫu chính xác. Chọn độc lập chế độ tư vấn/chặn, ngưỡng và chính sách lỗi mở/đóng.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Sử dụng có chủ đích
Tiếp tục sử dụng luồng Mail::send bình thường của PrestaShop. Hook ban đầu chỉ ghi nhớ một mẫu chính xác đã được chọn. Hook cuối cùng đọc chủ đề, thân văn bản và thân HTML đã được Symfony Email render mà không thay đổi người nhận, tiêu đề, tệp đính kèm hoặc quá trình vận chuyển. Đối với các thân thư kép, nó gửi văn bản thuần trơ và HTML gốc dưới dạng các phương án thay thế có kiểu trong một yêu cầu; việc chuẩn hóa dịch vụ độc lập ngăn chặn một đoạn nội dung tiêu thụ đoạn khác trong khi vẫn giữ nguyên các đích đến của hình ảnh và liên kết HTML hiển thị để kiểm tra. Một thân thư thuần túy duy nhất sẽ duy trì trên đường dẫn văn bản trơ hẹp, và một thân thư HTML duy nhất duy trì trên đường dẫn trích xuất DOM hẹp. Quá trình phân loại hoàn tất trước khi PrestaShop tạo một thông điệp riêng biệt được ký DKIM. Ma trận phiên bản được hỗ trợ đã xác minh cấu trúc multipart được phát ra cộng với mã băm thân thư DKIM và chữ ký RSA sau khi phân loại. Đường dẫn ký được ghim của PrestaShop loại bỏ Bcc khỏi các tiêu đề đã ký được chuẩn bị và làm mất người nhận SMTP ẩn đó; do đó, bằng chứng chữ ký hợp lệ không xác lập khả năng tương thích gửi Bcc. Không kết hợp DKIM và Bcc trên đường dẫn được hỗ trợ này. Các nguồn hiển thị không được hỗ trợ, ngữ nghĩa hoạt động, HTML quoted-printable hoặc base64 không rõ ràng và nội dung tổng hợp quá kích thước sẽ tuân theo chính sách lỗi đã định cấu hình trước khi thanh toán. Để các mẫu quan trọng ở trạng thái không được chọn trừ khi được phê duyệt có chủ đích.
Kết quả, lỗi và giới hạn
Trình phân loại chấp nhận một thân thư text/plain, một thân thư text/html hoặc cả hai dưới dạng các phương án hiển thị thay thế được phân tích độc lập. Văn bản gốc (literal text), thực thể (entity), nội dung ẩn và nội dung kiểu (style) trong một phương án được chấp nhận không thể tiêu thụ hoặc che giấu phương án thay thế sau đó; HTML quoted-printable hoặc base64 không rõ ràng sẽ bị từ chối trước khi thanh toán. Bất kỳ phương án thay thế nào được chấp nhận đều có thể xác định kết quả rủi ro cao nhất, trong khi content audits bao quát mọi phương án thay thế; classification chỉ được tính phí một lần sau khi toàn bộ đầu vào có giới hạn được chấp nhận. Thân thư cũ (legacy body) bắt buộc sao chép chính xác phương án văn bản thuần trơ cho một thông điệp kép, và bản sao đó cùng cả hai phương án thay thế có kiểu chia sẻ chính xác ngân sách yêu cầu 524288-byte. Recipients, attachments và các tài nguyên nhúng bị loại trừ, và thông điệp transport trước khi ký gốc được bảo toàn. Bản mẫu thư thực (real-mail fixture) kiểm tra riêng biệt tính toàn vẹn của MIME/chữ ký và người nhận SMTP thực tế: chữ ký DKIM vẫn hợp lệ sau classification, nhưng đường dẫn đã ký thượng nguồn được kiểm tra không bảo toàn người nhận Bcc. Một classification được xác thực sẽ lưu trữ một bản tóm tắt tư vấn mới nhất có giới hạn. Chế độ chặn (block mode) chỉ ném lỗi tại hoặc trên ngưỡng threshold; ngoại lệ giao diện kép (dual-interface exception) tồn tại qua quá trình điều phối hook và tạo ra giá trị false trước transport trên cả bốn bản phát hành đã cài đặt. Nội dung không được hỗ trợ, lỗi API và lỗi xác thực tuân theo trạng thái mở/đóng một cách độc lập. Một lần thử HTTPS sử dụng DNS công cộng được ghim, TLS đã xác minh, thời gian chờ hữu hạn, giới hạn phản hồi 256 KiB, không chuyển hướng và không thử lại. Việc chặn dựa vào việc bắt ngoại lệ PrestaShop Mail::send() đã được kiểm tra, không phải giá trị trả về của hook cuối cùng.
Trình điều hợp Symfony Mailer
0.1.1
Yêu cầu PHP 8.1+ và chỉ nhắm mục tiêu Symfony Mailer 6.4 hoặc 7.4; các bản phát hành đã xác minh chính xác là 6.4.46 và 7.4.19. Không công bố khả năng tương thích với Symfony 8.1 hoặc các phiên bản chưa được kiểm thử. Cài đặt tệp ZIP mã nguồn cục bộ thông qua kho lưu trữ đường dẫn Composer; gói này không được đăng trên Packagist.
Bundle và sự đồng ý trả phí được tắt theo mặc định, và chỉ những thư có tiêu đề chọn tham gia được cấu hình chính xác mới đủ điều kiện. Chính sách điểm số cố vấn hoặc chặn độc lập với chính sách lỗi cho phép hoặc chặn. Việc phân loại chạy trên MessageEvent trước khi gửi chính thức; hành động từ chối sử dụng MessageEvent::reject(). Các sự kiện sao chép trong hàng đợi sẽ được bỏ qua để sự kiện vận chuyển của worker là điểm phân loại trả phí duy nhất.
Tải xuống mã nguồn Symfony ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén tệp ZIP đã tải xuống vào một thư mục packages được giữ lại, đăng ký thư mục đó dưới dạng kho lưu trữ đường dẫn Composer, require đúng gói 0.1.1, và đăng ký SendRepute\Symfony\SendReputeBundle nếu Flex không thực hiện. Bản lưu trữ nguồn là bản cục bộ và chưa được công bố.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-symfony.zip -o packages/sendrepute-symfony.zip
unzip packages/sendrepute-symfony.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-symfony
composer require sendrepute/symfony:0.1.1
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Cấu hình bảo mật
Phân giải SENDREPUTE_API_TOKEN từ các bí mật máy chủ. Giữ enabled và paid_analysis_consent ở giá trị false trong khi xem xét mức giá hiện tại. Chế độ, threshold và failure_policy là độc lập. Endpoint được cố định với HTTPS đã xác minh với thời hạn ràng buộc, không có chuyển hướng hoặc thử lại, và giới hạn phản hồi là 1 MiB.
send_repute:
enabled: false
paid_analysis_consent: false
api_token: '%env(SENDREPUTE_API_TOKEN)%'
mode: advisory
failure_policy: allow
spam_probability_threshold: 0.8
3. Sử dụng có chủ đích
Chỉ thêm tiêu đề chấp thuận (opt-in header) chính xác vào các đối tượng Email đã được kiểm duyệt và không quan trọng, sau đó tiếp tục qua Mailer bình thường. Thông điệp, phong bì (envelope), phương thức vận chuyển (transport) và tiêu đề không bị ghi đè. Đối với việc phân phối qua Messenger, hãy cấu hình bundle trong workers: các sự kiện clone của producer được cố ý không phân loại.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Kết quả, lỗi và giới hạn
Chỉ hỗ trợ chính xác một nội dung văn bản hoặc HTML trong bộ nhớ. Các trường hợp như các lựa chọn thay thế hỗn hợp, DataParts dạng văn bản, stream hoặc đường dẫn, dấu ngoặc nhọn CSS, mã đánh dấu, cú pháp quoted-printable, tiêu đề base64 hoặc toàn bộ thân thư base64 sẽ thất bại trước khi thanh toán và tuân theo chính sách lỗi; nội dung thông thường không chứa dấu ngoặc nhọn sẽ không bị thay đổi. Mọi trường bắt buộc trong phản hồi lồng nhau và các nhánh audit tùy chọn đều được xác thực, các thuộc tính không xác định sẽ bị từ chối. Chế độ tư vấn không bao giờ chặn dựa trên điểm số; việc chặn sẽ từ chối tại ngưỡng thông qua sự kiện vận chuyển thực tế.
Adapter Rails Action Mailer
0.1.0
Yêu cầu Ruby 3.2+ và đã được xác minh giới hạn với các phiên bản thực tế Action Mailer 7.1.6 và Mail 2.9.1; đường dẫn callback cũng đã được ghi nhận trên Action Mailer 7.2.3.2. Đây không phải là chứng nhận cho mọi bản phát hành Rails 7.x được phép. Cài đặt mã nguồn ZIP cục bộ thông qua Bundler; không cam kết về việc phát hành trên RubyGems.
Mặc định cả hai cổng trả phí toàn cục đều tắt, và mỗi mailer action phải gọi sendrepute_paid_preflight! một cách tường minh. Hành vi điểm số cố vấn/chặn và hành vi lỗi bảo lưu/chặn hoạt động độc lập. Các tuyến đường đặt lại mật khẩu, MFA, đăng nhập, xác minh, thanh toán và bảo mật nên được giữ ở trạng thái không chọn. Mọi tin nhắn đa thành phần và nội dung CSS mơ hồ, có dạng quoted-printable hoặc base64 đều bị từ chối trước khi thanh toán; một nội dung văn bản hoặc HTML body đã giải mã được chấp nhận sẽ được phân tích mà không làm thay đổi tin nhắn gốc hoặc transport.
Tải xuống mã nguồn Rails dưới dạng ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén tệp ZIP chính xác vào vendor/sendrepute-rails, thêm mục đường dẫn cục bộ vào Gemfile, chạy Bundler trong môi trường được kiểm soát của bạn và bao gồm SendRepute::Rails::Mailer vào ApplicationMailer. Đây không phải là một bản cài đặt từ RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Cấu hình bảo mật
Giữ enabled và paid_consent ở mức false cho đến khi các tuyến đường và mức giá hiện tại được xem xét kỹ lưỡng. Đọc mã token từ Rails credentials hoặc một bí mật máy chủ khác. Cấu hình advisory/block, preserve/block và threshold một cách độc lập; các hàm gọi lại on_result và on_error tuyệt đối không được ghi log nội dung tin nhắn, dữ liệu xác thực hoặc phản hồi đầy đủ.
SendRepute::Rails.configure do |config|
config.enabled = false
config.paid_consent = false
config.token = Rails.application.credentials.dig(:sendrepute, :api_token)
config.mode = :advisory
config.failure_policy = :preserve
config.score_threshold = 0.8
end
3. Sử dụng có chủ đích
Chỉ gọi sendrepute_paid_preflight! bên trong mỗi action mailer không trọng yếu đã được lựa chọn có chủ đích. Các action thông thường sẽ bỏ qua bước phân loại. Hook có phí sử dụng tuyến before_deliver của Action Mailer; không có tính năng tự động tham gia (auto-opt-in) toàn cục và adapter không ghi đè Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Kết quả, lỗi và giới hạn
Chỉ hỗ trợ một body được giải mã dưới dạng text/plain hoặc text/html. Mọi đầu vào normalizer multipart hoặc không rõ ràng đều sẽ thất bại trước khi thanh toán và tuân theo failure_policy. Phản hồi lồng nhau đã được định kiểu đầy đủ chỉ có thể chặn ở chế độ block mode khi đạt hoặc vượt ngưỡng; chế độ advisory sẽ bảo lưu mọi điểm số. Các lệnh gọi lại kết quả và lỗi sẽ nhận dữ liệu an toàn bất biến, các ngoại lệ từ callback hoặc lệnh throw(:abort) được bắt cục bộ để không làm dừng advisory hoặc bảo lưu việc phân phối. Endpoint cố định từ chối các lệnh chuyển hướng cũng như thử lại và sử dụng một tổng hạn định có giới hạn. Các bài kiểm tra thực tế trên Action Mailer 7.1.6 đã vượt qua: 19 lượt chạy và 59 xác nhận; không có yêu cầu thanh toán hoặc việc phân phối thực tế nào xảy ra.
Bộ điều hợp JavaMailSender dành cho Spring
0.1.1
Yêu cầu Java 17+ và hướng tới Spring Framework 6.2.x JavaMailSender; xác minh phụ thuộc chính xác đã sử dụng Spring Framework 6.2.19. Không có tuyên bố về khả năng tương thích với Spring Boot 4 hoặc các phiên bản framework rộng hơn. Xây dựng mã nguồn cục bộ ZIP bằng Maven; nó không được xuất bản lên Maven Central hoặc registry khác.
Trình trang trí (decorator), sự đồng ý trả phí, chế độ tư vấn và các giá trị mặc định cho phép khi có lỗi được quy định rõ ràng. Chỉ sendWithSendRepute(...) thực hiện phân tích trả phí trước khi gửi; mọi quá tải send(...) thông thường sẽ bỏ qua phân loại và ủy quyền không thay đổi. Sử dụng send thông thường cho các thư quan trọng trừ khi lần gửi riêng lẻ đó được chọn một cách có chủ đích. Các lựa chọn thay thế MIME được hỗ trợ hiển thị sẽ được đóng khung tĩnh cùng nhau; các nội dung không được hỗ trợ, lồng nhau, đã ký, được mã hóa hoặc mơ hồ sẽ thất bại trước khi thanh toán.
Tải xuống mã nguồn Spring Java ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén mã nguồn ZIP 0.1.1, chạy mvn verify, và chỉ cài đặt vào kho lưu trữ Maven cục bộ (local Maven repository) do bạn kiểm soát. Ứng dụng sử dụng sẽ cung cấp JavaMailSender hiện có và triển khai mail runtime của nó. Việc xác minh phụ thuộc chính xác đã sử dụng Java 17 bytecode, Spring Framework 6.2.19 và các phiên bản được ghi tài liệu trong tệp README đính kèm.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-spring-mail.zip
unzip sendrepute-spring-mail.zip
cd sendrepute-spring-mail-0.1.1
mvn verify
mvn install
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Cấu hình bảo mật
Cấu trúc SendReputeConfiguration từ một mã thông báo phía máy chủ và các chuyển mạch rõ ràng. Giữ cho enabled và paidAnalysisConsent là false cho đến khi giá cả và các lệnh gọi được chọn lọc được xem xét lại. Chính sách tư vấn/chặn, ngưỡng và chính sách lỗi cho phép/chặn là độc lập với nhau. Điểm cuối được cố định với HTTPS đã xác minh, không có chuyển hướng hoặc thử lại.
var settings = new SendReputeConfiguration(
token, false, false,
SendReputeConfiguration.Mode.ADVISORY,
SendReputeConfiguration.FailurePolicy.ALLOW,
0.80, Duration.ofSeconds(3), Duration.ofSeconds(10));
var reviewedSender = new SendReputeJavaMailSender(existingSender, settings);
3. Sử dụng có chủ đích
Chỉ gọi sendWithSendRepute(...) cho một SimpleMailMessage, MimeMessage hoặc MimeMessagePreparator riêng lẻ cần thực hiện phân tích. Các nạp chồng (overloads) đơn lẻ và varargs đều được hỗ trợ. Mọi nạp chồng send(...) thông thường sẽ bỏ qua quá trình phân loại. Các preparator sẽ kết xuất một lần và MIME gốc đã chuẩn bị sẽ được ủy quyền sau khi chính sách cho phép.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Kết quả, lỗi và giới hạn
Tất cả các phần plain và HTML được hỗ trợ hiển thị đều được phân tích; người nhận và tệp đính kèm bị loại trừ. Quá trình duyệt bị giới hạn ở 16 cấp độ, 256 phần và 524,288 byte UTF-8 được hiển thị. Các nội dung binary inline bị bỏ qua sẽ không bao giờ được hiện thực hóa; các nguồn hiển thị lazy không xác định hoặc không giới hạn sẽ thất bại trước khi một luồng được mở hoặc yêu cầu thanh toán được thực hiện, và các lần đọc nguồn được hỗ trợ đều có giới hạn. Cấu trúc thực thể số (numeric-entity framing) giúp giữ các phân đoạn trơ thông qua thứ tự server normalizer đã kiểm tra. Toàn bộ các lô varargs được chuẩn bị và chuẩn hóa trước yêu cầu thanh toán đầu tiên, và việc kiểm tra không tạo ra các tiêu đề Jakarta Mail. Yêu cầu một phản hồi lồng nhau khớp chính xác theo đệ quy.
Bộ điều hợp thư Magento Open Source
0.1.1
Chỉ hỗ trợ Magento Open Source 2.4.7-p5 và 2.4.7-p6 với các mã nguồn mail-interface bất biến chính xác đã được xem xét. Các fixture định kiểu ngoại tuyến đã vượt qua thử nghiệm, nhưng chưa thực hiện cài đặt Magento đầy đủ; không có bản phát hành Magento hoặc Adobe Commerce nào khác được chứng nhận. Cài đặt tệp ZIP cục bộ thông qua kho lưu trữ đường dẫn Composer; đây không phải là một gói Adobe Marketplace.
Mô-đun, sự đồng ý trả phí và danh sách định tuyến mặc định đều ở trạng thái tắt. Mỗi mã định danh mẫu yêu cầu hai phê duyệt chính xác độc lập; mức độ quan trọng không bao giờ được suy diễn từ tên của nó. Plugin aroundSendMessage phân tích tại ranh giới vận chuyển cuối cùng mà không xây dựng lại thư. Chính sách ngưỡng tư vấn/chặn và chính sách lỗi bảo lưu/chặn là độc lập; việc chặn sẽ tạo ra một Magento MailException hiển thị. Nhiều phần MIME được hiển thị và nội dung không rõ ràng sẽ thất bại trước khi thanh toán.
Tải về tệp ZIP mã nguồn Magento
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén tệp ZIP vào một thư mục gói được lưu giữ, đăng ký thư mục gốc SendRepute_MailAdapter của nó làm kho lưu trữ đường dẫn Composer, require phiên bản 0.1.1, sau đó sử dụng quy trình kích hoạt module và nâng cấp thiết lập thông thường của Magento. Không trình bày kho lưu trữ cục bộ này như một gói trên Adobe Marketplace.
mkdir -p packages/sendrepute-magento
curl -fLO https://www.sendrepute.com/downloads/sendrepute-magento.zip
unzip sendrepute-magento.zip -d packages/sendrepute-magento
composer config repositories.sendrepute path ./packages/sendrepute-magento/SendRepute_MailAdapter
composer require sendrepute/magento-mail-adapter:0.1.1
bin/magento module:enable SendRepute_MailAdapter
bin/magento setup:upgrade
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Cấu hình bảo mật
Chỉ thiết lập SENDREPUTE_API_TOKEN trong môi trường máy chủ PHP-FPM và CLI. Trong Stores > Configuration > Services > SendRepute, ban đầu hãy tắt mô-đun và sự đồng ý trả phí. Thêm chính xác mọi định danh mẫu vào cả hai danh sách phê duyệt định tuyến độc lập; tên, bao gồm cả tên số, không bao giờ suy ra mức độ quan trọng. Cấu hình hành vi tư vấn/chặn, ngưỡng và hành vi lỗi bảo lưu/chặn riêng biệt.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Sử dụng có chủ đích
Tiếp tục sử dụng quy trình template và transport thông thường của Magento. Mối tương quan định tuyến ghi lại chính xác định danh và cửa hàng được chọn thông qua TransportBuilder, trong khi plugin aroundSendMessage cuối cùng sẽ đọc các giao diện email và MIME chính thức trước khi gọi cùng một transport. Trạng thái Builder được xóa trong finally, và các mối tương quan builder/message sử dụng các mục WeakMap có khóa là đối tượng, do đó một transport đã dựng nhưng bị bỏ rơi không thể để lại ủy quyền ID đối tượng số có thể tái sử dụng. Adapter không cung cấp phương thức send mới hoặc làm thay đổi message.
Kết quả, lỗi và giới hạn
Chỉ chấp nhận một phần MIME hiển thị được hỗ trợ; các tệp đính kèm được bảo toàn nhưng không được đưa vào phân tích. Nhiều phần hiển thị, mã hóa truyền tải hoặc bộ ký tự không được hỗ trợ, luồng dữ liệu, MIME lồng nhau và văn bản chuẩn hóa không rõ ràng sẽ thất bại trước khi thanh toán. Một yêu cầu HTTPS đã xác minh có thời hạn và kích thước phản hồi bị giới hạn, không có tính năng thử lại hoặc chuyển hướng. Kết quả lồng nhau hợp lệ có thể bị chặn ở ngưỡng; cấu hình fail-block sẽ kích hoạt Magento MailException.
Bộ điều hợp .NET MailKit
0.1.0
Yêu cầu .NET 8 và bằng chứng phụ thuộc chính xác cho MailKit/MimeKit 4.18.0. Đây là một trình bao bọc (wrapper) rõ ràng xung quanh một IMailTransport do ứng dụng sở hữu, không phải là hook toàn cục, SMTP client hay phương thức vận chuyển thay thế. Hãy xây dựng hoặc tham chiếu mã nguồn ZIP cục bộ; không có công bố NuGet nào được xác nhận.
Bộ điều hợp (adapter) và paid_consent mặc định tắt; các tùy chọn tư vấn và preserve-send là các mặc định độc lập. Các lệnh gọi AnalyzeAsync, AnalyzeThenSend hoặc AnalyzeThenSendAsync là tường minh. Email bảo mật/tài khoản quan trọng cần một danh mục và sự đồng ý riêng cho mỗi lần gọi. Mọi nội dung thay thế text/plain hoặc text/html được hỗ trợ sẽ được đóng khung tĩnh vào một yêu cầu giới hạn; các nội dung không được hỗ trợ, lồng nhau, có chữ ký hoặc được mã hóa sẽ thất bại trước khi thanh toán. MimeMessage gốc và token hủy bỏ chỉ đến được existingTransport sau khi chính sách cho phép.
Tải xuống mã nguồn .NET MailKit ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén tệp ZIP nguồn và tham chiếu src/SendRepute.MailKit/SendRepute.MailKit.csproj từ dự án .NET 8 đang sử dụng. Việc khôi phục sẽ thu được MailKit/MimeKit 4.18.0. Gói nguồn này là cục bộ và chưa được xuất bản; đây không phải là một bản cài đặt NuGet.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mailkit.zip
unzip sendrepute-mailkit.zip
dotnet add reference ./sendrepute-mailkit-0.1.0/src/SendRepute.MailKit/SendRepute.MailKit.csproj
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Cấu hình bảo mật
Bọc IMailTransport hiện có của ứng dụng bằng SendReputeMailAdapter. Đọc API token từ cấu hình máy chủ và giữ cho Enabled và PaidAnalysisConsent ở trạng thái false cho đến khi được xem xét. Ngưỡng advisory/block và các cài đặt preserve/block failure là độc lập với nhau. Điểm cuối, ngưỡng TLS tối thiểu, hành vi một lần thử, thời hạn và giới hạn 1 MiB là cố định.
var options = new SendReputeOptions {
Enabled = false,
PaidAnalysisConsent = false,
ApiToken = configuration["SENDREPUTE_API_KEY"]!,
Enforcement = EnforcementPolicy.Advisory,
OnFailure = FailurePolicy.PreserveSend,
SpamProbabilityThreshold = 0.80
};
var adapter = new SendReputeMailAdapter(existingTransport, new SendReputeClient(options), options);
3. Sử dụng có chủ đích
Gọi AnalyzeAsync để chỉ phân tích, hoặc AnalyzeThenSend và AnalyzeThenSendAsync để thực hiện hành vi trước khi gửi một cách rõ ràng. Không có đường dẫn thư thông thường hoặc toàn cục nào bị chặn. Truyền sự đồng ý trả phí và danh mục thư trên mỗi thao tác được chọn; thư bảo mật/tài khoản quan trọng yêu cầu cài đặt sự đồng ý quan trọng riêng biệt.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Kết quả, lỗi và giới hạn
Việc giải mã MimeKit thực tế sẽ thu thập mọi phương án plain text và HTML được hiển thị và hỗ trợ vào một khung tĩnh, đồng thời loại trừ người nhận và tệp đính kèm. Khung ngoài không phải base64 và các thực thể được giải mã muộn sẽ vô hiệu hóa các dấu ngoặc nhọn CSS, văn bản quoted-printable, tiêu đề base64, toàn bộ nội dung base64 và mã đánh dấu trước khi chuẩn hóa dịch vụ. Nội dung hiển thị không được hỗ trợ, lồng nhau, được ký hoặc mã hóa sẽ thất bại trước khi thanh toán. Mọi trường phản hồi bắt buộc đều được định kiểu; trường flaggedTermCount tùy chọn phải là một số nguyên không âm và contentAudit tùy chọn được xác thực đầy đủ và đệ quy so với hợp đồng công khai. Đối tượng MimeMessage gốc chính xác và mã thông báo hủy chỉ đến được phương thức vận chuyển được cung cấp khi các chính sách điểm số và lỗi độc lập cho phép.
Phân tích bản nháp thủ công Zapier
0.2.0
Công thức Zapier thủ công để hiển thị phân tích trả phí cho chính xác ba chuỗi bản nháp được chủ sở hữu lựa chọn. Đây không phải là ứng dụng SendRepute trên Zapier, danh sách marketplace, thành phần nhập, pre-send adapter, trình gửi, tuyến allow/block hoặc trình phân loại toàn bộ tin nhắn. Zapier Webhooks sử dụng một proxy HTTPS có giới hạn do chủ sở hữu vận hành vì SENDREPUTE_API_TOKEN không được phép nhập vào Zap.
Hai hằng số thời gian biên dịch (compile-time constants) mặc định là false trước HTTP. Zap chỉ ánh xạ tên hiển thị của người gửi, tiêu đề và nội dung, đăng JSON lên thiết kế owner-proxy đi kèm, xác thực hoàn toàn phản hồi lồng nhau, sau đó hiển thị các trường tư vấn và thanh toán trong một bước xem xét riêng tư. Nó không được thêm người gửi, thực thi Paths, Autoreplay hoặc tuyến failure-preserve; các bước Code hoặc Webhook bị lỗi sẽ dừng lại.
Tải xuống tệp ZIP công thức cho Zapier và Make
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Tải xuống và giải nén mã nguồn công thức 0.2.0 dùng chung. Đọc hướng dẫn Zapier đi kèm và chỉ triển khai proxy Node loopback đi kèm phía sau một HTTPS reverse proxy do chủ sở hữu quản lý. Gói này không tự triển khai nó. Không có ứng dụng SendRepute Zapier hoặc tạo tác Zap có thể nhập nào.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Cấu hình bảo mật
Giữ Zap ở trạng thái tắt. Trong mã nguồn preflight chính xác, cả ENABLED và PAID_CONSENT đều ở trạng thái false cho đến khi việc sử dụng trả phí được xem xét. Proxy của chủ sở hữu lưu trữ SENDREPUTE_API_TOKEN; Zap chỉ nhận được một thông tin xác thực có thể thu hồi riêng biệt từ SENDREPUTE_PROXY_CREDENTIALS. Trình chỉnh sửa và lịch sử tác vụ có thể làm lộ thông tin này, vì vậy hãy hạn chế, xoay vòng và thu hồi nó. Cấu hình giới hạn token-bucket và giới hạn đồng thời trên mỗi thông tin xác thực, giới hạn kết nối/đồng thời toàn cầu, ngân sách cuộc gọi trả phí hàng ngày do chủ sở hữu thiết lập cố định, giới hạn chi tiêu thượng nguồn nghiêm ngặt và các kiểm soát kích thước/tỷ lệ/thời hạn TLS-terminator tương ứng. Không bật Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Sử dụng có chủ đích
Xây dựng các bước theo cách thủ công: trigger nháp; mã preflight chỉ ánh xạ sender, subject và body; Webhooks POST với các hàng JSON tới proxy của chủ sở hữu; mã response-validation; hiển thị đánh giá riêng tư. Tuyệt đối không nội suy thủ công JSON thô. Chỉ hiển thị requestId, model, label, spamProbability và thông tin thanh toán; không thêm hành động mail hoặc quyết định Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Kết quả, lỗi và giới hạn
Công thức chỉ phân tích ba chuỗi đã được ánh xạ; MIME không được ánh xạ, các phương án HTML thay thế, tệp đính kèm và nội dung gửi đi cuối cùng vẫn không được phân tích. Bước preflight thận trọng sẽ từ chối các tác nhân kích hoạt bộ chuẩn hóa đã biết nhưng không chứng minh được mức độ bao phủ toàn bộ tin nhắn. Giới hạn tỷ lệ, số lượng đồng thời và ngân sách hàng ngày của Proxy sẽ từ chối trước khi đến thượng nguồn, và việc đặt trước ngân sách sẽ tồn tại trước nỗ lực trả phí; hãy chạy một quy trình proxy cho mỗi tệp ngân sách. Proxy thực hiện một nỗ lực HTTPS cố định có giới hạn. Bất kỳ phản hồi chính xác nào không phải 200 hoặc không đầy đủ sẽ throw và dừng lại; không có kết quả preserve, Resume hoặc thay thế.
Phân tích bản nháp thủ công Make
0.2.0
Hướng dẫn kịch bản Make thủ công để hiển thị phân tích trả phí cho đúng ba chuỗi bản nháp được chọn. Đây không phải là blueprint, ứng dụng SendRepute được phê duyệt, trình gửi thư, tuyến thực thi hay xác nhận về MIME chưa được ánh xạ, HTML, tệp đính kèm hoặc nội dung gửi đi cuối cùng. Bearer token chỉ thuộc về chuỗi khóa bảo mật của Make HTTP.
Các giá trị boolean persisted enabled và paidConsent mặc định là false và một bộ lọc AND sẽ dừng trước HTTP. JSON được tạo bởi mô-đun JSON của Make và được gửi một lần bởi mô-đun HTTP với tính năng chuyển hướng và thử lại bị vô hiệu hóa. Bộ lọc phản hồi chỉ là lớp bảo vệ hiển thị, không phải là xác thực đầy đủ hoặc quyền gửi. Các lỗi HTTP sử dụng Break, không bao giờ dùng Resume hoặc thay thế đầu ra.
Tải xuống tệp ZIP kịch bản của Zapier và Make
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Tải xuống và giải nén mã nguồn bản công thức (recipe) 0.2.0 dùng chung, sau đó làm theo hướng dẫn Make đi kèm để xây dựng các mô-đun native hiện tại một cách thủ công. Không có blueprint, ứng dụng marketplace hoặc định dạng nhập (import) nào được xác nhận. Tắt tính năng lập lịch kịch bản (scenario scheduling) khi đang thử nghiệm với một điểm cuối giả lập (mock endpoint).
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Cấu hình bảo mật
Tạo các biến Tools boolean cố định enabled=false và paidConsent=false, tiếp theo là một bộ lọc AND yêu cầu cả hai phải là true. Sử dụng JSON > Create JSON cho chính xác các trường sender, subject và body. Chỉ lưu trữ mã thông báo (bearer token) SendRepute trong chuỗi khóa bảo mật (secure keychain) của ứng dụng HTTP; các kịch bản (scenarios) được xuất ra phải không chứa thông tin xác thực.
Tools variables: enabled = false; paidConsent = false
Filter: enabled = true AND paidConsent = true
HTTP credential: secure keychain; Authorization header
Body type: Raw; Content type: application/json; map serialized JSON
Follow redirect: No; Timeout: 10 seconds; no retry
Response filter: Minimal display guard
3. Sử dụng có chủ đích
Cấu hình một HTTP POST tới URL classify cố định. Chọn Body type Raw và control application/json content-type mà không thêm header free-text xung đột, sau đó map output đã được serialize từ JSON > Create JSON. Kích hoạt parsed response, vô hiệu hóa chuyển hướng, đặt timeout 10 giây và không thêm repeater hoặc automatic retry. Yêu cầu giới hạn phản hồi 1 MiB của module; nếu không có sẵn, hãy sử dụng một bounded proxy do chủ sở hữu kiểm soát để thay thế. Chỉ thêm một bản hiển thị đánh giá riêng tư sau Minimal display guard—tuyệt đối không bao giờ thêm bộ định tuyến sender hoặc allow/block.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Kết quả, lỗi và giới hạn
Chỉ các chuỗi đã được ánh xạ mới được phân tích; việc chuẩn hóa không đồng nhất với email gốc hoặc email gửi đi. Bộ lọc phản hồi chỉ kiểm tra trạng thái và sự hiện diện của kết quả cốt lõi/thanh toán và rõ ràng không phải là xác thực hoặc thực thi lược đồ đầy đủ. Các lỗi HTTP sử dụng Break để các hành động sau đó không chạy; không bao giờ sử dụng Resume, đầu ra giả mạo hoặc lộ trình failure-preserve.
Node.js SDK
0.1.1
SDK dành riêng cho máy chủ cho Node.js 18.17+. Cài đặt @sendrepute/node từ npm hoặc sử dụng tệp tarball có thể tải xuống. Bộ điều hợp Nodemailer tùy chọn giúp bảo toàn phương thức vận chuyển hiện có của bạn. Thiết lập khóa API theo phạm vi và API base URL rõ ràng trong môi trường máy chủ của bạn, tuyệt đối không đặt trong mã trình duyệt.
Đăng ký createSendReputePlugin tại giai đoạn stream chỉ sau khi xem xét giá cả và cố ý bật sự đồng ý phân tích trả phí. Chế độ tư vấn báo cáo các phát hiện mà không chặn việc gửi thư. Chế độ chặn thực thi spamProbabilityThreshold; onApiFailure chọn allow hoặc block, trong khi việc từ chối do thay đổi giá luôn chặn việc gửi thư. Phân loại là một thao tác API trả phí.
Tải xuống Node.js tarball
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
Xem gói npm đã xác minh
1. Cài đặt
Gói npm đã xác minh là @sendrepute/node phiên bản 0.1.1; hãy ghim các bản cài đặt registry vào @sendrepute/node@0.1.1. Bản tarball trên website và kho lưu trữ công khai được ghim cung cấp mã nguồn và bản dựng của bản phát hành 0.1.1. Nodemailer là tùy chọn và chỉ cần thiết cho bộ điều hợp truyền tải. SDK hỗ trợ các yêu cầu API khách hàng được định kiểu cho tài khoản, danh mục, phân loại, AI và các trình tạo. Sử dụng nó trong máy chủ Node.js, tuyệt đối không dùng trong trình đóng gói trình duyệt.
npm install @sendrepute/node nodemailer
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Cấu hình bảo mật
Truyền SENDREPUTE_API_KEY từ kho lưu trữ bí mật máy chủ của bạn và thiết lập URL cơ sở rõ ràng bên dưới cho API khách hàng được lưu trữ. Không dán các bí mật vào lệnh, tệp nguồn hoặc nhật ký. Chỉ cấp các phạm vi mà hoạt động của bạn yêu cầu. Thiết lập sử dụng phương thức vận chuyển kết xuất cục bộ, không phải SMTP; maxRetries được đặt thành 0 ở đây để đảm bảo các lần thử trả phí là có chủ ý.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Thiết lập Nodemailer
Ví dụ này cấu hình một phương thức vận chuyển kết xuất cục bộ và không gọi sendMail. Việc gửi qua plugin đã cấu hình sẽ thực hiện phân tích trả phí. Chỉ thay thế phương thức vận chuyển cục bộ bằng phương thức vận chuyển SMTP hiện tại của bạn khi đã sẵn sàng.
import nodemailer from "nodemailer";
import { SendReputeClient } from "@sendrepute/node";
import { createSendReputePlugin } from "@sendrepute/node/nodemailer";
const apiKey = process.env.SENDREPUTE_API_KEY;
const baseUrl = process.env.SENDREPUTE_API_BASE_URL;
if (!apiKey || !baseUrl) {
throw new Error("SENDREPUTE_API_KEY and SENDREPUTE_API_BASE_URL are required");
}
const client = new SendReputeClient({ apiKey, baseUrl, maxRetries: 0 });
const transporter = nodemailer.createTransport({
streamTransport: true,
buffer: true,
newline: "unix",
});
transporter.use("stream", createSendReputePlugin({
client,
policy: {
paidAnalysisConsent: true,
mode: "blocking",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
}));
3. Sử dụng có chủ đích
Sử dụng client từ thiết lập ở trên. Đọc thông tin tài khoản và giá hiện tại trước khi hiển thị hành động đồng ý. Chỉ gọi classifyAfterConsent từ một hành động máy chủ đã xác thực sau khi xác nhận; nó trả về phản hồi phân loại và thanh toán có định kiểu. Gửi qua plugin Nodemailer đã cấu hình cũng là một hành động phân loại trả phí. Bộ điều hợp yêu cầu paidAnalysisConsent: true và từ chối mọi giá trị khác trước khi đăng ký; chỉ đặt giá trị này sau khi được ủy quyền.
// Uses client from the setup above; nothing calls this function automatically.
async function classifyAfterConsent({ sender, subject, body, confirmed }) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("classifyCustomerEmail", { body: { sender, subject, body } });
}
async function readAccountAndPricing() {
return Promise.all([
client.request("customerGetAccount", {}),
client.request("customerGetPricingSettings", {}),
]);
}
Trình tạo Standard và VIP gốc
Trình xây dựng tiêu chuẩn miễn phí thực hiện nhập, xác thực, biên dịch và xuất MJML dưới dạng HTML, MJML hoặc tệp ZIP của cả hai. Trình xây dựng VIP gốc riêng biệt sử dụng định dạng tài liệu riêng, không phải MJML: các thao tác nhập, xác thực, biên dịch và xuất của nó yêu cầu tư cách thành viên đang hoạt động và quyền truy cập mở đã sở hữu, và tệp ZIP của nó chứa ba biến thể HTML CSS. Tính năng tạo bằng AI tùy chọn được trả phí riêng, tạo ra thiết kế MJML tiêu chuẩn hoặc VIP gốc có thể chỉnh sửa; hiển thị giá có hiệu lực hiện tại và truyền expectedPriceMillicents đã xác nhận, không bao giờ sử dụng giá cố định (hard-coded). Các phản hồi ZIP chứa archiveBase64, không phải trường html: decodeExportBytes trả về các byte để ứng dụng của bạn lưu trữ. Các điểm cuối xử lý này không truy xuất tài sản, duy trì thiết kế hoặc gửi email.
import { decodeExportBytes } from "@sendrepute/node";
async function exportStandardZip(mjml) {
const exported = await client.request("customerStandardBuilderExport", {
body: { mjml, format: "zip", filename: "newsletter.zip" },
});
return decodeExportBytes(exported);
}
async function generateNativeAfterConsent(prompt, expectedPriceMillicents, confirmed) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("customerCreateVipEmailTemplate", {
body: { prompt, expectedPriceMillicents },
});
}
Các khả năng khác
Các ID hoạt động được tạo bao gồm đọc tài khoản và giá, phân loại và chỉnh sửa thủ công, viết lại/tạo mẫu bằng AI, các gói/trạng thái/mua hàng VIP, các mẫu gốc/quyền truy cập, và nhập/xuất tiêu chuẩn/gốc không trạng thái. Tham khảo các ví dụ mã nguồn và tài liệu tham khảo API khách hàng cho từng loại yêu cầu, phạm vi bắt buộc và giá hiện tại. Đọc danh mục (Catalog) không phát sinh việc mua quyền truy cập. Các khả năng trả phí mới yêu cầu các token có phạm vi xác định có chủ ý và xác nhận giao diện người dùng rõ ràng.
Kết quả, lỗi và giới hạn
SendReputeError tiết lộ status, code và requestId; chỉ giữ lại các siêu dữ liệu vận hành an toàn đó. Tuyệt đối không lưu log bodies, prompts, headers hoặc toàn bộ phản hồi. AbortSignal dùng để hủy tác vụ; timeoutMs áp dụng cho mỗi lần thử. Các lần thử lại có giới hạn (Bounded retries) nhận biết được hoạt động và việc bảo vệ biên nhận được giới hạn thời gian, không phải là cơ chế thanh toán exactly-once vô hạn. Chế độ Advisory Nodemailer báo cáo mà không chặn; việc chặn sử dụng spamProbabilityThreshold và onApiFailure một cách độc lập. Hãy bảo trì và kiểm thử transport thực tế của bạn một cách riêng biệt.
import { SendReputeError } from "@sendrepute/node";
async function readAccountSafely() {
try {
return await client.request("customerGetAccount", {});
} catch (error) {
if (error instanceof SendReputeError) {
console.error({
status: error.status, code: error.code, requestId: error.requestId,
});
}
throw error;
}
}
Tham chiếu API và phương thức
SendReputeClient yêu cầu apiKey và baseUrl; timeoutMs tùy chọn mặc định là 30000 (tối đa 300000), maxRetries mặc định là 2 (khoảng 0–10), và fetch chấp nhận một triển khai máy chủ tương thích. request(operationId, input, { signal }) trả về phản hồi định kiểu của thao tác; input chứa các trường body, path và/hoặc query của nó. Cấu hình không hợp lệ sẽ gây ra TypeError; các lỗi API sử dụng SendReputeError với status, code, requestId và retryAfterMs. decodeExportBytes chuyển đổi một bản xuất ZIP sang Uint8Array và từ chối đầu vào không phải ZIP hoặc base64 không hợp lệ. OperationInput, OperationResponse và các loại schema được tạo sẽ được xuất cho các trình gọi TypeScript.
Thay thế: bao bọc một transport Nodemailer cấp thấp
createSendReputeTransport(existingTransport, options) bao bọc một đối tượng transport hiện có với các phương thức send, close và verify tùy chọn; nó không phải là một trình vận chuyển sendMail. Chọn phương thức này hoặc createSendReputePlugin, không chọn cả hai, để tránh phân tích trùng lặp. Cả hai đều nhận client và policy cộng với model tùy chọn, sender string/resolver, signal và onDiagnostic. Các callback diagnostic không thể thay đổi việc phân phối. Các mã lỗi SendReputeNodemailerError phân biệt giữa policy/message không hợp lệ, nội dung không được hỗ trợ, chặn spam và chặn do lỗi API. Gói npm 0.1.1 đã xuất bản và bản tải xuống website 0.1.1 kết hợp tất cả các lựa chọn thay thế text/plain và text/html hiển thị trong bộ nhớ thành một yêu cầu phân loại có giới hạn; trong chế độ chặn, chúng từ chối các lựa chọn thay thế hiển thị không được hỗ trợ. Raw messages, streams, paths và URLs vẫn chưa được hỗ trợ.
import { createSendReputeTransport } from "@sendrepute/node/nodemailer";
function wrapExistingTransport(existingTransport) {
return createSendReputeTransport(existingTransport, {
client,
policy: {
paidAnalysisConsent: true,
mode: "advisory",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
onDiagnostic(diagnostic) {
console.info(diagnostic.kind, diagnostic.action);
},
});
}
Tất cả 49 thao tác API khách hàng
Mở rộng một thao tác để xem chính xác kiểu dữ liệu đầu vào SDK, kiểu trả về, phạm vi và các trạng thái HTTP được tài liệu hóa. Liên kết lược đồ sẽ mở ra các tham số đầy đủ, các trường phản hồi và ví dụ trong tài liệu tham khảo API khách hàng. Các trình bao bọc này sử dụng client đã được cấu hình ở trên; yêu cầu phải có xác nhận và không có gì tự động thực thi. Các thao tác đọc không ủy quyền mua hàng. Các thay đổi (mutations), thanh toán, đóng quyền truy cập và AI trả phí yêu cầu hành động tài khoản có chủ ý tương ứng.
Báo giá cho một phân tích thông tin chi tiết chiến dịch tổng hợp
POST /v1/campaign-insights/quote
Phạm vi bắt buộc: ai:generate
Đầu vào: { body: CustomerCampaignInsightsQuoteInput; }
Trả về: CustomerCampaignInsightsQuote
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 429, 503
Tham số, lược đồ và ví dụ HTTP
// The configured server-side client needs ai:generate scope.
// A quote is free; it does not authorize or start paid analysis.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
// quote.priceMillicents: 10000 (USD 0.10) regular, 5000 (USD 0.05) active VIP.
// The quoted rate can change; obtain fresh consent before analysis.
Phân tích các chỉ số phân phối chiến dịch tổng hợp bằng AI
POST /v1/campaign-insights/analyze
Phạm vi bắt buộc: ai:generate
Đầu vào: { body: CustomerCampaignInsightsAnalyzeInput; }
Trả về: CustomerCampaignInsightsAnalysis
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Tham số, lược đồ và ví dụ HTTP
import { randomUUID } from "node:crypto";
import type { CustomerCampaignInsightsMetrics } from "@sendrepute/node";
async function analyzeReviewedAggregate(
metrics: CustomerCampaignInsightsMetrics,
paidConsent: boolean,
) {
if (paidConsent !== true) throw new Error("Explicit price consent required");
// Aggregate counts/rates only: never include campaign IDs, contacts,
// message bodies or individual events. Requires ai:generate scope.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
const body = {
analysisId: randomUUID(), // Persist this opaque ID and exact body for safe replay.
expectedPriceMillicents: quote.priceMillicents,
consent: true as const,
metrics,
};
// USD 0.10 regular or USD 0.05 active VIP; no automatic retry on a paid request.
// 409 PRICE_CHANGED requires a new quote and fresh consent, not blind retry.
// Aggregate input and result expire after 30 days.
return client.request("customerAnalyzeCampaignInsights", { body });
}
Liệt kê các mô hình phân loại API khách hàng
GET /v1/models
Phạm vi bắt buộc: models:read
Đầu vào: Record<string, never>
Trả về: CustomerApiModelsResponse
Các trạng thái HTTP được tài liệu hóa: 200, 401, 403, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiModels(
input: OperationInput<"getCustomerApiModels">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiModels">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiModels", input, { signal });
}
Lấy thông tin sử dụng API và hạn mức của khách hàng
GET /v1/usage
Phạm vi bắt buộc: usage:read
Đầu vào: Record<string, never>
Trả về: CustomerApiUsageResponse
Các trạng thái HTTP được tài liệu hóa: 200, 401, 403, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiUsage(
input: OperationInput<"getCustomerApiUsage">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiUsage">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiUsage", input, { signal });
}
Phân loại một email của khách hàng
POST /v1/classify
Phạm vi bắt buộc: classify
Đầu vào: { body: CustomerClassificationInput; }
Trả về: CustomerClassificationResponse
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function classifyCustomerEmail(
input: OperationInput<"classifyCustomerEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"classifyCustomerEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("classifyCustomerEmail", input, { signal });
}
Lấy thông tin tài khoản hiện tại và số dư
GET /v1/account
Phạm vi bắt buộc: account:read
Đầu vào: Record<string, never>
Trả về: Account
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccount(
input: OperationInput<"customerGetAccount">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccount">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccount", input, { signal });
}
Lấy liên kết giới thiệu và hoạt động nhận thưởng của tài khoản hiện tại
GET /v1/account/referrals
Phạm vi bắt buộc: account:read
Đầu vào: { query?: { page?: number; pageSize?: number; }; }
Trả về: ReferralDashboard
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccountReferrals(
input: OperationInput<"customerGetAccountReferrals">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccountReferrals">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccountReferrals", input, { signal });
}
Liệt kê sổ cái tín dụng của tài khoản hiện tại
GET /v1/account/ledger
Phạm vi bắt buộc: billing:read
Đầu vào: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Trả về: Array<CreditLedgerEntry>
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetCreditLedger(
input: OperationInput<"customerGetCreditLedger">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetCreditLedger">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetCreditLedger", input, { signal });
}
Liệt kê các hóa đơn Bitcoin của tài khoản hiện tại
GET /v1/payments/invoices
Phạm vi bắt buộc: billing:read
Đầu vào: { query?: { limit?: number; offset?: number; }; }
Trả về: Array<BitcoinInvoice>
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentInvoices(
input: OperationInput<"customerListPaymentInvoices">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentInvoices">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentInvoices", input, { signal });
}
Tạo hóa đơn nạp Bitcoin theo mệnh giá USD
POST /v1/payments/invoices
Phạm vi bắt buộc: billing:write
Đầu vào: { body: InvoiceInput; }
Trả về: BitcoinInvoice
Các trạng thái HTTP được tài liệu hóa: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreatePaymentInvoice(
input: OperationInput<"customerCreatePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreatePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreatePaymentInvoice", input, { signal });
}
Ẩn một hóa đơn Bitcoin chưa thanh toán
DELETE /v1/payments/invoices/{invoiceId}
Phạm vi bắt buộc: billing:write
Đầu vào: { path: { invoiceId: string; }; }
Trả về: undefined
Các trạng thái HTTP được tài liệu hóa: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
Phạm vi bắt buộc: billing:read
Đầu vào: Record<string, never>
Trả về: Array<PaymentMethod>
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentMethods(
input: OperationInput<"customerListPaymentMethods">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentMethods">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentMethods", input, { signal });
}
Lấy ưu đãi nạp tiền Bitcoin đang hoạt động
GET /v1/payments/deposit-offer
Phạm vi bắt buộc: billing:read
Đầu vào: Record<string, never>
Trả về: DepositBonusOffer | null
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetActiveDepositOffer(
input: OperationInput<"customerGetActiveDepositOffer">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetActiveDepositOffer">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetActiveDepositOffer", input, { signal });
}
Cập nhật xác nhận cho các hóa đơn của tài khoản hiện tại
POST /v1/payments/refresh
Phạm vi bắt buộc: billing:write
Đầu vào: Record<string, never>
Trả về: Array<BitcoinInvoice>
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRefreshMyPayments(
input: OperationInput<"customerRefreshMyPayments">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRefreshMyPayments">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRefreshMyPayments", input, { signal });
}
Lấy giá phân tích và chỉnh sửa công khai hiện tại
GET /v1/pricing
Phạm vi bắt buộc: catalog:read
Đầu vào: Record<string, never>
Trả về: PricingSettings
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPricingSettings(
input: OperationInput<"customerGetPricingSettings">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPricingSettings">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPricingSettings", input, { signal });
}
Lấy báo giá VIP công khai hiện tại và so sánh giá
GET /v1/vip/plans
Phạm vi bắt buộc: catalog:read
Đầu vào: Record<string, never>
Trả về: VipPlanQuote
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
Phạm vi bắt buộc: vip:read
Đầu vào: Record<string, never>
Trả về: VipState
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
Phạm vi bắt buộc: vip:purchase
Đầu vào: { body: CustomerVipPurchaseInput; }
Trả về: VipPurchaseResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPurchaseVip(
input: OperationInput<"customerPurchaseVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPurchaseVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPurchaseVip", input, { signal });
}
Báo giá chỉnh sửa và kiểm tra lại dựa trên phân loại đã lưu
POST /v1/rewrite/quote
Phạm vi bắt buộc: rewrite
Đầu vào: { body: EditQuoteInput; }
Trả về: EditQuote
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteClassificationEdit(
input: OperationInput<"customerQuoteClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteClassificationEdit", input, { signal });
}
Báo giá chỉnh sửa và kiểm tra lại dựa trên phân loại đã lưu
POST /v1/classify/edit/quote
Phạm vi bắt buộc: classify
Đầu vào: { body: EditQuoteInput; }
Trả về: EditQuote
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteManualClassificationEdit(
input: OperationInput<"customerQuoteManualClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteManualClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteManualClassificationEdit", input, { signal });
}
Phân loại email bằng tên người gửi, tiêu đề và nội dung
POST /v1/classify/edit
Phạm vi bắt buộc: classify
Đầu vào: { body: CustomerManualEditInput; }
Trả về: CustomerManualEditResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerClassifyEmail(
input: OperationInput<"customerClassifyEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerClassifyEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerClassifyEmail", input, { signal });
}
Yêu cầu AI viết lại các cụm từ bị gắn cờ được chọn và phân loại lại kết quả (có tính phí riêng)
POST /v1/rewrite
Phạm vi bắt buộc: rewrite
Đầu vào: { body: CustomerAiRewriteInput; }
Trả về: AiRewriteResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRewriteFlaggedTermsWithAi(
input: OperationInput<"customerRewriteFlaggedTermsWithAi">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRewriteFlaggedTermsWithAi">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRewriteFlaggedTermsWithAi", input, { signal });
}
Xác minh một bản thảo cuối cùng được hiển thị chính xác đối với biên lai Rewrite All có trả phí đã sở hữu mà không cần ghi nợ khác
POST /v1/rewrite/finalize
Phạm vi bắt buộc: rewrite
Đầu vào: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Trả về: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerFinalizeAiRewrite(
input: OperationInput<"customerFinalizeAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerFinalizeAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerFinalizeAiRewrite", input, { signal });
}
Khôi phục biên lai viết lại bằng AI có trả phí đã hoàn thành và thuộc sở hữu
GET /v1/rewrite/result/{requestId}
Phạm vi bắt buộc: rewrite
Đầu vào: { path: { requestId: string; }; }
Trả về: AiRewriteResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAiRewriteResult(
input: OperationInput<"customerGetAiRewriteResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAiRewriteResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAiRewriteResult", input, { signal });
}
Báo giá tối đa được ủy quyền cho một bản viết lại bằng AI được thanh toán riêng
POST /v1/rewrite/ai-quote
Phạm vi bắt buộc: rewrite
Đầu vào: { body: AiRewriteQuoteInput; }
Trả về: AiRewriteQuote
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteAiRewrite(
input: OperationInput<"customerQuoteAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteAiRewrite", input, { signal });
}
Tạo thiết kế email MJML tiêu chuẩn có thể chỉnh sửa bằng AI với mức giá tài khoản đã xác nhận
POST /v1/email-builder/ai-template
Phạm vi bắt buộc: ai:generate
Đầu vào: { body: CustomerAiEmailTemplateInput; }
Trả về: AiEmailTemplateResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateAiEmailTemplate(
input: OperationInput<"customerCreateAiEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateAiEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateAiEmailTemplate", input, { signal });
}
Tạo thiết kế email VIP gốc có thể chỉnh sửa bằng AI với mức giá thành viên đã xác nhận
POST /v1/vip/email-template
Phạm vi bắt buộc: ai:generate
Đầu vào: { body: CustomerVipEmailTemplateInput; }
Trả về: CustomerVipEmailTemplateResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailTemplate(
input: OperationInput<"customerCreateVipEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailTemplate", input, { signal });
}
Mở phiên trình chỉnh sửa thiết kế email tiêu chuẩn miễn phí
POST /v1/email-builder/access
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerEmailBuilderAccessInput; }
Trả về: EmailBuilderAccess
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerAccessEmailBuilder(
input: OperationInput<"customerAccessEmailBuilder">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerAccessEmailBuilder">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerAccessEmailBuilder", input, { signal });
}
GET /email-builder/access/{accessId}
GET /v1/email-builder/access/{accessId}
Phạm vi bắt buộc: builder:read
Đầu vào: { query?: { designId?: string; }; path: { accessId: string; }; }
Trả về: EmailBuilderActiveAccess
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetEmailBuilderAccess(
input: OperationInput<"customerGetEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetEmailBuilderAccess", input, { signal });
}
DELETE /email-builder/access/{accessId}
DELETE /v1/email-builder/access/{accessId}
Phạm vi bắt buộc: builder:write
Đầu vào: { path: { accessId: string; }; }
Trả về: undefined
Các trạng thái HTTP được tài liệu hóa: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCloseEmailBuilderAccess(
input: OperationInput<"customerCloseEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCloseEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCloseEmailBuilderAccess", input, { signal });
}
POST /vip/email-builder/access
POST /v1/vip/email-builder/access
Phạm vi bắt buộc: vip:builder
Đầu vào: { body: CustomerVipBuilderAccessInput; }
Trả về: VipBuilderAccess
Các trạng thái HTTP được tài liệu hóa: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailBuilderAccess(
input: OperationInput<"customerCreateVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailBuilderAccess", input, { signal });
}
GET /vip/email-builder/access/{accessId}
GET /v1/vip/email-builder/access/{accessId}
Phạm vi bắt buộc: builder:read
Đầu vào: { path: { accessId: string; }; }
Trả về: VipBuilderAccess
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipEmailBuilderAccess(
input: OperationInput<"customerGetVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipEmailBuilderAccess", input, { signal });
}
DELETE /vip/email-builder/access/{accessId}
DELETE /v1/vip/email-builder/access/{accessId}
Phạm vi bắt buộc: vip:builder
Đầu vào: { path: { accessId: string; }; }
Trả về: undefined
Các trạng thái HTTP được tài liệu hóa: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeleteVipEmailBuilderAccess(
input: OperationInput<"customerDeleteVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeleteVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeleteVipEmailBuilderAccess", input, { signal });
}
Read permanent paid-result evidence with the original account and credential
GET /customer/paid-results/{recoveryId}
Phạm vi bắt buộc: authenticated original credential
Đầu vào: { path: { recoveryId: string; }; }
Trả về: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPaidResult(
input: OperationInput<"customerGetPaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPaidResult", input, { signal });
}
Read the authenticated account and credential identity before paid dispatch
GET /customer/paid-results/identity
Phạm vi bắt buộc: authenticated credential
Đầu vào: Record<string, never>
Trả về: { accountId: string; credentialId: string; }
Các trạng thái HTTP được tài liệu hóa: 200, 401, 403, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPaidResultIdentity(
input: OperationInput<"customerPaidResultIdentity">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPaidResultIdentity">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPaidResultIdentity", input, { signal });
}
Explicitly resolve an owned paid result with the original credential and service scope
POST /customer/paid-results/{recoveryId}/resolve
Phạm vi bắt buộc: original ai:generate or vip:builder service scope
Đầu vào: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Trả về: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerResolvePaidResult(
input: OperationInput<"customerResolvePaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerResolvePaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerResolvePaidResult", input, { signal });
}
Nhập và biên dịch một thiết kế MJML tiêu chuẩn mà không lưu hoặc gửi
POST /v1/email-builder/import
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerStandardBuilderInput; }
Trả về: CustomerStandardBuilderImportResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderImport(
input: OperationInput<"customerStandardBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderImport", input, { signal });
}
Kiểm tra và biên dịch một thiết kế MJML tiêu chuẩn mà không lưu hoặc gửi
POST /v1/email-builder/validate
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerStandardBuilderInput; }
Trả về: CustomerStandardBuilderValidateResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderValidate(
input: OperationInput<"customerStandardBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderValidate", input, { signal });
}
Biên dịch một thiết kế MJML tiêu chuẩn sang HTML mà không lưu hoặc gửi
POST /v1/email-builder/compile
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerStandardBuilderInput; }
Trả về: CustomerStandardBuilderCompileResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderCompile(
input: OperationInput<"customerStandardBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderCompile", input, { signal });
}
Xuất thiết kế MJML tiêu chuẩn dưới dạng HTML, MJML hoặc ZIP mà không gửi
POST /v1/email-builder/export
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerStandardBuilderInput; }
Trả về: CustomerStandardBuilderExportResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderExport(
input: OperationInput<"customerStandardBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderExport", input, { signal });
}
Nhập và biên dịch thiết kế VIP gốc với tư cách thành viên đang hoạt động và quyền truy cập mở sở hữu
POST /v1/vip/email-builder/import
Phạm vi bắt buộc: vip:builder
Đầu vào: { body: CustomerNativeBuilderInput; }
Trả về: CustomerNativeBuilderImportResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderImport(
input: OperationInput<"customerNativeBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderImport", input, { signal });
}
Xác thực và biên dịch thiết kế VIP gốc với tư cách thành viên đang hoạt động và quyền truy cập mở sở hữu
POST /v1/vip/email-builder/validate
Phạm vi bắt buộc: vip:builder
Đầu vào: { body: CustomerNativeBuilderInput; }
Trả về: CustomerNativeBuilderValidateResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderValidate(
input: OperationInput<"customerNativeBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderValidate", input, { signal });
}
Biên dịch thiết kế VIP gốc sang HTML với tư cách thành viên đang hoạt động và quyền truy cập mở đã sở hữu
POST /v1/vip/email-builder/compile
Phạm vi bắt buộc: vip:builder
Đầu vào: { body: CustomerNativeBuilderInput; }
Trả về: CustomerNativeBuilderCompileResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderCompile(
input: OperationInput<"customerNativeBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderCompile", input, { signal });
}
Xuất thiết kế VIP gốc dưới dạng HTML hoặc tệp ZIP HTML ba biến thể mà không gửi
POST /v1/vip/email-builder/export
Phạm vi bắt buộc: vip:builder
Đầu vào: { body: CustomerNativeBuilderInput; }
Trả về: CustomerNativeBuilderExportResult
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderExport(
input: OperationInput<"customerNativeBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderExport", input, { signal });
}
Khởi chạy một lần chuyển giao trình chỉnh sửa được lưu trữ VIP gốc tiêu chuẩn hoặc đủ điều kiện
POST /v1/email-builder/hosted-handoffs
Phạm vi bắt buộc: builder:write
Đầu vào: { body: CustomerHostedBuilderHandoffInput; }
Trả về: CustomerHostedBuilderHandoff
Các trạng thái HTTP được tài liệu hóa: 201, 400, 401, 403, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateHostedBuilderHandoff(
input: OperationInput<"customerCreateHostedBuilderHandoff">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateHostedBuilderHandoff">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateHostedBuilderHandoff", input, { signal });
}
Liệt kê các mẫu VIP Builder
GET /v1/vip/email-builder/templates
Phạm vi bắt buộc: vip:read
Đầu vào: Record<string, never>
Trả về: CustomerVipTemplateCatalog
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListVipBuilderTemplates(
input: OperationInput<"customerListVipBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListVipBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListVipBuilderTemplates", input, { signal });
}
Lấy mẫu VIP Builder
GET /v1/vip/email-builder/templates/{templateId}
Phạm vi bắt buộc: vip:read
Đầu vào: { path: { templateId: string; }; }
Trả về: CustomerVipTemplateDocument
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipBuilderTemplate(
input: OperationInput<"customerGetVipBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipBuilderTemplate", input, { signal });
}
Liệt kê các mẫu Standard Builder
GET /v1/email-builder/templates
Phạm vi bắt buộc: catalog:read
Đầu vào: Record<string, never>
Trả về: CustomerStandardTemplateCatalog
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListStandardBuilderTemplates(
input: OperationInput<"customerListStandardBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListStandardBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListStandardBuilderTemplates", input, { signal });
}
Lấy mẫu Standard Builder
GET /v1/email-builder/templates/{templateId}
Phạm vi bắt buộc: catalog:read
Đầu vào: { path: { templateId: string; }; }
Trả về: CustomerStandardTemplateDetail
Các trạng thái HTTP được tài liệu hóa: 200, 400, 401, 403, 404, 413, 429, 503
Tham số, lược đồ và ví dụ HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetStandardBuilderTemplate(
input: OperationInput<"customerGetStandardBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetStandardBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetStandardBuilderTemplate", input, { signal });
}
Node n8n tự lưu trữ (Self-hosted)
0.1.0
Yêu cầu Node.js 20.19+ và một bản cài đặt n8n tự lưu trữ (self-hosted) đã được vá, cung cấp n8n-workflow >=2.39.3 <3. Không ép buộc cài đặt vào một máy chủ cũ không tương thích. Cài đặt tệp tarball đã tải xuống vào thư mục custom-node của bạn và khởi động lại n8n. Node chưa công bố này không khả dụng thông qua n8n Cloud hoặc cài đặt cộng đồng qua npm-name.
Theo mặc định, sự đồng ý trả phí sẽ bị tắt. Mỗi mục đồng ý thực hiện một yêu cầu phân loại và không tự động thử lại. Kết quả được đặt trong namespace sendrepute. Hãy sử dụng một cổng IF trên sendrepute.allowed trước khi gửi, và kiểm tra trạng thái lỗi một cách riêng biệt. Chế độ tư vấn và chặn sẽ trả về các quyết định rõ ràng. Bản thân node này không thực hiện gửi thư.
Tải xuống n8n tarball
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Chạy trên máy chủ n8n tự lưu trữ (self-hosted), sau đó khởi động lại dịch vụ n8n bằng trình quản lý tiến trình thông thường của bạn. Xác nhận SendRepute xuất hiện trong bộ chọn node. Nhập file package/examples/classify-email.workflow.json đã giải nén từ trình chỉnh sửa n8n. Cài đặt các node Community qua npm-name và n8n Cloud không được hỗ trợ bởi gói chưa xuất bản này.
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
curl -fLO https://www.sendrepute.com/downloads/sendrepute-n8n.tgz
npm install ./sendrepute-n8n.tgz
tar -xzf sendrepute-n8n.tgz package/examples/classify-email.workflow.json
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/n8n-nodes-sendrepute.git
cd n8n-nodes-sendrepute
npm ci
npm run pack:check
npm pack --ignore-scripts
archive="$PWD/n8n-nodes-sendrepute-0.1.0.tgz"
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install "$archive"
2. Cấu hình bảo mật
Tạo một thông tin xác thực SendRepute API với customer key phạm vi classify trong bộ lưu trữ thông tin xác thực của n8n. Tuyệt đối không đặt nó vào workflow JSON hoặc các biểu thức (expressions). Đoạn JSON bên dưới hiển thị các tham số của node, không phải là một workflow có thể nhập hoàn chỉnh. Ánh xạ tên hiển thị người gửi, chủ đề và nội dung; chọn advisory/blocking, threshold và chính sách lỗi open/closed. Xem lại bảng giá trước khi chuyển paidConsent sang true. Mỗi mục đồng ý thực hiện tối đa một yêu cầu.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Sử dụng có chủ đích
Đặt một node IF ngay sau SendRepute và sử dụng điều kiện boolean này. Chỉ kết nối đầu ra true với node email hiện tại của bạn; điều hướng false để xem xét hoặc dừng lại. Kiểm tra analysisStatus riêng biệt ngay cả khi allowed là true. Workflow đi kèm bắt đầu với sự đồng ý trả phí bị vô hiệu hóa và không chứa thông tin xác thực. Bản thân SendRepute không bao giờ gửi thư.
{{ $json.sendrepute.allowed === true }}
Kết quả, lỗi và giới hạn
Các kết quả thành công sẽ thay thế không gian tên sendrepute bằng các trường analysisStatus, decision, allowed, recommendation, điểm số đã xác thực và billing. Các lỗi thất bại sẽ bỏ qua điểm spam và trả về failureCategory/errorCode đã được làm sạch. Các lỗi đóng (closed failures) sẽ chặn; các lỗi mở (open failures) sẽ cho phép nhưng đánh dấu analysisStatus là failed. Các phản hồi thành công dạng cố vấn (advisory successes) luôn cho phép bất kể recommendation. Tắt đồng ý (Consent-off) sẽ trả về not_run. Không có các tính năng thử lại, người nhận, tệp đính kèm, viết lại, bộ chọn mô hình hoặc các điểm cuối tùy chỉnh. Bản kiểm toán phụ thuộc mã nguồn đã cập nhật báo cáo không tìm thấy vấn đề nào; đây là kết quả tại một thời điểm nhất định, không phải chứng nhận bảo mật. Hãy duy trì việc vá lỗi môi trường thực thi tự lưu trữ và xem lại SECURITY.md trước khi cài đặt.
Tích hợp Laravel
0.1.0
Nhắm mục tiêu PHP 8.2+ và Laravel 12–13. Cài đặt tệp ZIP bằng kho lưu trữ artifact cục bộ của Composer, hoặc giải nén và cấu hình một kho lưu trữ đường dẫn Composer (path repository) như đã mô tả trong tệp README đính kèm. Không có tuyên bố về việc xuất bản trên Packagist.
Chế độ đồng ý trả phí và mail hook mặc định bị vô hiệu hóa. Ngay cả khi được kích hoạt, mỗi tin nhắn phải chọn tham gia rõ ràng với X-SendRepute-Classify: yes. Header này sẽ bị xóa trước khi chuyển phát. Các chế độ tư vấn và chặn có chính sách xử lý lỗi độc lập; email đặt lại mật khẩu và email giao dịch sẽ không bị ảnh hưởng trừ khi được chủ động chọn tham gia.
Tải xuống Laravel ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Chạy bên trong ứng dụng Laravel của bạn. Các lệnh này giải nén bản tải về và đăng ký một kho lưu trữ đường dẫn Composer; đây không phải là cài đặt qua Packagist. Tính năng Package discovery sẽ đăng ký provider, và vendor:publish sẽ tạo config/sendrepute.php. Giữ thư mục gói đã giải nén luôn sẵn dụng cho Composer. Một kho lưu trữ artifact là một tùy chọn khác được tài liệu hóa trong README.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-laravel.zip -o packages/sendrepute-laravel.zip
unzip packages/sendrepute-laravel.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-laravel
composer require sendrepute/laravel:@dev
php artisan vendor:publish --tag=sendrepute-config
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
composer config repositories.sendrepute vcs https://github.com/sendrepute/sendrepute-laravel
composer require sendrepute/laravel:dev-main
php artisan vendor:publish --tag=sendrepute-config
2. Cấu hình bảo mật
Lưu trữ SENDREPUTE_API_KEY trong server secrets. URL cơ sở kết thúc bằng /api; client sẽ thêm /v1/classify. Yêu cầu khớp chính xác trusted-host và HTTPS đã được xác minh. Cả hai công tắc hiển thị vẫn ở chế độ tắt cho đến khi bạn xem lại bảng giá và đặt chúng thành true một cách rõ ràng. Trong config/sendrepute.php, hãy chọn mail.mode, mail.spam_probability_threshold và mail.failure_policy một cách độc lập. Mặc định là advisory với allow khi thất bại.
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
SENDREPUTE_TRUSTED_HOSTS=www.sendrepute.com
SENDREPUTE_PAID_ANALYSIS_CONSENT=false
SENDREPUTE_MAIL_ENABLED=false
3. Sử dụng có chủ đích
Chỉ thêm header opt-in chính xác vào các lớp Mailable được chọn có chủ đích, tuyệt đối không dùng lệnh gọi lại thư toàn cục. Cần cả hai công tắc toàn cục và header theo từng tin nhắn cho hook tự động. Header sẽ bị xóa trước khi gửi. Giữ các thông báo đặt lại mật khẩu và thông báo quan trọng ra khỏi việc chặn tự động trừ khi được kiểm thử rõ ràng. Phân loại thủ công thay vào đó có thể phân giải hợp đồng Classifier và cấp sự đồng ý cho mỗi lần gọi, như đã hiển thị.
// Inside your deliberately opted-in Mailable:
public function headers(): \Illuminate\Mail\Mailables\Headers
{
return new \Illuminate\Mail\Mailables\Headers(text: [
'X-SendRepute-Classify' => 'yes',
]);
}
// Or classify manually inside an authenticated, explicitly confirmed action:
function classifyAfterConsent(bool $confirmed, string $subject, string $body): \SendRepute\Laravel\ClassificationResult
{
if (!$confirmed) {
throw new \RuntimeException('Paid consent required');
}
return app(\SendRepute\Laravel\Contracts\Classifier::class)->classify(
sender: 'Example Company',
subject: $subject,
body: $body,
paidAnalysisConsent: true,
);
}
Tham chiếu API và phương thức
Giải quyết interface Classifier từ container của Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) trả về ClassificationResult. Các trường công khai của nó là requestId, model, label, spamProbability, confidence, replayed và chargedMillicents. SendReputeException cung cấp danh mục đã được làm sạch, trạng thái HTTP, mã API và ID yêu cầu. Hook tự động là AnalyzeOutgoingMessage trên MessageSending và chẩn đoán an toàn của nó là ClassificationOutcome. Tích hợp này chỉ hỗ trợ phân loại, không hỗ trợ quản trị tài khoản, thanh toán, trình dựng hoặc ghi đè AI.
Kết quả, lỗi và giới hạn
ClassificationResult chứa kết quả đã xác thực và dữ liệu thanh toán. Hook MessageSending trả về false để hủy tin nhắn bị chặn; việc hủy bỏ không phải là lỗi SMTP hay sự kiện MessageSent. ClassificationOutcome chỉ báo cáo hành động, điểm số và siêu dữ liệu lỗi đã được làm sạch, không bao giờ bao gồm nội dung tin nhắn. Chính sách lỗi bao gồm dữ liệu nhập/phản hồi sai cấu trúc, xác thực, số dư, giới hạn tốc độ và các vấn đề truyền tải. Không có lần thử lại hoặc hàng đợi nào được thêm vào. Yêu cầu phải có người gửi được đặt tên và nội dung văn bản hoặc HTML trong bộ nhớ.
Kiểm tra trước bản nháp Mautic
0.1.0
Dành cho các bản cài đặt Mautic 5.x trên một nút web duy nhất với PHP 8.1+ và ext-curl. Mautic 4, Mautic 6 và các cụm đa nút không được hỗ trợ. Giải nén SendReputeBundle vào thư mục plugins của bạn, tải lại các plugin và xóa bộ nhớ đệm (cache) theo tệp README đi kèm. Cấu hình thông tin xác thực và xác nhận rõ ràng chế độ khóa local-flock trong môi trường máy chủ.
Phân tích tư vấn trả phí chỉ dành cho bản nháp đã lưu, do quản trị viên khởi tạo. Việc chọn tham gia toàn cục, kiểm tra quyền truy cập thực thể, xác thực CSRF và xác nhận sử dụng một lần sẽ bảo vệ mỗi yêu cầu. Nó không gửi, viết lại hoặc chặn email và không có hiệu lực thi hành tại thời điểm gửi. Các thay thế người nhận vẫn chưa được mở rộng; hãy lưu các thay đổi trong trình soạn thảo trước.
Tải xuống Mautic ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Chạy từ thư mục gốc Mautic với cùng người dùng PHP và môi trường như ứng dụng web, hoặc giải nén file ZIP thông qua quy trình triển khai của bạn trước khi tải lại các plugin. Yêu cầu Mautic 5.x, PHP 8.1+, ext-curl và một node web Linux/POSIX duy nhất. Mautic 4/6 và các cụm đa node không được hỗ trợ; không có cam kết chứng nhận cài đặt bản vá trực tiếp từng phần.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mautic.zip
unzip sendrepute-mautic.zip -d plugins
php bin/console mautic:plugins:reload
php bin/console cache:clear
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Cấu hình bảo mật
Tạo thư mục ledger cố định được hiển thị bên ngoài web root, thuộc sở hữu của người dùng PHP với chế độ 0700. Không sử dụng /tmp, ephemeral containers, symlinks hoặc lưu trữ mạng không ổn định. Lưu trữ SENDREPUTE_API_KEY ở phía máy chủ. Chỉ xác nhận local-flock khi một node web cung cấp khóa tiến trình dùng chung (shared process locking). Phân tích trả phí toàn cục vẫn bị vô hiệu hóa ở mức 0; chỉ đặt thành 1 sau khi xem lại bảng giá và các giới hạn. Không có trường trình duyệt nào được cung cấp thông tin xác thực hoặc điểm cuối.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Sử dụng có chủ đích
Lưu các thay đổi trong trình chỉnh sửa trước. Với tư cách là quản trị viên Mautic thực thụ có quyền truy cập vào email đó, hãy mở bản nháp đã lưu và chọn SendRepute preflight. Xem lại xác nhận và chấp nhận hoạt động trả phí một cách rõ ràng. Yêu cầu cần xác thực CSRF và một mã định danh (intent) sử dụng một lần trong mười phút gắn liền với nội dung đã lưu. Khóa cố định và sổ cái không chứa nội dung giúp ngăn chặn chi tiêu trùng lặp đồng thời trên node đơn được hỗ trợ.
Kết quả, lỗi và giới hạn
Hiển thị xác suất đã được xác thực, nhãn, độ tin cậy và số tiền thực tế đã thanh toán hoặc bản phát lại biên nhận. Các lỗi sẽ không hiển thị quyết định spam và không được tự động thử lại. Chỉ có tên hiển thị của người gửi, tiêu đề và nội dung được lưu mới được phân tích; các thay thế liên hệ vẫn không được mở rộng. Plugin không viết lại bản nháp, gửi email, chặn chiến dịch hoặc thực thi chính sách thời điểm gửi. Việc xem xét bản nháp đã lưu không thể chứng nhận cho tin nhắn cuối cùng được hiển thị cho người nhận.
Python client và Django backend
0.1.0
Yêu cầu Python 3.9+. Giải nén tệp ZIP nguồn và cài đặt thư mục đó bằng pip. Client máy chủ chung sử dụng thư viện tiêu chuẩn; Django là một phụ thuộc tùy chọn cho backend email rõ ràng. Gói này không được xuất bản trên PyPI.
Sự đồng ý trả phí mặc định là tắt. Trình bao bọc Django bảo lưu các đối tượng transport và message gốc. Nó phân tích một chuỗi giới hạn kết hợp phần thân chính với các phương án văn bản thay thế text/plain và text/html nội dòng, không bao gồm các tệp đính kèm. Chế độ chặn sẽ từ chối nội dung hiển thị không được hỗ trợ hoặc quá kích thước. Lỗi xác thực sẽ chặn theo mặc định ngay cả khi có chính sách cho phép; hãy chọn hành vi email quan trọng một cách thận trọng.
Tải xuống Python source ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Sử dụng môi trường ảo. Client chung chỉ sử dụng thư viện tiêu chuẩn; lệnh cuối cùng thêm phụ thuộc Django tùy chọn và không cần thiết cho Flask, FastAPI hoặc mục đích sử dụng máy chủ chung khác. Gói được cài đặt từ thư mục nguồn đã tải xuống, không phải từ PyPI. Python 3.9+ là mức tối thiểu của gói; hãy chọn các phiên bản Python/Django được hỗ trợ cùng nhau.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-python.zip
unzip sendrepute-python.zip
python -m venv .venv
. .venv/bin/activate
python -m pip install ./sendrepute-python
python -m pip install './sendrepute-python[django]'
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
python -m pip install "sendrepute @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
python -m pip install "sendrepute[django] @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
2. Cấu hình bảo mật
Chèn SENDREPUTE_API_KEY thông qua bí mật máy chủ. Client chung mặc định sử dụng điểm cuối được lưu trữ chính tắc, HTTPS đã xác minh, không có chuyển hướng và không thử lại. Sự đồng ý của client mặc định là tắt; ví dụ chỉ cấp sự đồng ý cho mỗi cuộc gọi sau khi kiểm tra xác nhận. Ghi đè điểm cuối cần một danh sách cho phép nguồn HTTPS rõ ràng. Từ điển được trả về chứa kết quả đã được xác thực và dữ liệu thanh toán, không phải là quyết định gửi.
import os
from sendrepute import SendReputeClient, SendReputeError
client = SendReputeClient(api_key=os.environ["SENDREPUTE_API_KEY"])
def classify_after_consent(sender, subject, body, confirmed=False):
if confirmed is not True:
raise ValueError("Paid consent required")
try:
return client.classify(
sender=sender, subject=subject, body=body,
paid_analysis_consent=True,
)
except SendReputeError as error:
# Safe metadata only; do not log message content or response bodies.
print(error.code, error.status, error.request_id)
raise
Backend email cho Django
Giữ nguyên backend hiện có của bạn trong SENDREPUTE_ORIGINAL_EMAIL_BACKEND và giữ các cài đặt SMTP bình thường của nó. Ví dụ giữ cho sự đồng ý có trả phí ở chế độ tắt; chỉ đặt thành True sau khi xem xét giá cả. Chế độ tư vấn cho phép các phân tích thành công; chế độ chặn so sánh với SENDREPUTE_SPAM_THRESHOLD. Hãy chọn chính sách xử lý lỗi độc lập một cách có chủ ý. Lỗi xác thực sẽ chặn theo mặc định ngay cả khi ở chế độ cho phép. Ví dụ tuân theo các mặc định của README và không phải là đề xuất để bỏ qua lỗi cho thư quan trọng.
# Django settings.py
import os
EMAIL_BACKEND = "sendrepute.django.SendReputeEmailBackend"
SENDREPUTE_ORIGINAL_EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
SENDREPUTE_API_KEY = os.environ["SENDREPUTE_API_KEY"]
SENDREPUTE_PAID_ANALYSIS_CONSENT = False
SENDREPUTE_POLICY_MODE = "advisory"
SENDREPUTE_SPAM_THRESHOLD = 0.90
SENDREPUTE_FAILURE_POLICY = "allow"
SENDREPUTE_ALLOW_AUTH_FAILURE = False
SENDREPUTE_TIMEOUT = 10
3. Sử dụng có chủ đích
Hàm này chỉ gửi khi được gọi. Với trình bao bọc Django được cấu hình và sự đồng ý có trả phí được bật, backend gốc sẽ nhận các đối tượng tin nhắn gốc không thay đổi. Trình phân loại nhận được một chuỗi giới hạn kết hợp nội dung chính với các lựa chọn thay thế text/plain và text/html nội tuyến; tệp đính kèm và người nhận không phải là các đầu vào riêng biệt. Kết xuất các mẫu trước khi gọi. Trước tiên hãy sử dụng backend kiểm tra cục bộ, sau đó là vận chuyển thực đã được cấu hình có chủ ý của bạn.
from django.core.mail import EmailMultiAlternatives
def send_reviewed_message(recipient):
message = EmailMultiAlternatives(
subject="Your requested summary",
body="Here is the summary you requested.",
from_email="Example Team <team@example.com>",
to=[recipient],
)
message.attach_alternative(
"<p>Here is the summary you requested.</p>", "text/html"
)
return message.send()
Tham chiếu API và phương thức
Hàm khởi tạo công khai là SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), với tất cả trừ api_key được truyền dưới dạng từ khóa. timeout phải lớn hơn 0 và tối đa là 30 giây. classify yêu cầu từ khóa sender, subject và body; model và paid_analysis_consent cho mỗi lần gọi là tùy chọn. Sender từ 1–320 ký tự, subject từ 1–998 và body từ 1–524,288, với giới hạn yêu cầu được mã hóa riêng biệt. Dict trả về chứa requestId, model, result và billing; result bao gồm label, spamProbability, confidence, reasons và contentAudit tùy chọn. billing chứa chargedMillicents và replayed. Các lỗi bao gồm ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError và InvalidResponseError, tất cả đều thuộc SendReputeError. Cấu hình không hợp lệ có thể gây ra ValueError. Backend Django hiển thị open(), close() và send_messages(email_messages), trả về số lượng đã gửi của backend gốc; nó không thêm bất kỳ API chung, trình dựng (builder), ghi đè (rewrite) hoặc phương thức thanh toán nào.
Kết quả, lỗi và giới hạn
Chế độ chặn sẽ từ chối nội dung hiển thị không được hỗ trợ hoặc quá khổ thay vì chỉ phân tích một tập hợp con an toàn hơn. Lỗi xác thực yêu cầu một ghi đè rõ ràng riêng biệt để cho phép. Các lỗi khác tuân theo chính sách cho phép/chặn đã chọn; fail_silently kiểm soát việc các lỗi bị chặn sẽ được nêu ra hay bỏ qua. Trình bao bọc không xếp hàng, thử lại, hoán đổi vận chuyển, kiểm tra tệp đính kèm hoặc kết xuất mẫu. Client chung nêu ra các lớp con SendReputeError đã được làm sạch với mã/trạng thái/request_id; không ghi nhật ký nội dung tin nhắn.
Client phân loại Go
0.1.0
Yêu cầu Go 1.22+. Client chỉ sử dụng thư viện tiêu chuẩn hỗ trợ phân loại, không hỗ trợ vận chuyển email. Hãy chọn tệp ZIP mã nguồn có thể tải xuống với thay thế module cục bộ, hoặc cài đặt module công khai đã xác minh được hiển thị trong phần thay thế mã nguồn.
Chỉ sử dụng thư viện tiêu chuẩn, phân loại phía máy chủ với sự đồng ý trả phí rõ ràng, các yêu cầu có giới hạn, HTTPS đã xác thực, từ chối chuyển hướng và không thử lại. Nó không gửi email hoặc đưa ra quyết định gửi/chặn. Ứng dụng của bạn phải chủ động chọn các ngưỡng và hành vi khi có lỗi, đặc biệt là đối với email giao dịch quan trọng.
Tải xuống Go source ZIP
Kho mã nguồn công khai
Tài liệu README đầy đủ và các ví dụ
Ghi chú bảo mật và các hạn chế đã biết
1. Cài đặt
Giải nén nguồn vào thư mục ứng dụng Go hiện tại của bạn và chạy các lệnh module tại đó. Thay thế cục bộ trỏ vào module đã tải xuống; di chuyển hoặc điều chỉnh đường dẫn đó nếu bố cục dự án của bạn khác. Chỉ chạy go mod init với tên module của riêng bạn trước khi tạo một ứng dụng mới. Client này không yêu cầu module runtime bên ngoài nào.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-go.zip
unzip sendrepute-go.zip
# Run inside your existing application's module:
go mod edit -require=github.com/sendrepute/sendrepute-go@v0.0.0
go mod edit -replace=github.com/sendrepute/sendrepute-go=./sendrepute-go-v0.1.0
go mod tidy
Lựa chọn thay thế: cài đặt từ nguồn công khai
Sử dụng lộ trình nguồn này thay vì các hướng dẫn tải xuống trên trang web ở trên. Tệp README của kho lưu trữ sẽ giải thích các bước kích hoạt và cấu hình còn lại; việc chỉ xây dựng một tệp ZIP không giúp cài đặt một plugin. Đối với Python, lệnh thứ hai sẽ thêm hỗ trợ Django tùy chọn. Hãy lưu giữ thông tin xác thực trong các bí mật máy chủ (server secrets) và xem xét các ghi chú bảo mật trước khi bật các tính năng trả phí. Chỉ có Node là có trên npm; một kho lưu trữ GitHub công khai không có nghĩa là đã được xuất bản trên WordPress.org, n8n Cloud, Packagist hoặc PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Cấu hình bảo mật
Chèn SENDREPUTE_API_KEY từ bí mật máy chủ. Hàm được hiển thị không thực hiện công việc nào cho đến khi được gọi với confirmed=true; cuộc gọi đó có thể phát sinh phân loại có trả phí. Nó thiết lập một ngữ cảnh mười giây và sử dụng điểm cuối HTTPS chính tắc. Sự đồng ý của client mặc định là tắt; đối số true cuối cùng cấp sự đồng ý cho yêu cầu duy nhất này. Việc ghi đè điểm cuối yêu cầu một mục nhập AllowedOrigins rõ ràng; các chuyển hướng bị từ chối.
package integration
import (
"context"
"errors"
"os"
"time"
sendrepute "github.com/sendrepute/sendrepute-go"
)
func Analyze(subject, body string, confirmed bool) error {
if !confirmed {
return errors.New("paid consent required")
}
client, err := sendrepute.NewClient(sendrepute.Config{
APIKey: os.Getenv("SENDREPUTE_API_KEY"),
})
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, err := client.Classify(ctx, sendrepute.ClassificationInput{
Sender: "Example Team", Subject: subject, Body: body,
}, true)
if err != nil {
return err
}
if result.Result.SpamProbability >= 0.90 {
return errors.New("review required")
}
return nil
}
3. Sử dụng có chủ đích
Chỉ gọi Analyze từ ứng dụng đã xác thực của bạn sau khi xem xét giá cả và có sự đồng ý rõ ràng. Ngưỡng 0.90 và lỗi xem xét là chính sách ứng dụng ví dụ, không phải mặc định của SDK. Hãy quyết định xem lỗi có nghĩa là trì hoãn, cho phép hay đóng lỗi trước khi kết nối bất kỳ mã gửi nào. Client trả về một kết quả có kiểu với Result.SpamProbability và các trường thanh toán; chính nó không bao giờ gửi email hoặc đưa ra quyết định phân phối.
Tham chiếu API và phương thức
NewClient(Config) trả về (*Client, error). Config chấp nhận APIKey, Endpoint, AllowedOrigins, Timeout và PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) trả về (*ClassificationResponse, error). Các trường đầu vào là Sender, Subject, Body và Model tùy chọn. Sender từ 1–320 rune, subject từ 1–998 rune và body tối đa 524,288 byte UTF-8. Phản hồi được định kiểu chứa RequestID, Model, Result và Billing; Billing hiển thị ChargedMillicents và Replayed. Result bao gồm Label, SpamProbability, Confidence, Reasons, FlaggedTerms và ContentAudit tùy chọn. Sử dụng errors.As để kiểm tra *Error một cách an toàn; các lỗi cấu hình và API vẫn là lỗi, không phải điểm số spam. Không tồn tại các phương thức tài khoản, thanh toán, trình dựng hoặc ghi đè.
Kết quả, lỗi và giới hạn
Một lần gọi thực hiện tối đa một lần thử HTTP có trả phí và không có lần thử lại nào. Lỗi để lộ một danh mục an toàn, mã/request ID bị hạn chế và trạng thái, không bao giờ để lộ thông tin xác thực, nội dung hoặc chi tiết mạng. Thời lượng ngữ cảnh, kích thước yêu cầu và phản hồi được giới hạn; các phản hồi bị lỗi sẽ bị từ chối thay vì được chuyển đổi thành điểm số. Client không có khả năng phân tích cú pháp MIME, kết xuất, người nhận, tệp đính kèm, hàng đợi, trình xây dựng, viết lại hoặc SMTP. Chỉ chọn mô hình một cách rõ ràng nếu cần; nếu không, mặc định của tài khoản sẽ được áp dụng.
listmonk HTTP Messenger
0.1.0
Một gói mã nguồn cục bộ chưa công bố dành cho Node.js 20+ hướng tới giao diện Custom HTTP Messenger của listmonk 6.2.0. Dịch vụ bên ngoài này sở hữu việc phân phối SMTP hạ nguồn sau khi phân loại; đây không phải là một plugin trong cùng tiến trình hay một proxy preflight SMTP. Việc xác minh được thực hiện biệt lập và ngoại tuyến, không phải là một bản triển khai listmonk đã cài đặt hay một bài kiểm tra nhà cung cấp SMTP thực tế.
Cả hai công tắc trả phí đều mặc định tắt. Messenger chấp nhận một phần thân đã được kết xuất đầy đủ, từ chối tệp đính kèm, kiểm tra giá mới nhất và yêu cầu kết quả Inbox nghiêm ngặt: nhãn inbox, xác suất spam tối đa 0.12 và không có thuật ngữ bị gắn cờ. Sau đó, nó xây dựng và gửi cùng một phần thân đã được kiểm tra đó qua kết nối SMTP đã cấu hình. Các biên nhận bền vững giúp ngăn chặn việc lặp lại tự động sau các kết quả bị chặn, thất bại, đang xử lý hoặc không chắc chắn.
Tải xuống mã nguồn ZIP listmonk chưa công bố
1. Cài đặt
Giải nén tệp ZIP nguồn trang web chưa công bố này trên máy chủ messenger chuyên dụng. Xem xét README.md và SECURITY.md, sao chép môi trường mẫu và kiểm tra cú pháp điểm vào (entry point) của máy chủ trước khi cấu hình. Tệp tin allowlisted có thể tải xuống cố ý loại trừ bộ thử nghiệm của kho lưu trữ. Không có gói thực thi bên thứ ba nào. Đây không phải là bản cài đặt trong tiến trình hoặc trên chợ ứng dụng listmonk.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-listmonk.zip
unzip sendrepute-listmonk.zip
cd sendrepute-listmonk
cp config.example.env .env
node --check src/server.mjs
2. Cấu hình bảo mật
Sử dụng một tài khoản không có đặc quyền chuyên dụng và thư mục trạng thái cục bộ bền vững với chế độ 0700. Giữ cả ba công tắc an toàn được hiển thị ở trạng thái false cho đến khi giá cả và các giới hạn giá phi nguyên tử (non-atomic price limitation) được chấp nhận. Chỉ lưu trữ các thông tin xác thực SendRepute, messenger Basic Auth và SMTP hạ nguồn trong server secrets. Kết thúc HTTPS tại một proxy ngược (reverse proxy) đáng tin cậy.
SENDREPUTE_ENABLED=false
SENDREPUTE_PAID_CONSENT=false
SENDREPUTE_ALLOW_NONATOMIC_PRICE_CONFIRMATION=false
SENDREPUTE_CONFIRMED_MAX_PRICE_MILLICENTS=
STATE_DIRECTORY=/var/lib/sendrepute-listmonk
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
3. Sử dụng có chủ đích
Chỉ hiển thị công khai POST /v1/listmonk đằng sau giao thức HTTPS và Basic Auth chuyên dụng. Trong Cài đặt listmonk > Messengers, hãy thêm URL của nó làm Custom HTTP Messenger, chọn số lần thử lại bằng 0 (zero retries) và chỉ chọn nó cho các chiến dịch cần được kiểm tra và gửi đi. Không được chọn thêm listmonk SMTP: dịch vụ này sẽ tự thực hiện việc gửi SMTP hạ nguồn.
Custom HTTP Messenger URL: https://messenger.example.com/v1/listmonk
Authentication: dedicated Basic Auth username and password
Retries: 0
Select this messenger only. Do not also select SMTP for the campaign.
Kết quả, lỗi và giới hạn
Một bản sao đã được chuyển đi (delivered) sẽ trả về thành công mà không cần phân loại hoặc gửi lại lần nữa. Mọi biên nhận bị chặn (blocked), thất bại (failed), đang kiểm tra (inspecting), đang gửi (sending) hoặc không chắc chắn (uncertain) sẽ từ chối một lần gửi khác. Sau kết quả SMTP không chắc chắn, hãy đối soát thủ công nhật ký của nhà cung cấp và ngữ cảnh của listmonk; tuyệt đối không xóa biên nhận chỉ để ép buộc thử lại. Việc kiểm tra giá hiện tại là mới nhất nhưng không có tính nguyên tử vì quá trình phân loại không chấp nhận trường expectedPriceMillicents.
Bộ điều hợp Mailcoach Self-Hosted
0.1.0
Một gói Composer cục bộ chưa được công bố nhắm đến Mailcoach Self-Hosted v10 trên Laravel 12. Lõi spatie/laravel-mailcoach v10 có bản quyền không khả dụng trong không gian làm việc này, vì vậy gói này không đảm bảo đã vượt qua thử nghiệm đầu cuối cho Mailcoach v10 đã cài đặt. Các thử nghiệm Laravel 12 Mailer thực tế bao gồm sự kiện MessageSending có thể hủy bỏ đã được ghi lại; chủ sở hữu giấy phép phải xác minh mọi đường dẫn gửi chính xác của Mailcoach trước khi đưa vào sản xuất.
Các công tắc enabled, đồng ý trả phí và xác nhận định giá hiện tại đều mặc định tắt. Khi được bật, hook sẽ áp dụng cho mọi tin nhắn thông qua Laravel mailer đó, không chỉ các định tuyến được đặt tên Mailcoach. Nó phân tích các phương án thay thế Symfony Email đã được kết xuất và có thể hủy việc vận chuyển. Fail-closed là mặc định; việc cho phép các lỗi phân tích là một chính sách riêng biệt có chủ ý.
Tải xuống tệp ZIP mã nguồn Mailcoach thử nghiệm
1. Cài đặt
Đặt tệp ZIP chưa công bố đã tải xuống vào một thư mục artifact Composer riêng tư mà ứng dụng Mailcoach có giấy phép có thể truy cập được. Đăng ký kho lưu trữ artifact cục bộ đó, yêu cầu dòng 0.1, commit tệp khóa (lockfile) tiêu thụ và tùy chọn công bố cấu hình. Đây không phải là cài đặt qua Packagist. Chủ sở hữu giấy phép phải chạy xác minh dựa trên bản phát hành Mailcoach Self-Hosted v10 chính xác.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-mailcoach.zip -o packages/sendrepute-mailcoach.zip
composer config repositories.sendrepute artifact packages
composer require sendrepute/mailcoach:^0.1
php artisan vendor:publish --tag=sendrepute-mailcoach-config
2. Cấu hình bảo mật
Ban đầu hãy để cả ba công tắc ở trạng thái false. Lưu trữ API key trong server secrets và cấu hình hạn mức chi tiêu phía tài khoản. Thao tác classify hiện tại không có lớp bảo vệ expectedPriceMillicents nguyên tử, vì vậy công tắc thứ ba thể hiện việc chấp nhận giá API hiện tại thay vì hứa hẹn một mức báo giá cố định. Cấu hình threshold và chính sách allow/block failure một cách độc lập.
SENDREPUTE_MAILCOACH_ENABLED=false
SENDREPUTE_MAILCOACH_PAID_CONSENT=false
SENDREPUTE_MAILCOACH_ACCEPT_CURRENT_API_PRICING=false
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
3. Sử dụng có chủ đích
Package discovery sẽ đăng ký một trình lắng nghe Laravel MessageSending. Không có lệnh gọi cho mỗi chiến dịch (per-campaign) trong mã nguồn ứng dụng: khi được kích hoạt một cách có chủ đích trong một bản cài đặt Mailcoach chuyên dụng, nó sẽ kiểm tra mọi Symfony Email được gửi qua Laravel mailer đó ngay trước khi vận chuyển. Trong một ứng dụng Laravel hỗn hợp, thư của ứng dụng máy chủ (host-application mail) cũng sẽ được bao gồm.
Kết quả, lỗi và giới hạn
Adapter sẽ gửi sender display name, tiêu đề, và mỗi nội dung thay thế text/plain hoặc text/html trong bộ nhớ mà không để trống, đồng thời loại trừ người nhận, địa chỉ, tệp đính kèm, dữ liệu phong bì (envelope data) và Raw MIME. Nội dung bị thiếu hoặc không được hỗ trợ, phản hồi sai định dạng và lỗi API sẽ bị chặn theo mặc định. Các bài kiểm tra core ngoại tuyến thực hiện việc hủy bỏ Laravel Mailer thực tế, nhưng các lộ trình licensed Mailcoach campaign, automation, transactional, và test-message vẫn chưa được xác minh.
Luồng gửi được kiểm soát bởi Brevo
0.1.0
Một gói mã nguồn Node.js 20+ cục bộ chưa xuất bản, triển khai API gửi phía máy chủ rõ ràng xoay quanh hoạt động POST /v3/smtp/email giao dịch của Brevo. Nó không chặn các lượt gửi từ bảng điều khiển Brevo, chiến dịch, tự động hóa, SMTP relay hoặc các lệnh gọi qua các SDK khác. Các bài kiểm tra được kiểm soát và ngoại tuyến; chúng không chứng nhận một tài khoản Brevo đang hoạt động.
Sự đồng ý trả phí mặc định tắt. Chỉ chấp nhận tin nhắn HTML và văn bản thuần túy cố định nội dòng; các mẫu từ xa, tham số, gửi theo lịch trình, phiên bản tin nhắn và nội dung dựa trên URL bị từ chối. Bản sao (snapshot) đã kiểm tra chính xác, bất biến sẽ được gửi tới Brevo. Một sổ cái sendKey bền vững sẽ chặn các lần thử lại trùng lặp và mơ hồ, và các kết quả không chắc chắn từ nhà cung cấp yêu cầu sự đối soát từ người vận hành.
Tải xuống mã nguồn Brevo ZIP chưa xuất bản
1. Cài đặt
Giải nén tệp ZIP nguồn chưa công bố vào một ứng dụng máy chủ, xem xét README và các ghi chú bảo mật của nó, đồng thời kiểm tra cú pháp src/index.mjs. Tệp tin allowlisted có thể tải xuống cố ý loại trừ bộ thử nghiệm của kho lưu trữ. Nhập SendReputeBrevo từ src/index.mjs; đây không phải là bản cài đặt từ npm hoặc chợ ứng dụng Brevo. Yêu cầu Node.js 20+ và không có các gói phụ thuộc thực thi.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Cấu hình bảo mật
Giữ paidConsent là false cho đến khi mức giá hiện tại và giới hạn giá không nguyên tử (non-atomic price limitation) được chấp thuận. Lưu trữ cả hai API keys trong server secrets và sử dụng một thư mục sổ cái cố định riêng tư trên bộ nhớ lưu trữ bền vững đơn máy chủ. expectedPriceMillicents phải bằng với mức tối đa vừa được lấy về, nhưng việc ghi nợ classify chưa thể thực thi giá trị đó một cách nguyên tử.
const integration = new SendReputeBrevo({
sendreputeApiKey: process.env.SENDREPUTE_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY,
paidConsent: false,
expectedPriceMillicents: approvedMaximum,
ledgerDirectory: "/var/lib/my-app/sendrepute-brevo",
});
3. Sử dụng có chủ đích
Chỉ gọi send từ đường dẫn máy chủ được kiểm soát mà tại đó thực hiện cả classify và deliver. Tái sử dụng một sendKey ổn định cho mọi lần thử của cùng một email dự kiến. Cung cấp nội dung nội dòng cố định; không cung cấp Brevo template IDs, các tham số có thể thay đổi, lập lịch, hoặc các phiên bản tin nhắn. Các lệnh gửi được thực hiện ở nơi khác sẽ bỏ qua hoàn toàn trình bao bọc (wrapper) này.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Kết quả, lỗi và giới hạn
Kết quả Inbox nằm trong ngưỡng cho phép thực hiện một yêu cầu Brevo transactional API cho cùng một snapshot bất biến. Sổ cái thay đổi thành delivery-unknown trước khi nhà cung cấp gửi đi. Các lỗi timeout, ngắt kết nối, thành công sai định dạng, sự cố và từ chối từ nhà cung cấp không bao giờ được tự động thử lại; hãy đối soát chúng với hồ sơ Brevo trước khi đưa ra bất kỳ quyết định thủ công nào.
Luồng gửi có kiểm soát của BigMailer
0.1.0
Một wrapper Node.js 24+ cục bộ chưa công bố dành cho các lệnh gọi API giao dịch BigMailer rõ ràng. Nó không cài đặt vào BigMailer hoặc chặn việc gửi từ dashboard và các API không liên quan. Vì BigMailer sở hữu nội dung chiến dịch có thể chỉnh sửa từ xa, wrapper không thể chứng minh rằng chiến dịch vẫn giống với snapshot bản render do người gọi cung cấp giữa quá trình xem xét và phân phối.
Các công tắc enabled, sự đồng ý trả phí và xác nhận giới hạn mẫu từ xa đều mặc định tắt. Người gọi phải cung cấp và băm một bản chụp (snapshot) kết xuất đầy đủ, đóng băng chiến dịch từ xa tương ứng về mặt vận hành và cung cấp một deliveryKey bền vững. Giá được kiểm tra lại trước khi phân loại, nhưng API phân loại hiện tại không có trường expected-price nguyên tử. Các trạng thái phân phối trùng lặp, bị chặn, bị từ chối và mơ hồ không bao giờ tự động gửi lại.
Tải xuống mã nguồn ZIP thử nghiệm của BigMailer
1. Cài đặt
Giải nén tệp ZIP mã nguồn chưa công bố này vào ứng dụng máy chủ Node.js 24+ đã được kiểm soát và xem xét README.md cùng SECURITY.md. Nhập wrapper và FileDeliveryStore trực tiếp từ src. Đây không phải là bản cài đặt từ npm hay chợ ứng dụng BigMailer và không có các phụ thuộc runtime từ bên thứ ba.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-bigmailer.zip
unzip sendrepute-bigmailer.zip
cd sendrepute-bigmailer
node --check src/index.mjs
node --check src/file-delivery-store.mjs
2. Cấu hình bảo mật
Giữ enabled, paidConsent, và remoteTemplateSnapshotLimitationAcknowledged ở trạng thái false cho đến khi xem xét. Chỉ lưu trữ API keys, brand và campaign UUIDs ở phía máy chủ. Đặt FileDeliveryStore trên bộ lưu trữ bền vững riêng tư. Sao chép thông tin giá đã được xem xét vào expectedPricing, lưu ý rằng classify API hiện tại không thể khóa nó một cách nguyên tử.
const integration = createBigMailerIntegration({
enabled: false,
paidConsent: false,
remoteTemplateSnapshotLimitationAcknowledged: false,
sendReputeApiKey: process.env.SENDREPUTE_API_KEY,
bigMailerApiKey: process.env.BIGMAILER_API_KEY,
brandId,
campaignId,
expectedPricing,
deliveryStore: new FileDeliveryStore("/var/lib/my-app/bigmailer-deliveries.json"),
});
3. Sử dụng có chủ đích
Đối với mỗi lần gửi API được kiểm soát, hãy cung cấp một deliveryKey ổn định, tất cả các phương án text/plain và text/html được hiển thị, bản render snapshot chính xác và snapshotDigest(snapshot). Chỉ xác nhận giới hạn remote-template khi một kiểm soát vận hành đóng băng phiên bản chiến dịch BigMailer khớp với snapshot đó. Dashboard và các lần gửi API không liên quan sẽ bỏ qua trình bao bọc này.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Kết quả, lỗi và giới hạn
FileDeliveryStore sẽ dự trữ delivery key trước khi phân loại. Các kết quả gửi trùng lặp, xung đột, bị chặn, từ chối và không rõ ràng không thể tự động gửi lại. Điểm cuối gửi của BigMailer chấp nhận dữ liệu hợp nhất thay vì nội dung đã được kiểm tra, vì vậy việc phân loại thành công không phải là bằng chứng cho thấy nội dung chiến dịch từ xa có thể thay đổi vẫn còn khớp; hãy sử dụng nhà cung cấp khác khi yêu cầu sự liên kết chính xác.
Quyền riêng tư và các hoạt động trả phí
Việc phân tích sẽ gửi tên hiển thị của người gửi, tiêu đề và nội dung tin nhắn tới SendRepute. Người nhận và tệp đính kèm không được truyền riêng biệt, nhưng nội dung nằm trong thân thư sẽ được truyền đi. Giữ bí mật thông tin xác thực và tắt ghi nhật ký yêu cầu/nội dung. Không có đảm bảo về tỷ lệ vào hộp thư đến hoặc đảm bảo phân phát.
Việc phân loại là có trả phí. Đọc biểu giá hiện tại và giới hạn chi tiêu tài khoản của bạn trước khi chấp thuận. Một yêu cầu tài khoản/nội dung/mô hình giống hệt nhau có thể phát lại biên lai trong vòng 24 giờ; nội dung hoặc mô hình thay đổi có thể phát sinh phí mới. Đừng giả định rằng việc thử lại là miễn phí. Việc viết lại bằng AI yêu cầu báo giá mức phí tối đa cho biên lai gốc, chế độ và các điều khoản đã chọn trước khi gửi yêu cầu trả phí; hãy thăm dò tìm biên lai đang xử lý và khôi phục kết quả đã hoàn thành bằng ID yêu cầu ban đầu thay vì bắt đầu một yêu cầu khác. Viết lại tất cả (Rewrite All) có thể xác minh một bản nháp được kết xuất cuối cùng chính xác mà không bị trừ thêm phí. Việc tạo mẫu AI và quyền truy cập VIP gốc được tính giá riêng biệt; quá trình xử lý của trình xây dựng tiêu chuẩn là miễn phí. Không có kết quả phân tích, viết lại hoặc trình xây dựng nào đảm bảo việc phân phối, vị trí trong hộp thư đến hoặc tính tuân thủ.
Việc xác thực ngoại tuyến không phải là chứng nhận cho mọi phiên bản framework, plugin hay transport. Hãy đọc hướng dẫn cài đặt và bảo mật đi kèm, giữ cho tính năng phân tích trả phí ở trạng thái vô hiệu hóa cho đến khi được cấu hình có chủ đích, và kiểm tra chính sách xử lý lỗi đã chọn trước khi kích hoạt cho các email quan trọng.
Xem xét biểu phí
Tài liệu tham khảo Customer API
Yêu cầu hỗ trợ tích hợp