Proxy4Smtp SOCKS5 service unreachable on port 1081 (all IPs timeout)

Author: yzoamCreated Jan 16, 2026Updated Jan 19, 2026

Email to check

gmail.com

From where did you run check-if-email-exists?

Self-hosted Docker on Advin VPS using reacherhq/commercial-license-trial:latest

Version of check-if-email-exists (if running it yourself)

reacherhq/commercial-license-trial:latest (v0.11.6)

What happened?

Summary

The built-in Proxy4Smtp SOCKS5 proxy is unreachable on port 1081. All email verifications return is_reachable: "unknown" with a SOCKS5 timeout error.

Error Message

json
{
  "is_reachable": "unknown",
  "smtp": {
    "error": {
      "type": "Socks5",
      "message": "i/o error: Operation timed out (os error 110)"
    }
  }
}

Investigation

I tested connectivity to all Proxy4Smtp IPs from multiple environments:

IP Ping Port 1081
51.89.178.174 (default in docker image) Success Timeout
46.166.184.114 (from DNS) Success Timeout
185.206.180.90 (from DNS) Success Timeout/Refused

Tests were run from:

  • My local machine (Archlinux)
  • A VPS (Advin - verified ports 1080/1081 are NOT firewalled by provider)
bash
# Ping works
$ ping -c1 51.89.178.174
64 bytes from 51.89.178.174: icmp_seq=1 ttl=43 time=108 ms

# Port 1081 times out
$ nc -vz -w5 51.89.178.174 1081
nc: connect to 51.89.178.174 port 1081 (tcp) timed out

Proxy Config (from debug logs)

host: "51.89.178.174"
port: 1081
username: "verify"
password: "verify"

docker-compose file

yaml
services:
  # RabbitMQ - Job Queue
  rabbitmq:
    image: rabbitmq:4.0-management
    container_name: reacher-rabbitmq
    restart: unless-stopped
    networks:
      - reacher-internal
    environment:
      RABBITMQ_DEFAULT_USER: ${REACHER_RABBITMQ_USER:-reacher}
      RABBITMQ_DEFAULT_PASS: ${REACHER_RABBITMQ_PASS}
    healthcheck:
      test: rabbitmq-diagnostics -q ping
      interval: 10s
      timeout: 5s
      retries: 5

  postgres:
    image: postgres:14
    container_name: reacher-postgres
    restart: unless-stopped
    networks:
      - reacher-internal
    environment:
      POSTGRES_USER: ${REACHER_POSTGRES_USER:-reacher}
      POSTGRES_PASSWORD: ${REACHER_POSTGRES_PASSWORD}
      POSTGRES_DB: ${REACHER_POSTGRES_DB:-reacher_db}
    volumes:
      - reacher-postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${REACHER_POSTGRES_USER:-reacher} -d ${REACHER_POSTGRES_DB:-reacher_db}"]
      interval: 10s
      timeout: 5s
      retries: 5

  reacher-api:
    image: reacherhq/commercial-license-trial:latest
    container_name: reacher-api
    restart: unless-stopped
    networks:
      - proxy
      - reacher-internal
    depends_on:
      rabbitmq:
        condition: service_healthy
      postgres:
        condition: service_healthy
    environment:
      - RCH__COMMERCIAL_LICENSE_TRIAL__API_TOKEN=${REACHER_API_TOKEN}
      - RCH__HEADER_SECRET=${REACHER_HEADER_SECRET}
      - RCH__HTTP_HOST=0.0.0.0
      - RCH__WORKER__ENABLE=false
      - RCH__WORKER__RABBITMQ__URL=amqp://${REACHER_RABBITMQ_USER:-reacher}:${REACHER_RABBITMQ_PASS}@rabbitmq:5672
      - RCH__STORAGE__POSTGRES__DB_URL=postgres://${REACHER_POSTGRES_USER:-reacher}:${REACHER_POSTGRES_PASSWORD}@postgres:5432/${REACHER_POSTGRES_DB:-reacher_db}
      - RUST_LOG=reacher=debug
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.reacher.rule=Host(`reacher.${DOMAIN}`)"
      - "traefik.http.routers.reacher.entrypoints=websecure"
      - "traefik.http.routers.reacher.tls.certresolver=spaceship"
      - "traefik.http.services.reacher.loadbalancer.server.port=8080"

  reacher-worker:
    image: reacherhq/commercial-license-trial:latest
    restart: unless-stopped
    networks:
      - reacher-internal
    depends_on:
      rabbitmq:
        condition: service_healthy
      postgres:
        condition: service_healthy
    deploy:
      replicas: 3
    environment:
      - RCH__COMMERCIAL_LICENSE_TRIAL__API_TOKEN=${REACHER_API_TOKEN}
      - RCH__WORKER__ENABLE=true
      - RCH__WORKER__RABBITMQ__URL=amqp://${REACHER_RABBITMQ_USER:-reacher}:${REACHER_RABBITMQ_PASS}@rabbitmq:5672
      - RCH__WORKER__RABBITMQ__CONCURRENCY=5
      - RCH__STORAGE__POSTGRES__DB_URL=postgres://${REACHER_POSTGRES_USER:-reacher}:${REACHER_POSTGRES_PASSWORD}@postgres:5432/${REACHER_POSTGRES_DB:-reacher_db}
      - RUST_LOG=reacher=debug

