> ## Content Index
> Fetch the complete content index at: https://arabroot.io/llms.txt
> Use this file to discover other available public pages before exploring further.

# تثبيت listmonk لإدارة النشرات البريدية على خادمك
- URL: https://arabroot.io/articles/تثبيت-listmonk-للنشرات-البريدية/
- Published: 2026-09-27T19:50:00.000Z
- Updated: 2026-10-05T06:20:46.000Z
- Description: إذا كانت نشرتك البريدية تخرج اليوم من Gmail بخانة BCC أو من خدمة يرتفع سعرها مع كل مشترك، فسوف نثبت في هذا الدليل listmonk مع PostgreSQL على سيرفرك، ونربطه بمزود SMTP تختاره أنت، ثم نرسل أول حملة ونعالج الرسائل المرتدة، وتبقى قائمة المشتركين لديك.
- Author: فريق عرب رووت
- Tags: الأدلة التقنية, البريد الإلكتروني, الاستضافة الذاتية, listmonk

في هذا الدليل سوف نثبت [**listmonk**](https://listmonk.app/?ref=arabroot.io)، وهو برنامج مفتوح المصدر Open Source لإدارة النشرات البريدية Newsletters وقوائم المراسلة Mailing Lists، يأتي في ملف تنفيذي واحد Single Binary مكتوب بلغة Go ولا يحتاج إلا إلى [PostgreSQL](https://www.postgresql.org/?ref=arabroot.io)، ففيه قوائم عامة وخاصة مع تأكيد مزدوج للاشتراك double opt-in، وحملات Campaigns بمحرر مرئي Visual Editor أو HTML أو Markdown، وقوالب Templates بلغة Go templates، و[تقسيم المشتركين باستعلامات SQL](https://listmonk.app/docs/querying-and-segmentation/?ref=arabroot.io)، وإحصاءات الفتح والنقر، ومعالجة الرسائل المرتدة Bounces، و[واجهة برمجية API](https://listmonk.app/docs/apis/transactional/?ref=arabroot.io) للرسائل التعاملية transactional من تطبيقاتك. والسبب أن البديلين المعتادين لا يصمدان مع نمو القائمة، فخانة BCC في Gmail [يحدها](https://support.google.com/mail/answer/22839?ref=arabroot.io) خمسمئة مستلم في اليوم ولا يوجد فيها رابط لإلغاء الاشتراك Unsubscribe، وخدمات مثل [Mailchimp](https://mailchimp.com/pricing/marketing/?ref=arabroot.io) و[Brevo](https://www.brevo.com/?ref=arabroot.io) يرتفع سعرها مع كل جهة اتصال Contact وتبقى القائمة على سيرفراتها.

ولاحظ أن listmonk ليس خادم بريد Mail Server، وإنما يدير القوائم والحملات، والإرسال الفعلي يمر عبر خادم SMTP وسيط SMTP Relay تحدده أنت مثل [Amazon SES](https://aws.amazon.com/ses/?ref=arabroot.io)، وإذا كنت تحتاج إلى أتمتة تسويقية Marketing Automation بمسارات متعددة الخطوات فابق على خدمة متخصصة. أما لماذا لا ترسل النشرات من خادم البريد الأساسي لمؤسستك، فقد شرحناه في [دليل استضافة البريد الإلكتروني للمؤسسات](https://arabroot.io/articles/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D8%B3%D8%AA%D8%B6%D8%A7%D9%81%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%8A%D8%AF-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-%D9%84%D9%84%D9%85%D8%A4%D8%B3%D8%B3%D8%A7%D8%AA/).

وسوف نناقش في هذا المقال ما يلي:

- تثبيت listmonk مع PostgreSQL باستخدام Docker Compose، بسطر تشغيل واحد يثبت قاعدة البيانات مرة واحدة ويرقيها تلقائياً عند كل إصدار جديد.
- ربط النطاق عبر ال Reverse Proxy، ثم الإعداد الأول وإعداد SMTP.
- القوائم والمشتركون، وإرسال أول حملة، والقوالب، ومعالجة الرسائل المرتدة.
- النسخ الاحتياطي والاستعادة، والتحديث، وأشهر المشكلات وحلولها.

## المتطلبات

- خادم Linux بمعالج CPU واحد وذاكرة RAM بحجم 1 GB، وهذا يكفي لقوائم بعشرات الآلاف، والسبب أن listmonk نفسه لا يستهلك إلا عشرات الميغابايتات، وأغلب الذاكرة تذهب إلى PostgreSQL.
- Docker Engine مع ملحق Docker Compose، كما في [دليل تثبيت Docker على Ubuntu](https://arabroot.io/articles/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-docker-%D8%B9%D9%84%D9%89-ubuntu/).
- نطاق فرعي Subdomain مثل `lists.example.com` يشير إلى الخادم، وReverse Proxy يصدر شهادة TLS مثل [Nginx Proxy Manager](https://arabroot.io/articles/nginx-proxy-manager-%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-%D9%88%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-tls/)، ويجب أن يكون النطاق عاماً، والسبب أن روابط إلغاء الاشتراك وتتبع النقرات Click Tracking في كل رسالة تستخدمه.
- حساب SMTP للإرسال الجماعي Bulk Sending، مع سجلات SPF وDKIM وDMARC لنطاق المرسل Sender Domain كما شرحناها في [شرح SPF وDKIM وDMARC للمبتدئين](https://arabroot.io/articles/%D8%B4%D8%B1%D8%AD-spf-%D9%88-dkim-%D9%88-dmarc-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86/)، والأفضل أن تخصص للنشرات نطاقاً فرعياً مثل `news.example.com`، حتى لا تتأثر سمعة Reputation البريد الأساسي للشركة إذا اشتكى بعض المشتركين من رسائلك.

## التثبيت

### المجلد وملف الأسرار Secrets

أول خطوة هي أن ننشئ مجلد التثبيت ومجلد الملفات المرفوعة:

```bash
sudo mkdir -p /opt/listmonk/uploads
cd /opt/listmonk
```

بعد ذلك نولد كلمة مرور لقاعدة البيانات Database وأخرى للمدير الأول، ونحفظهما في الملف `.env` المقروء للمالك فقط، والسبب أننا لا نريد أن نكتب كلمات المرور داخل ملف Compose فتظهر في كل نسخة منه:

```bash
sudo tee /opt/listmonk/.env >/dev/null <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
LISTMONK_ADMIN_USER=admin
LISTMONK_ADMIN_PASSWORD=$(openssl rand -base64 18)
EOF
sudo chmod 600 /opt/listmonk/.env
sudo cat /opt/listmonk/.env
```

احتفظ بكلمة مرور المدير التي تظهر لك لأنك سوف تحتاجها عند الدخول الأول، ولاحظ أن listmonk يقرأ متغيرات البيئة Environment Variables `LISTMONK_ADMIN_USER` و`LISTMONK_ADMIN_PASSWORD` في التثبيت الأول فقط لينشئ حساب المدير Super Admin، وإذا تركتهما فارغين فسوف يطلب منك إنشاء الحساب من المتصفح عند الزيارة الأولى، كما يوضح [دليل التثبيت الرسمي](https://listmonk.app/docs/installation/?ref=arabroot.io).

### ملف docker-compose.yml

بنينا هذا الملف على [الملف الرسمي للإصدار 6.2.0](https://github.com/knadh/listmonk/blob/v6.2.0/docker-compose.yml?ref=arabroot.io)، وغيرنا فيه أربعة أمور: ثبتنا الوسوم Tags بدل `latest`، ونقلنا كلمة المرور إلى `.env`، وربطنا المنفذ بالعنوان المحلي localhost خلف ال Reverse Proxy، وجعلنا التطبيق ينتظر جاهزية Readiness قاعدة البيانات. افتح الملف:

```bash
sudo nano /opt/listmonk/docker-compose.yml
```

والملف سوف يكون كما يلي:

```yaml
name: listmonk

services:
  app:
    image: listmonk/listmonk:v6.2.0
    restart: unless-stopped
    ports:
      - "127.0.0.1:9000:9000"
    hostname: lists.example.com
    depends_on:
      db:
        condition: service_healthy
    command: [sh, -c, "./listmonk --install --idempotent --yes --config '' && ./listmonk --upgrade --yes --config '' && ./listmonk --config ''"]
    environment:
      LISTMONK_app__address: 0.0.0.0:9000
      LISTMONK_db__host: db
      LISTMONK_db__port: 5432
      LISTMONK_db__user: listmonk
      LISTMONK_db__password: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
      LISTMONK_db__database: listmonk
      LISTMONK_db__ssl_mode: disable
      LISTMONK_db__max_open: 25
      LISTMONK_db__max_idle: 25
      LISTMONK_db__max_lifetime: 300s
      TZ: Etc/UTC
      LISTMONK_ADMIN_USER: ${LISTMONK_ADMIN_USER:-}
      LISTMONK_ADMIN_PASSWORD: ${LISTMONK_ADMIN_PASSWORD:-}
    volumes:
      - ./uploads:/listmonk/uploads:rw

  db:
    image: postgres:17.11-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: listmonk
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
      POSTGRES_DB: listmonk
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U listmonk -d listmonk"]
      interval: 10s
      timeout: 5s
      retries: 6
    volumes:
      - listmonk-data:/var/lib/postgresql/data

volumes:
  listmonk-data:
```

أهم سطر في هذا الملف هو `command`، وفهمه يجنبك أشهر خطأ في تثبيتات listmonk القديمة، حيث كانت الأدلة السابقة تستخدم `yes | ./listmonk --install` ثم تطلب منك تعديل هذا السطر بعد التشغيل الأول، والسبب أن تكرار `--install` بهذا الشكل يمسح قاعدة البيانات في كل مرة يعاد فيها إنشاء ال Container، ومن ينسى التعديل يكتشف ذلك بعد أول تحديث. أما السطر الحالي فيجمع ثلاث خطوات آمنة، وفي الإعداد أعلاه لاحظ التالي:

- `--install --idempotent`: ينشئ الجداول Tables فقط إذا كانت قاعدة البيانات فارغة، وفي التشغيلات اللاحقة يكتب في السجل أن القاعدة مثبتة مسبقاً ويتجاوز التثبيت.
- `--upgrade`: ينفذ ترحيلات Migrations قاعدة البيانات حين تسحب إصداراً أحدث، ولا أثر له إذا كانت القاعدة محدثة.
- `--config ''`: يجعل listmonk يقرأ إعداداته من متغيرات `LISTMONK_*` وحدها وليس من الملف `config.toml`، والمتغير `LISTMONK_db__host` مثلاً يقابل المفتاح `host` في القسم `[db]`، وتجد قائمة هذه المتغيرات في [توثيق الإعدادات](https://listmonk.app/docs/configuration/?ref=arabroot.io).
- منفذ الويب مربوط بالعنوان `127.0.0.1` فقط، والسبب أن ال Reverse Proxy وحده هو الذي يصل إليه، فلا يفتح أحد لوحة الإدارة عبر HTTP غير مشفر.

وبقية الإعدادات مثل SMTP والنطاق والرسائل المرتدة يحفظها listmonk في قاعدة البيانات، وتديرها أنت من الواجهة كما سيأتي.

### التشغيل

الآن سوف نقوم بتشغيل الخدمتين ومتابعة سجل التطبيق:

```bash
cd /opt/listmonk
sudo docker compose up -d
sudo docker compose logs -f app
```

وعند التشغيل الأول سوف تجد في السجل Logs السطر `creating superadmin user 'admin'`، ثم السطر `no upgrades to run. Database is up to date.` وهو ناتج خطوة `--upgrade`، وأخيراً السطر `http server started on [::]:9000` الذي يعني أن التطبيق جاهز. بعد ذلك تحقق أن الخدمة تعمل:

```bash
curl -s http://127.0.0.1:9000/health
```

والمخرج سوف يكون `{"data":true}`.

### ربط النطاق عبر ال Reverse Proxy

في Nginx Proxy Manager أنشئ مضيفاً Proxy Host للنطاق `lists.example.com` يوجه إلى المنفذ `9000` على الخادم، مع شهادة Let's Encrypt وخيار Force SSL، ولأن رفع ملفات CSV كبيرة لاستيراد المشتركين قد يتجاوز الحد الافتراضي لحجم الطلب Request Body Size، فأضف في تبويب Advanced [الإعداد التالي](https://nginx.org/en/docs/http/ngx%5Fhttp%5Fcore%5Fmodule.html?ref=arabroot.io#client%5Fmax%5Fbody%5Fsize):

```nginx
client_max_body_size 50m;
```

وإذا كنت تستخدم [Caddy](https://caddyserver.com/docs/caddyfile/directives/reverse%5Fproxy?ref=arabroot.io) فيكفيك ما يلي:

```nginx
lists.example.com {
    reverse_proxy 127.0.0.1:9000
}
```

## الإعداد الأول

### الإعدادات العامة

ادخل إلى `https://lists.example.com/admin` بحساب المدير، وابدأ بضبط ما يلي في **Settings ← General**:

- **Root URL:** العنوان العام `https://lists.example.com` دون شرطة مائلة في آخره، والقيمة الافتراضية هي `http://localhost:9000`، فإذا نسيت تغييرها خرجت روابط إلغاء الاشتراك والتتبع في كل رسائلك معطلة.
- **Default from email:** اسم المرسل وعنوانه، مثل `Example Co Newsletter <newsletter@example.com>`، ويجب أن يكون العنوان من نطاق ضبطت له SPF وDKIM لدى مزود SMTP.
- **Admin notification e-mails:** عنوان يصله إشعار عند انتهاء الحملات أو اكتمال الاستيراد.
- إذا كانت لديك قوائم عامة، ففعل من قسم **Subscriptions** صفحة الاشتراك العامة وإرسال رسالة تأكيد الاشتراك.

![الإعدادات العامة في listmonk وفيها Root URL وعنوان المرسل](https://arabroot.io/content/images/2026/09/listmonk-01-settings-general.webp)

Settings ← General: عنوان التثبيت العام وعنوان المرسل الافتراضي

ثم أنشئ من **Users** حسابات منفصلة لفريق التسويق بأدوار Roles محدودة الصلاحيات Permissions، ولا تقم بمشاركة حساب المدير بين الجميع، والسبب أنك لن تعرف من أرسل ماذا، ولن تستطيع سحب صلاحية شخص واحد دون تغيير كلمة المرور على الكل، والخيارات المتاحة مشروحة في [توثيق الأدوار والصلاحيات](https://listmonk.app/docs/roles-and-permissions/?ref=arabroot.io).

### إعداد SMTP

من **Settings ← SMTP** تضيف خادماً واحداً أو أكثر، وإذا فعلت عدة خوادم فإن listmonk يوزع الرسائل بينها، وهذا مفيد حين يكون لكل حساب حد يومي للإرسال Sending Limit. وتحت حقول الخادم أزرار جاهزة لمزودين مثل Gmail وAmazon SES وMailgun وSendgrid وPostmark تملأ المضيف والمنفذ لكل منهم، والقيم المعتادة كما يلي:

| الحقل                 | القيمة المعتادة                                                                  |
| --------------------- | -------------------------------------------------------------------------------- |
| Host                  | smtp.example.com أو خادم مزودك                                                   |
| Port و TLS            | 587 مع STARTTLS، أو 465 مع TLS                                                   |
| Auth protocol         | LOGIN أو PLAIN بحسب المزود                                                       |
| Username و Password   | بيانات حساب الإرسال، أو مفتاح SMTP الذي يصدره المزود                             |
| Max. connections      | عدد الاتصالات المتوازية Concurrent Connections، على ألا يتجاوز ما يسمح به المزود |
| Retries و Retry delay | إعادة المحاولة حين يفشل إرسال رسالة فشلاً مؤقتاً                                 |

![إعدادات خادم SMTP في listmonk](https://arabroot.io/content/images/2026/09/listmonk-02-settings-smtp.webp)

إعداد SMTP يوجه هنا إلى Mailpit، وهو خادم تجريبي محلي. أما في الإنتاج (Production) فضع خادم مزودك مع STARTTLS أو TLS

⚠️

يرفض listmonk إرسال كلمة المرور عبر اتصال غير مشفر، فإذا وجهته إلى خادم لا يدعم TLS مع المصادقة Authentication `PLAIN` فسوف تفشل رسائل الحملة كلها ويظهر في السجل الخطأ `unencrypted connection`، ومع ذلك تظهر الحملة بحالة «Finished» وعدد الرسائل المرسلة 0\. لذلك استخدم STARTTLS أو TLS مع أي مزود حقيقي، وأما مع خادم تجريبي محلي غير مشفر فاجعل قيمة Auth protocol هي `none`.

بعد الحفظ يعيد listmonk تحميل إعداداته تلقائياً، وبعد الإرسال الأول راجع السجل لتتأكد أنه تم دون أخطاء:

```bash
cd /opt/listmonk
sudo docker compose logs --tail=50 app
```

### القوائم والمشتركون

القائمة List هي مجموعة المشتركين التي ترسل إليها الحملة، والمشترك الواحد قد ينتمي إلى عدة قوائم. أنشئ قائمة من **Lists ← New**:

- **Type:** القائمة من نوع `Public` تظهر في صفحة الاشتراك العامة وفي نماذج الاشتراك Signup Forms، والنوع `Private` للقوائم الداخلية التي تديرها أنت وحدك.
- **Opt-in:** مع `Double opt-in` تصل المشترك رسالة تأكيد، ولا يرسل listmonk الحملات إلا لمن أكد اشتراكه، والسبب في أهمية ذلك أن أي شخص يستطيع أن يكتب في نموذج الاشتراك عنواناً ليس له أو عنواناً وهمياً، والرسائل إلى هذه العناوين ترتد أو تتحول إلى شكاوى تضر سمعة الإرسال، لذلك هو الخيار الموصى به للقوائم العامة.

![نافذة إنشاء قائمة جديدة في listmonk](https://arabroot.io/content/images/2026/09/listmonk-03-new-list.webp)

قائمة عامة بتأكيد مزدوج للاشتراك

أضف المشتركين يدوياً من **Subscribers ← New**، أو استوردهم دفعة واحدة من **Subscribers ← Import** بملف CSV فيه العمودان `email` و`name` على الأقل، أو عبر ال API من تطبيقك، وعند الاستيراد إلى قائمة بتأكيد مزدوج يمكنك اعتبار المستوردين مؤكدين إذا كانوا قد وافقوا مسبقاً في نظامك السابق. وصفحة **Lists** تعرض كل قائمة مع عدد مشتركيها:

![قائمة القوائم في listmonk مع أعداد المشتركين](https://arabroot.io/content/images/2026/09/listmonk-04-lists.webp)

القائمة Monthly Newsletter بخمسة مشتركين مؤكدين، إلى جانب القائمتين التجريبيتين اللتين ينشئهما listmonk عند التثبيت

لاحظ أن القائمتين `Default list` و`Opt-in list` والحملة `Test campaign` بيانات تجريبية ينشئها التثبيت، فاحذفها قبل أن تبدأ العمل الفعلي حتى لا ترسل إليها حملة بالخطأ.

### إنشاء حملة وإرسالها

من **Campaigns ← Create new** أدخل اسماً داخلياً للحملة وعنوان الرسالة Subject، واختر القائمة، ثم اضغط **Continue**:

![نموذج إنشاء حملة جديدة](https://arabroot.io/content/images/2026/09/listmonk-05-new-campaign.webp)

بيانات الحملة الأساسية، ومربع Send test message على اليمين

في تبويب **Content** تكتب الرسالة بالمحرر المرئي أو بلغة HTML أو Markdown أو نصاً عادياً، وتختار القالب، ويمكنك أن تستخدم في النص [متغيرات المشترك](https://listmonk.app/docs/templating/?ref=arabroot.io) مثل `{{ .Subscriber.FirstName }}` للاسم الأول، و`{{ .Subscriber.Attribs.city }}` لأي خاصية Attribute محفوظة في بيانات المشترك:

![محرر محتوى الحملة مع متغير اسم المشترك](https://arabroot.io/content/images/2026/09/listmonk-06-campaign-content.webp)

محتوى الحملة مع المتغير `{{ .Subscriber.FirstName }}` وزر Preview للمعاينة

وقبل الإرسال الفعلي أرسل نسخة تجريبية إلى عنوانك من مربع **Send test message** في تبويب Campaign، ولاحظ أن العنوان يجب أن يكون لمشترك موجود في listmonk، ثم افحص الشكل والروابط على الهاتف والحاسوب، وبعد ذلك اضغط **Start campaign** وأكد الإرسال. وسوف يعرض listmonk تقدم الإرسال وعدد الرسائل المرسلة، ويمكنك إيقاف الحملة مؤقتاً ثم استئنافها:

![قائمة الحملات مع حملة منتهية أرسلت خمس رسائل](https://arabroot.io/content/images/2026/09/listmonk-07-campaigns.webp)

الحملة بحالة Finished وقد أرسلت 5 من 5

والصورة التالية تبين إحدى الرسائل كما وصلت إلى Mailpit، حيث حل اسم المشتركة محل المتغير، وفي أسفل الرسالة رابطان يضيفهما القالب الافتراضي، أحدهما لإلغاء الاشتراك والآخر للعرض في المتصفح:

![رسالة الحملة كما التقطها Mailpit](https://arabroot.io/content/images/2026/09/listmonk-08-received-email.webp)

الرسالة المستلمة، مع ترويسة (Header) List-Unsubscribe التي تظهر زراً باسم Unsubscribe في برامج البريد

ويضيف listmonk إلى كل رسالة ترويسة `List-Unsubscribe` تلقائياً ومعها الترويسة `List-Unsubscribe-Post: List-Unsubscribe=One-Click` التي تسمح بإلغاء الاشتراك بنقرة واحدة One-Click Unsubscribe وفق [المعيار RFC 8058](https://www.rfc-editor.org/rfc/rfc8058?ref=arabroot.io)، وهذا مهم لأن [Gmail](https://support.google.com/a/answer/81126?ref=arabroot.io) و[Yahoo](https://senders.yahooinc.com/best-practices/?ref=arabroot.io) تشترطان على من يرسل 5000 رسالة أو أكثر في اليوم أن يدعم إلغاء الاشتراك بنقرة واحدة، وأن يضبط SPF وDKIM وDMARC، وأن تبقى نسبة البلاغات عن البريد المزعج تحت 0.3%. لذلك لا تقم بحذف رابط إلغاء الاشتراك من القوالب، ولا تقم بتعطيل الخيار الذي يضيف هذه الترويسة في إعدادات الخصوصية Privacy.

### القوالب

من **Campaigns ← Templates** تدير قوالب الحملات والرسائل التعاملية، والقالب ملف HTML فيه الترويسة والتذييل Footer وشعار الشركة، ويضع listmonk محتوى الحملة مكان الوسم `{{ template "content" . }}`. انسخ القالب الافتراضي وعدله بدلاً من الكتابة من الصفر، ثم اجعله القالب الافتراضي للحملات الجديدة:

![قائمة القوالب في listmonk](https://arabroot.io/content/images/2026/09/listmonk-09-templates.webp)

القوالب الافتراضية: قالب حملة، وقالب أرشيف، وقالب تعاملي، وقالب مرئي تحرره بالسحب والإفلات (Drag and Drop)

أما القوالب التعاملية Transactional فتستخدمها تطبيقاتك لإرسال رسائل فردية عبر `POST /api/tx`، مثل رسالة ترحيب أو إشعار، وتعتمد على إعدادات SMTP نفسها.

### معالجة الرسائل المرتدة

الرسائل المرتدة bounces هي رسائل ترفضها الخوادم المستقبلة، فإذا كان العنوان غير موجود فهذا ارتداد دائم hard، وإذا كان الصندوق ممتلئاً مؤقتاً فهذا ارتداد مؤقت soft، والشكاوى complaints تصل حين يصنف المستلم رسالتك بريداً مزعجاً Spam. والاستمرار في الإرسال إلى هذه العناوين هو أسرع طريق إلى إيقاف حسابك لدى مزود الإرسال، لذلك فعل المعالجة من **Settings ← Bounces** وفق [توثيق الرسائل المرتدة](https://listmonk.app/docs/bounces/?ref=arabroot.io):

![إعدادات معالجة الارتدادات في listmonk](https://arabroot.io/content/images/2026/09/listmonk-10-bounces.webp)

عدد الارتدادات قبل اتخاذ إجراء لكل نوع (soft وhard وcomplaint)، ومصدر الارتدادات: webhooks أو صندوق بريد

- **الإجراءات:** القيم الافتراضية معقولة، فلا يتخذ listmonk أي إجراء بعد ارتدادين مؤقتين، ويحظر العنوان Blocklist بعد ارتداد دائم واحد أو شكوى واحدة، والخيار `Delete` يحذف المشترك نهائياً.
- **Bounce webhooks:** الطريقة الأفضل مع مزودي الإرسال، حيث يرسل المزود الرسائل المرتدة مباشرة إلى listmonk، والمسارات المدعومة هي `/webhooks/service/ses` لخدمة Amazon SES عبر SNS، و`/webhooks/service/sendgrid`، و`/webhooks/service/postmark`، و`/webhooks/service/forwardemail`، و`/webhooks/service/lettermint`، و`/webhooks/service/azure`، ومسار عام `/webhooks/bounce` لأي نظام آخر، وهذا المسار العام يحتاج إلى بيانات مستخدم API في كل طلب.
- **Bounce mailbox:** إذا كنت ترسل عبر خادمك الخاص، فأنشئ صندوقاً مثل `bounces@example.com` واجعله عنوان Return-Path، ودع listmonk يقرؤه عبر POP3 ويحلل الرسائل المرتدة فيه.

## التحقق من النجاح

- لا تظهر أخطاء SMTP في **Settings ← Logs** بعد إرسال رسالة تجريبية.
- أرسل رسالة تجريبية إلى Gmail وافتح **Show original**، وسوف تجد أن SPF وDKIM وDMARC بحالة `PASS`، وأن روابط إلغاء الاشتراك تشير إلى `https://lists.example.com`.
- اشترك بعنوان تجريبي من صفحة الاشتراك العامة `https://lists.example.com/subscription/form`، وتأكد أن رسالة التأكيد وصلت وأنك صرت مؤكداً بعد النقر على رابطها.

نقطة فحص الصحة Health Check Endpoint تستجيب، وقاعدة البيانات تعمل بسلامة:

```bash
curl -s https://lists.example.com/health
cd /opt/listmonk
sudo docker compose ps
```

## النسخ الاحتياطي والاستعادة Restore

كل بيانات listmonk موجودة في PostgreSQL، أي المشتركين والقوائم والحملات والقوالب والإعدادات، ويضاف إليها المجلد `uploads` وفيه الصور المرفوعة في الحملات، لذلك نأخذ النسخة الاحتياطية Backup لقاعدة البيانات بالأداة [pg\_dump](https://www.postgresql.org/docs/17/app-pgdump.html?ref=arabroot.io) ونضع معها المجلد والملفين `.env` و`docker-compose.yml`:

```bash
sudo mkdir -p /opt/backup/listmonk
cd /opt/listmonk
sudo docker compose exec -T db pg_dump -U listmonk -Fc listmonk | sudo tee /opt/backup/listmonk/listmonk-$(date +%F).dump >/dev/null
sudo tar czf /opt/backup/listmonk/uploads-$(date +%F).tgz -C /opt/listmonk uploads .env docker-compose.yml
```

وللاستعادة على خادم جديد ضع الملفات في أماكنها، وشغل قاعدة البيانات وحدها وانتظر حتى تظهر بحالة `healthy` في `docker compose ps`، ثم استورد النسخة بالأداة [pg\_restore](https://www.postgresql.org/docs/17/app-pgrestore.html?ref=arabroot.io)، وبعد ذلك شغل التطبيق:

```bash
cd /opt/listmonk
sudo tar xzf /opt/backup/listmonk/uploads-2026-09-26.tgz -C /opt/listmonk
sudo docker compose up -d db
sudo docker compose exec -T db pg_restore -U listmonk -d listmonk --clean --if-exists --no-owner < /opt/backup/listmonk/listmonk-2026-09-26.dump
sudo docker compose up -d
```

ولاحظ أن التطبيق يبدأ بعد الاستعادة دون أن يمس البيانات، والسبب أن `--install --idempotent` يجد الجداول موجودة فيتجاوز التثبيت.

📌

في 11 يناير 2023 اكتشف فريق الأمن في Mailchimp أن مهاجماً يصل إلى إحدى أدواته الداخلية، بعد هجوم هندسة اجتماعية Social Engineering على موظفين ومتعاقدين حصل منه على بيانات دخولهم، ومن خلالها وصل إلى 133 حساباً من حسابات العملاء، كما ذكرت الشركة في [بيانها الرسمي](https://mailchimp.com/newsroom/january-2023-security-incident/?ref=arabroot.io). والدرس هنا أن قائمة المشتركين على خدمة سحابية يحميها موظفو تلك الخدمة أيضاً وليس أنت وحدك، وفي المقابل فإن القائمة على سيرفرك تجعل حمايتها ونسخها مسؤوليتك بالكامل.

وقائمة المشتركين بيانات شخصية Personal Data، لذلك شفر كل نسخة تخرج من الخادم، وأداة [restic](https://restic.net/?ref=arabroot.io) تفعل ذلك افتراضياً، وحدد مدة احتفاظ Retention بالنسخ تتوافق مع سياسة الخصوصية Privacy Policy لديك.

## التحديث Upgrade إلى إصدار أحدث

بفضل الخيار `--upgrade` في سطر التشغيل صارت الترقية ثلاث خطوات: نسخة احتياطية، ثم تغيير الوسم، ثم سحب ال Image وإعادة التشغيل، وسوف يرحل listmonk قاعدة البيانات تلقائياً عند الإقلاع، كما يبين [دليل الترقية الرسمي](https://listmonk.app/docs/upgrade/?ref=arabroot.io):

```bash
cd /opt/listmonk
sudo docker compose exec -T db pg_dump -U listmonk -Fc listmonk | sudo tee /opt/backup/listmonk/before-upgrade.dump >/dev/null
sudo sed -i 's|listmonk/listmonk:v6.2.0|listmonk/listmonk:v6.3.0|' docker-compose.yml
sudo docker compose pull app
sudo docker compose up -d
sudo docker compose logs --tail=30 app
```

ضع مكان `v6.3.0` الإصدار المستقر Stable الذي تريده من [صفحة الإصدارات على GitHub](https://github.com/knadh/listmonk/releases?ref=arabroot.io)، واقرأ ملاحظاته أولاً، والسبب أن الإصدارات الرئيسية Major Versions تغير أحياناً طريقة الدخول والصلاحيات، فالإصدار 4 نقل المستخدمين إلى قاعدة البيانات مع صفحة دخول جديدة، والإصدار [6.0.0](https://github.com/knadh/listmonk/releases/tag/v6.0.0?ref=arabroot.io) أضاف التحقق بخطوتين 2FA وأغلق ثغرة في الصلاحيات. ولا تستخدم الوسمين `latest` أو `nightly`، ولا تقم بالترقية أثناء إرسال حملة، بل أوقفها مؤقتاً أو انتظر انتهاءها.

وإذا كان تثبيتك القديم يستخدم السطر `yes | ./listmonk --install`، فضع مكانه السطر الحالي المذكور أعلاه قبل أي ترقية، وإلا فقد تفقد بياناتك عند إعادة إنشاء ال Container.

## مشكلات شائعة وحلولها

### انتهت الحملة وعدد الرسائل المرسلة صفر

افتح **Settings ← Logs** أو سجل ال Container، فالخطأ `unencrypted connection` يعني أن المصادقة تجري دون TLS فاضبط STARTTLS أو TLS، والخطأ `535 Authentication failed` يعني أن البيانات خاطئة أو أن المزود يطلب كلمة مرور خاصة بالتطبيق، وGmail مثلاً تطلب [App Password](https://support.google.com/accounts/answer/185833?ref=arabroot.io) مع تفعيل التحقق بخطوتين 2FA، والخطأ `i/o timeout` يعني أن المزود يحجب المنفذ أو أن جدار الحماية Firewall يمنع الاتصال الصادر Outbound. وتذكر أن حملات القوائم ذات التأكيد المزدوج لا تصل إلا إلى المشتركين المؤكدين، فإذا كان كل المشتركين بانتظار التأكيد فلن يرسل listmonk شيئاً.

### روابط إلغاء الاشتراك تفتح localhost

السبب أن قيمة **Root URL** ما زالت على وضعها الافتراضي، فغيرها إلى العنوان العام واحفظ الإعداد، ولاحظ أن الرسائل التي أرسلت قبل التغيير تبقى بروابطها القديمة.

### الرسائل تصل إلى مجلد البريد المزعج

تحقق من سجلات SPF وDKIM وDMARC لنطاق عنوان المرسل لدى مزود SMTP، وابدأ بكميات صغيرة إذا كان الحساب جديداً، وتأكد أن المشتركين وافقوا فعلاً على الاشتراك. وإذا كان المزود يفرض حداً للإرسال، فخفض سرعة الإرسال Sending Rate من **Settings ← Performance**، أي عدد الاتصالات والرسائل في الثانية، كما يشرح [توثيق الأداء](https://listmonk.app/docs/maintenance/performance/?ref=arabroot.io).

### اختفت البيانات بعد إعادة إنشاء ال Container

هذا بالضبط ما يفعله السطر القديم `yes | ./listmonk --install` في كل تشغيل، فاستعد آخر نسخة احتياطية واستخدم السطر الحالي الذي فيه `--install --idempotent`.

### فشل رفع الصور أو ملفات الاستيراد

إذا ظهر الخطأ `413` من ال Reverse Proxy فارفع قيمة `client_max_body_size`، وإذا فشل رفع الصور بخطأ في الصلاحيات فتأكد أن المجلد `/opt/listmonk/uploads` موجود وأن ال Container يستطيع الكتابة فيه.

## الخلاصة

- الإرسال من Gmail بخانة BCC يتوقف عند 500 مستلم في اليوم ولا يعطيك إلغاء اشتراك ولا متابعة للرسائل المرتدة، والخدمات السحابية ترفع السعر مع كل مشترك وتبقي القائمة لديها، وlistmonk مع مزود SMTP تختاره أنت يحل المشكلتين.
- السطر `--install --idempotent` ثم `--upgrade` في `command` يجعل التثبيت مرة واحدة والترقية تلقائية، فلا تستخدم السطر القديم `yes | ./listmonk --install` إطلاقاً.
- غير Root URL قبل أول حملة، واستخدم STARTTLS أو TLS مع المزود، وفعل التأكيد المزدوج للقوائم العامة.
- لا تحذف رابط إلغاء الاشتراك ولا ترويسة One-Click، وفعل معالجة الرسائل المرتدة عبر webhooks المزود، والسبب أن Gmail وYahoo قد يرفضان رسائل من لا يلتزم بذلك أو يحولانها إلى البريد المزعج.
- خذ نسخة احتياطية مشفرة بالأداة `pg_dump` قبل كل ترقية، فالقائمة الآن مسؤوليتك أنت.

## سجل التحديثات

- أكتوبر 2026: مراجعة تقنية وإعادة صياغة، مع اختبار التثبيت والتأكيد المزدوج وإرسال حملة إلى Mailpit والنسخ الاحتياطي والاستعادة من جديد، وما زال [listmonk 6.2.0](https://github.com/knadh/listmonk/releases/tag/v6.2.0?ref=arabroot.io) أحدث إصدار مستقر.
- سبتمبر 2026: كتابة الدليل واختباره على [listmonk 6.2.0](https://github.com/knadh/listmonk/releases/tag/v6.2.0?ref=arabroot.io).