Exim sendet nicht immer AUTH LOGIN-Benutzername/Passwort

Exim sendet nicht immer AUTH LOGIN-Benutzername/Passwort

Wir senden E-Mails mit Exim (konfiguriert über WHM). Mit genau derselben Konfiguration sendet Exim anscheinend meistens den richtigen AUTH LOGIN-Benutzernamen und das richtige Passwort. Manchmal lässt es diesen Teil jedoch aus und Sendgrid lehnt mit dem folgenden Fehler ab:

host smtp.sendgrid.net [158.85.10.138]
SMTP error from remote mail server after MAIL FROM:<info@*******.net> SIZE=2048:
550 Unauthenticated senders not allowed

Wenn ich mich näher damit befasse, kann ich das Problem (nicht immer, aber manchmal) mit Folgendem reproduzieren:

# exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim

This is an exim test.

Dies sind die Exim-Konfigurationseinstellungen:

Abschnitt: AUTH

sendgrid_login:
  driver = plaintext
  public_name = LOGIN
  client_send = : ******** : **************

Abschnitt: ROUTERSTART

send_via_sendgrid:
  driver = manualroute
  domains = ! +local_domains
  transport = sendgrid_smtp
  route_list = "* smtp.sendgrid.net::587 byname"
  host_find_failed = defer
  no_more

Abschnitt: TRANSPORTSTART

sendgrid_smtp:
  driver = smtp
  hosts = smtp.sendgrid.net
  hosts_require_auth = smtp.sendgrid.net
  hosts_require_tls = smtp.sendgrid.net
  authenticated_sender_force = true

Wenn es funktioniert, sieht das Protokoll wie folgt aus:

LOG: MAIN
  cwd=/home/** 3 args: exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim

This is an exim test.
LOG: MAIN
  <= **@****-**.com U=jf P=local S=354 T="Test exim"
**@****-** [~]# LOG: MAIN
  cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWZy-0005re-S3
delivering 1ZjWZy-0005re-S3
Transport port=25 replaced by host-specific port=587
Connecting to smtp.sendgrid.net [198.37.144.212]:587 ... connected
  SMTP<< 220 ismtpd-064 ESMTP service ready
  SMTP>> EHLO **.****-**.com
  SMTP<< 250-**.***.26.157
         250-SIZE 20480000
         250-STARTTLS
         250-AUTH PLAIN LOGIN
         250-8BITMIME
         250-PIPELINING
         250 AUTH=PLAIN LOGIN
  SMTP>> STARTTLS
  SMTP<< 220 Begin TLS negotiation now
  SMTP>> EHLO **.****-**.com
  SMTP<< 250-**.***.26.157
         250-8BITMIME
         250-SIZE 20480000
         250-AUTH=PLAIN LOGIN
         250-AUTH PLAIN LOGIN
         250 PIPELINING
  SMTP>> AUTH LOGIN
  SMTP<< 334 VXNlcm5hbWU6
  SMTP>> ****
  SMTP<< 334 UGFzc3dvcmQ6
  SMTP>> ********************
  SMTP<< 235 Authentication successful.
  SMTP>> MAIL FROM:<**@****-**.com> SIZE=1388 AUTH=**@****-**.com
  SMTP>> RCPT TO:<**@****.com>
  SMTP>> DATA
  SMTP<< 250 Sender address accepted
  SMTP<< 250 Recipient address accepted
  SMTP<< 354 Continue
  SMTP>> writing message and terminating "."
  SMTP<< 250 Delivery in progress
  SMTP>> QUIT
LOG: MAIN
  => **@****.com R=send_via_sendgrid T=sendgrid_smtp H=smtp.sendgrid.net [198.37.144.212] X=TLSv1.2:AES128-GCM-SHA256:128 A=sendgrid_login C="250 Delivery in progress"
LOG: MAIN
  Completed

Achten Sie besonders auf die Linie SMTP>> AUTH LOGINund die Sechs direkt darunter, die in der 235 Authentication successful.Linie endet.

Hier ist ein Fehler:

LOG: MAIN
  cwd=/home/** 3 args: exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim

This is an exim test.
LOG: MAIN
  <= **@****-**.com U=jf P=local S=340 T="Test exim"
**@****-** [~]# LOG: MAIN
  cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWjO-0006T8-Eq
delivering 1ZjWjO-0006T8-Eq
Transport port=25 replaced by host-specific port=587
Connecting to smtp.sendgrid.net [198.37.144.225]:587 ... connected
  SMTP<< 220 ismtpd-078 ESMTP service ready
  SMTP>> EHLO ****-**.com
  SMTP<< 250-**.***.157
         250-SIZE 20480000
         250-STARTTLS
         250-AUTH PLAIN LOGIN
         250-8BITMIME
         250-PIPELINING
         250 AUTH=PLAIN LOGIN
  SMTP>> STARTTLS
  SMTP<< 220 Begin TLS negotiation now
  SMTP>> EHLO ****-**.com
  SMTP<< 250-**.***.26.157
         250-8BITMIME
         250-SIZE 20480000
         250-AUTH=PLAIN LOGIN
         250-AUTH PLAIN LOGIN
         250 PIPELINING
  SMTP>> MAIL FROM:<**@****-**.com> SIZE=1374
  SMTP>> RCPT TO:<**@****.com>
  SMTP>> DATA
  SMTP<< 550 Cannot receive from specified address <**@****-**.com>: Unauthenticated senders not allowed
  SMTP<< 503 Must have sender before recipient
  SMTP<< 503 Must have valid receiver and originator
  SMTP>> QUIT
LOG: MAIN
  ** **@****.com R=send_via_sendgrid T=sendgrid_smtp H=smtp.sendgrid.net [198.37.144.225] X=TLSv1.2:AES128-GCM-SHA256:128: SMTP error from remote mail server after MAIL FROM:<**@****-**.com> SIZE=1374: 550 Cannot receive from specified address <**@****-**.com>: Unauthenticated senders not allowed
LOG: MAIN
  cwd=/var/spool/exim 8 args: /usr/sbin/exim -v -t -oem -oi -f <> -E1ZjWjO-0006T8-Eq
LOG: MAIN
  <= <> R=1ZjWjO-0006T8-Eq U=mailnull P=local S=1383 T="Mail delivery failed: returning message to sender"
LOG: MAIN
  cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWjn-0006TR-BX
delivering 1ZjWjn-0006TR-BX
LOG: MAIN
  Completed
LOG: MAIN
  => ** <**@****-**.com> R=localuser T=local_delivery
LOG: MAIN
  Completed

Beachten Sie, dass SMTP>> AUTH LOGINdie folgenden sechs Zeilen nicht aufgerufen werden...?

Die Frage ist, warum exim den eigentlichen SMTP>> AUTH LOGINTeil der Anfrage auslässt, aber nur manchmal? Es verwendet diegenau das gleicheVerbindungskonfiguration (Sie können sie in beiden Protokollen als referenziert sehen R=send_via_sendgrid T=sendgrid_smtp).

Antwort1

BEARBEITEN, 8. November 2015:

Die Lösung besteht in der Verwendung

hosts_require_auth = <; $host_address
hosts_require_tls = <; $host_address

Anstatt

hosts_require_auth = smtp.sendgrid.net
hosts_require_tls = smtp.sendgrid.net

Die ungewöhnlich aussehende <;Syntax gilt für den Fall, dass der Hostname in eine IPv6-Adresse aufgelöst wird (da es so klingt, als könnten die Doppelpunkte in einer IPv6-Adresse sonst zu Problemen führen). Die Variable $host_address wird verwendet, um den Fall zu lösen, dass sich die IP-Adresse ändert, in die der Hostname aufgelöst wird (wie in diesem Fall, wenn smtp.sendgrid.net in mehrere IPs aufgelöst wird und manchmal mitten im Prozess in eine andere aufgelöst wird) - ich denke, es verhindert, dass es erneut nachgeschlagen werden muss (siehe auchDer SMTP-Transport). KreditKonfigurieren von Exim zur Verwendung von Gmail als Smarthostund auch der OP und @wurtel.

VORHERIGE ANTWORT / SO TESTEN UND REPRODUZIEREN SIE::

Ich glaube, dass @wurtels Kommentar zur Frage zur Änderung der IP-Adresse richtig ist, da ich dies zuverlässig reproduzieren kann, indem ich ein Skript verwende, um schnell zu ändern, welche IP smtp.sendgrid.net auflöst. Ich habe auch bestätigt, dass dieses Problem ohne Eintrag in der Hosts-Datei mindestens alle 2 Stunden auftritt, wenn ich alle 5 Sekunden eine E-Mail sende, aber als ich eine IP in /etc/hosts fest codiert habe, lief es bei dieser Sendehäufigkeit 8 Stunden lang ohne Fehler, also ist das die vorübergehende Problemumgehung, die ich derzeit verwende.

So habe ich dieses Problem reproduziert. HINWEIS: Dies ist der aktuelle Stand von Ende Oktober 2015. Wenn Sie es danach versuchen, können die IPs anders sein. Führen Sie es also aus dig smtp.sendgrid.netund verwenden Sie zwei IPs, die stattdessen zurückgegeben werden.

Fügen Sie dies zu /etc/hosts hinzu

108.168.190.108 smtp.sendgrid.net

Speichern Sie dies in einer PHP-Datei und ersetzen Sie[email geschützt]mit einer E-Mail-Adresse, die Sie kontrollieren.

#!/usr/local/bin/php
<?php
while (true) {
    mail('[email protected]', 'Test email deletethiswithafilter', 'test ' . time());
    usleep(500000);
}

Speichern Sie dies in einer PHP-Datei und führen Sie es aus, während das obige ebenfalls ausgeführt wird. Alle 5 ms - 15 ms wird der Eintrag in der Hosts-Datei für smtp.sendgrid.net zwischen den beiden IPs umgeschaltet, die es auflöst, nämlich 158.85.10.138 und 108.168.190.108

#!/usr/local/bin/php
<?php
while (true) {
    passthru('new_hosts_file_contents=`cat /etc/hosts | sed \'s/108.168.190.108/ip108/g\' | sed \'s/158.85.10.138/ip158/g\' | sed \'s/ip108/158.85.10.138/g\' | sed \'s/ip158/108.168.190.108/g\'`; echo "$new_hosts_file_contents" > /etc/hosts 2>&1');
    usleep(10000 + rand(-5000,5000));
}

verwandte Informationen