networks:
  proxy:
    external: true
  reacher-internal:
    driver: bridge

volumes:
  reacher-postgres-data:

Notes

  • Proxy4Smtp website redirects to proxy25.com now
  • Port 443 connections work fine to other hosts
  • This affects both single-server and RabbitMQ-based worker setups
  • I tried bypassing Traefik & just deploying this without Traefik. Same results.

Expected Behavior

Proxy4Smtp should accept SOCKS5 connections on port 1081 and successfully proxy SMTP traffic.

Actual Behavior

All connection attempts to Proxy4Smtp on port 1081 timeout, making email verification impossible.

Relevant log output

bash
2026-01-16T07:48:56.884963Z  INFO reacher: Starting verification email="[email protected]"
2026-01-16T07:48:56.885108Z DEBUG reacher: Checking email [email protected]
2026-01-16T07:48:56.886496Z DEBUG reacher: Found syntax validation [email protected] syntax=SyntaxDetails { address: Some(EmailAddress(EmailAddress("[email protected]"))), domain: "gmail.com", is_valid_syntax: true, username: "redacted", normalized_email: Some("[email protected]"), suggestion: None }
2026-01-16T07:48:56.899932Z DEBUG reacher: Found MX hosts [email protected] mx_hosts=["5 gmail-smtp-in.l.google.com.", "40 alt4.gmail-smtp-in.l.google.com.", "10 alt1.gmail-smtp-in.l.google.com.", "20 alt2.gmail-smtp-in.l.google.com.", "30 alt3.gmail-smtp-in.l.google.com."]
2026-01-16T07:48:56.929440Z DEBUG reacher: Found misc details [email protected] misc=MiscDetails { is_disposable: false, is_role_account: false, is_b2c: true, gravatar_url: None, haveibeenpwned: None }
2026-01-16T07:48:56.929538Z DEBUG reacher: Check SMTP email="[email protected]" attempt=1 mx_host="gmail-smtp-in.l.google.com." port=25 using_proxy=true
2026-01-16T07:51:13.355397Z DEBUG reacher: Got SMTP check result email="[email protected]" attempt=1 mx_host="gmail-smtp-in.l.google.com." port=25 result=Err(Socks5(Io(Os { code: 110, kind: TimedOut, message: "Operation timed out" })))
2026-01-16T07:51:13.355566Z DEBUG reacher: Sending error to Sentry: Smtp(Socks5(Io(Os { code: 110, kind: TimedOut, message: "Operation timed out" })))
2026-01-16T07:51:13.367103Z DEBUG reacher: Wrote to DB email="[email protected]"
2026-01-16T07:51:14.379796Z DEBUG reacher: Sent result to Reacher Commercial License Trial email="[email protected]" res="{\"ok\":true}"
2026-01-16T07:51:14.379830Z  INFO reacher: Done verification email="[email protected]" is_reachable=Unknown
2026-01-16T07:51:14.379913Z  INFO reacher: 172.22.0.1:44588 "POST /v1/check_email HTTP/1.1" 200 "-" "curl/8.5.0" 137.495157873s

Source: reacherhq/check-if-email-exists