SendGrid - خطأ NoMethodError (لم يتم تعريف طريقة `[]` لصف nil:NilClass)

مرحباً،

لقد بدأت في استخدام SendGrid webhook مع مفتاح التحقق. الآن نحصل على الكثير من هذه الأخطاء. لقد أرسلت دعوة جماعية باستخدام SendGrid.

app/controllers/webhooks_controller.rb:29:in `block in sendgrid'
app/controllers/webhooks_controller.rb:24:in `each'
app/controllers/webhooks_controller.rb:24:in `sendgrid'
actionpack (7.0.7) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (7.0.7) lib/abstract_controller/base.rb:215:in `process_action'
actionpack (7.0.7) lib/action_controller/metal/rendering.rb:165:in `process_action'
actionpack (7.0.7) lib/abstract_controller/callbacks.rb:234:in `block in process_action'
activesupport (7.0.7) lib/active_support/callbacks.rb:107:in `run_callbacks'
actionpack (7.0.7) lib/abstract_controller/callbacks.rb:233:in `process_action'
actionpack (7.0.7) lib/action_controller/metal/rescue.rb:23:in `process_action'
actionpack (7.0.7) lib/action_controller/metal/instrumentation.rb:67:in `block in process_action'
activesupport (7.0.7) lib/active_support/notifications.rb:206:in `block in instrument'
activesupport (7.0.7) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (7.0.7) lib/active_support/notifications.rb:206:in `instrument'
actionpack (7.0.7) lib/action_controller/metal/instrumentation.rb:66:in `process_action'
actionpack (7.0.7) lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
activerecord (7.0.7) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack (7.0.7) lib/abstract_controller/base.rb:151:in `process'
actionview (7.0.7) lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler (3.1.1) lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
actionpack (7.0.7) lib/action_controller/metal.rb:188:in `dispatch'
actionpack (7.0.7) lib/action_controller/metal.rb:251:in `dispatch'
actionpack (7.0.7) lib/action_dispatch/routing/route_set.rb:49:in `dispatch'
actionpack (7.0.7) lib/action_dispatch/routing/route_set.rb:32:in `serve'
actionpack (7.0.7) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (7.0.7) lib/action_dispatch/journey/router.rb:32:in `each'
actionpack (7.0.7) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (7.0.7) lib/action_dispatch/routing/route_set.rb:852:in `call'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
rack (2.2.8) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.8) lib/rack/conditional_get.rb:40:in `call'
rack (2.2.8) lib/rack/head.rb:12:in `call'
actionpack (7.0.7) lib/action_dispatch/http/permissions_policy.rb:38:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
rack (2.2.8) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.8) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/cookies.rb:704:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (7.0.7) lib/active_support/callbacks.rb:99:in `run_callbacks'
actionpack (7.0.7) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/debug_exceptions.rb:28:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/show_exceptions.rb:29:in `call'
logster (2.13.1) lib/logster/middleware/reporter.rb:40:in `call'
railties (7.0.7) lib/rails/rack/logger.rb:40:in `call_app'
railties (7.0.7) lib/rails/rack/logger.rb:27:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/remote_ip.rb:93:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/request_id.rb:26:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
rack (2.2.8) lib/rack/method_override.rb:24:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/executor.rb:14:in `call'
rack (2.2.8) lib/rack/sendfile.rb:110:in `call'
actionpack (7.0.7) lib/action_dispatch/middleware/host_authorization.rb:131:in `call'
rack-mini-profiler (3.1.1) lib/mini_profiler.rb:260:in `call'
message_bus (4.3.8) lib/message_bus/rack/middleware.rb:60:in `call'
lib/middleware/request_tracker.rb:233:in `call'
railties (7.0.7) lib/rails/engine.rb:530:in `call'
railties (7.0.7) lib/rails/railtie.rb:226:in `public_send'
railties (7.0.7) lib/rails/railtie.rb:226:in `method_missing'
rack (2.2.8) lib/rack/urlmap.rb:74:in `block in call'
rack (2.2.8) lib/rack/urlmap.rb:58:in `each'
rack (2.2.8) lib/rack/urlmap.rb:58:in `call'
unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client'
unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop'
unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn (6.1.0) lib/unicorn/http_server.rb:143:in `start'
unicorn (6.1.0) bin/unicorn:128:in `<top (required)>'
vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `load'
vendor/bundle/ruby/3.2.0/bin/unicorn:25:in `<main>'

ENV

|REQUEST_URI|/webhooks/sendgrid|
|REQUEST_METHOD|POST|
|HTTP_USER_AGENT|SendGrid Event API|

يبدو أن هذا هو نفس المشكلة التي تم إصلاحها منذ فترة: Sendgrid error: NoMethodError (undefined method `[]' for nil:NilClass) - #3 by Terrapop

هل تم إنشاؤها لعمليات الارتداد من قائمتك التي ليست مستخدمي discourse؟

لست متأكدًا مما إذا كانت هذه ارتدادات، كيف يمكننا التحقق؟ من المرجح أن يكون ذلك حول الوقت الذي قمنا فيه بدعوة جماعية للمستخدمين غير المسجلين في ديسكورس.

قد يكون هناك خطأ ما في حمولة الحدث التي يتم تلقيها من Sendgrid. يبدو أن status لم يتم تعيينه في أحداث bounce كما هو متوقع.

بافتراض أنك حصلت على تتبع الخلفية من logster على \u003cYOUR_SITE\u003e/logs، يجب أن تحتوي علامة التبويب env على تفاصيل الطلب. هل يمكنك تقديم نسخة منقاة من الحمولة من هناك؟

لا يوجد الكثير من المعلومات هناك، معظمها وضعته هنا.

للإشارة الكاملة، وضعتها أدناه كما هو مطلوب

hostname serverhostname
process_id 248749
application_version a8d6dc4d3a5c3d937ff0bb162c93ec628428cda1
HTTP_HOST forum.URL.co.uk
REQUEST_URI /webhooks/sendgrid
REQUEST_METHOD POST
HTTP_USER_AGENT SendGrid Event API
HTTP_X_FORWARDED_FOR IPADDRESS
HTTP_X_REAL_IP IPADDRESS
time Su 5:54 pm

أنا آسف، كان يجب أن أكون أكثر تحديدًا. يحتوي نص الطلب على الأدلة اللازمة. يجب أن تكون قادرًا على العثور على هذا بعد صف time. قد تحتاج إلى التمرير لأعلى أو توسيع اللوحة لرؤية هذا.

مرحباً،

لا توجد معلومات إضافية بعد صف الوقت، لقد تحققت من جميع الأخطاء الـ 34. يبدو الأمر غريباً ولكنه غير مدرج؟

نعم، هذا غريب. هل يمكنك استرداد الحمولة من لوحة تحكم SendGrid بدلاً من ذلك؟

وفقًا لأحدث وثائق SendGrid webhooks، يجب أن يعمل نقطة النهاية الحالية في Discourse دون مشاكل ولكن الخطأ يشير إلى مشكلة في حمولة الطلب لذا ستكون العينة رائعة.

هل توصلت إلى حل لهذه المشكلة؟ لدي نفس الخطأ، في نفس السطر من التعليمات البرمجية:

أنا لست على دراية بلغة Ruby، ولكن يبدو أنها قادرة على تحليل JSON بشكل جيد حتى محاولة تحليل رمز الخطأ، Email::SMTP_STATUS_TRANSIENT_FAILURE يشير إلى:

لقد تحققت في Webhook.site مما ترسله Sendgrid فعليًا عندما أختبر الـ webhook، ويبدو أنه كالتالي للارتداد:

[
  {
    "email": "example@test.com",
    "timestamp": 1740136261,
    "smtp-id": "<14c5d75ce93.dfd.64b469@ismtpd-555>",
    "event": "bounce",
    "category": [
      "cat facts"
    ],
    "sg_event_id": "ovGQ2rRo8ytNezHPDq-7Ig==",
    "sg_message_id": "14c5d75ce93.dfd.64b469.filter0001.16648.5515E0B88.0",
    "reason": "500 unknown recipient",
    "status": "5.0.0"
  }
]

يبدو أنه يجب أن يعمل!

آها.. أجيب على سؤالي بنفسي، زر “اختبار التكامل” الخاص بـ Webhook يخدعك..

هذه هي الحمولة الفعلية إذا أرسلت بريدًا إلكترونيًا فعليًا إلى عنوان بريد إلكتروني غير موجود:

[
  {
    "bounce_classification": "Unclassified",
    "email": "noemail@this.does.not.exist.tld",
    "event": "bounce",
    "reason": "unable to get mx info: failed to get IPs from PTR record: lookup <nil>: unrecognized address",
    "sg_event_id": "Ym91bmNlLTQtNTA0ODUxOTUtZXVvMmlLeGRTYXlQRjRZRTQtLUk3QS0w",
    "sg_message_id": "euo2iKxdSayPF4YE4--I7A.recvd-5f54b5d587-pczjm-1-67BADEEA-6.0",
    "smtp-id": "<870b3a2a-160c-4fc8-bc9a-bd0d5b943b81@forum.umbraco.com>",
    "timestamp": 1740300320,
    "tls": 0,
    "type": "blocked"
  }
]

وهنا لدينا: لا يوجد حقل status.

هذا عندما أستخدم عن قصد نطاقًا غير موجود، أشعر أن هذا يجب معالجته، ربما يمكن أن يكون "type": "blocked" هو المؤشر الذي يبحث عنه Discourse.

كمحاولة مختلفة، وضعت شيئًا غير منطقي أمام outlook.com وهذا يعطيني حمولة عاملة:

[
  {
    "bounce_classification": "Invalid Address",
    "email": "oeihoiwehitwiohtriuweruiwerwierhwuerguiwerg@outlook.com",
    "event": "bounce",
    "ip": "149.72.1.78",
    "reason": "550 5.5.0 Requested action not taken: mailbox unavailable (S2017062302). [HK3PEPF0000021E.apcprd03.prod.outlook.com 2025-02-23T08:54:35.950Z 08DD502499E1A0AA]",
    "sg_event_id": "Ym91bmNlLTAtNTA0ODUxOTUtQWJFZ2pVejZUUFd3MnJNTnJabDg4Zy0w",
    "sg_message_id": "AbEgjUz6TPWw2rMNrZl88g.recvd-786d47b7ff-tsp86-1-67BAE249-D.0",
    "smtp-id": "<d8dc253e-6e9a-4418-8478-60780eb4898c@forum.umbraco.com>",
    "status": "5.5.0",
    "timestamp": 1740300876,
    "tls": 1,
    "type": "bounce"
  }
]

تم تقديم طلب سحب!

@cultiv شكراً لك على التعمق في المشكلة هنا وأخذ الوقت لتقديم طلب سحب. لقد استخدمت طلب السحب الخاص بك كأساس ودمجت إصلاحًا للمشكلة في FIX: No method error in `WebhooksController#sendgrid` (#31495) · discourse/discourse@209d289 · GitHub.

إعجابَين (2)

رائع، لقد كان ذلك مفيدًا جدًا. لم أكن لأتمكن من فعل كل ذلك بمفردي :sweat_smile:

شكرًا، لقد قمت بالتحديث ويقوم الاختبار اليدوي الآن بالأشياء بشكل صحيح، وسجل الأخطاء نظيف ويمكنني رؤية البريد المرتد في سجل البريد :raising_hands:

إعجاب واحد (1)