Chyba při odesílání e-mailu jednou se odešle a jednou ne. (SMTP server did not accept . with error)

hancs
Člen | 57
+
0
-

Ahoj,

nevím si rady s následujícím problémem. V aplikace odesílám e-maily pomocí smtpMaileru, ale třeba 5 z 20 se neodešle a zachytí se výjimka:

Nette\Mail\SmtpException
SMTP server did not accept . with error:

E-mail na který posílám nehraje roli, protože jednou se to pošle a jednou ne. Zvláštní je, že když výjimku ošetřím (neodesílám e-mail znovu, jen upozorním uživatele), tak se e-mail i přes výjimku odešle. Takže vlastně vůbec nemám tušení co odešlo a co ne.

Chyba vzniká v SMTPMaileru na tomhle místě (řádek 112):

<?php
 $data = preg_replace('#^\.#m', '..', $data);
 $this->write($data);
 $this->write('.', 250);	//<---- tady

?>

Netušíte někdo co by to mohlo dělat?

Moc díky za každou radu.

Phalanx
Člen | 310
+
0
-

https://github.com/…il/issues/32
Už to tady jednou bylo, chyba se nenašla.

hancs
Člen | 57
+
0
-

Díky, ale tohle nevypadá na stejný problém…

h4kuna
Backer | 740
+
0
-

Ukaž jak to posíláš, vytvoření Message a odeslání.

hancs
Člen | 57
+
0
-

Zvláštní je, že text mailu, předmět ani příloha se vůbec nezmění a jednou se to pošle a jednou ne. Teda, když odchytím výjimku tak se to pošle vždy, ale někdy mi smtp server vůbec neodpoví, takže nevím jestli to odešlo..

<?php
$subject = "Neco";
$template = $latte->renderToString(__DIR__ . '\Mails\en.latte', $params);
$this->mail->sendEmailWithAttachment($email, $subject, $template, $invoice->getFile()->getPath(), $invoice->getFile()->getFileName());

?>

funkce:

<?php
 public function sendEmailWithAttachment($to, $subject, $template, $attachment, $fileName, $cc = null) {

        $mail = new Message;

        $mail->setFrom($this->mailFrom)
            ->addTo($to)
            ->setSubject($subject)
            ->setHtmlBody($template);
        if($cc != null){
            $mail->addCc($cc);
        }

        if ($this->mailReplyTo != null){
            $mail->addReplyTo($this->mailReplyTo);
        }

        $content = file_get_contents($attachment);
        $mail->addAttachment($fileName, $content);
        $this->mailer->send($mail);

    }

?>
h4kuna
Backer | 740
+
0
-

Proměnná $email je vždy validní? Předpokládám že ano, protože to už by vyletěla exception z Nette. To že to napodruhý projde je divný (to bych pak sázel na nějaký úblb na smtp servru), ale není vidět jak odchytáváš vyjímku a jak s ní pracuješ. Je ověřený že napodruhý to projde nebo to jen v tichosti selže?

Ta cesta se zpětnými lomítky je validní? Skoro mám pocit že ti to takto na linuxu nebude fungovat. Obráceně ‚/‘ fungují na windows.

Phalanx
Člen | 310
+
-1
-

Zkusil bych si lognout chybu, jestli to něco nevyhodí

<?php
		try {
			$this->mailer->send($mail);
		} catch (\Exception $e){
			Tracy\Debugger::log("ERROR: {$e->getMessage()}");
		}
?>
hancs
Člen | 57
+
0
-

Email je vždy validní. Ono to není tak, že jednou to projde a jednou ne, ale prostě náhodně, párkrát to projde, pak třeba jednou dvakrát ne atp. Jinak běží to na IIS, takže by to nemělo vadit.

Tohle já přesně dělám

<?php
 try {
                if ($sendBack == false) {
                    $this->mail->sendEmailWithAttachment($email, $subject, $template, $invoice->getFile()->getPath(), $invoice->getFile()->getFileName());
                    $emailsSend++;
                    $this->log->logEmail("Success send: " . $email, log_email::SUCCESS, $invoice->getId(), $invoice->getDocumentNumber(), $batchId, $email);
                    $this->cleanOldLogs($invoice->getId(), $email);
                }else{

                    $this->mail->sendEmailWithAttachment($email, $subject, $template, $invoice->getFile()->getPath(), $invoice->getFile()->getFileName());
                }
            } catch (\Exception $e) {
                $this->log->logEmail("Error message not send: " . $email . "(" . $e->getMessage() . $e->getCode() . ")", log_email::ERROR_SEND_PROBLEM, $invoice->getId(), $invoice->getDocumentNumber(), $batchId, $email);
                //$this->DB->toFile($e->getTraceAsString());
            }

?>

A v logu mám: Error message not send: validniEmail (SMTP server did not accept . with error: 0)

h4kuna
Backer | 740
+
0
-

To děláš nějakou frontou? Že po zachycení výjimky jen loguješ a nic neposíláš znova, jak jsi psal.

$email tedy obsahuje validniEmail což není validní email. :)

Místo validniEmail nemělo by být něco jako foo@example.com? viz log.
Jelikož odchytáváš \Exception tak nevíš co to je za typ výjimky. Jestli to vyhazuje nette (validace emailu) nebo smtp server (nette chybu převede na výjimku), ale jsou jinak pojmenované.

Vzhledem k windows serveru je cesta asi ok. Já osobně bych asi psal ‚/‘ i na windows serveru. Nebo existuje konstanta DIRECTORY_SEPARATOR. Je jen psycho jaký má dlouhý název a přitom reprezentuje jeden znak.

Editoval h4kuna (2. 8. 2018 12:20)

iguana007
Člen | 970
+
0
-

A ten SMTP server je tvuj nebo pouzivas nejakou treti stranu?

Pavel Kravčík
Člen | 1180
+
0
-

@h4kuna: Myslím, že na ISS projdou obě varianty (ale nevím co máme za verzi u jednoho klienta). Jinak pro zkrácení:

join(DIRECTORY_SEPARATOR, [$this->appDir, 'ad', 'aspera', 'per', 'astra']);

Editoval Pavel Kravčík (2. 8. 2018 14:47)

hancs
Člen | 57
+
0
-

@h4kuna Celé to funguje tak, že consolová aplikace přes API nahraje fakturu na server a tam se spustí odeslání e-mailů na zadané adresy. Takže v cyklu posílám na všechny uvedené adresy a loguji úspěch, neúspěch.

Do toho logu jsem ten email samozřejmě přepsal, když jsem to sem psal ;)

Ale já vím co je to za výjimku, jen jsem to ještě nepřepsal na konkrétní. Ale je to tahle:

Nette\Mail\SmtpException

Kdyby přeci byla špatně cesta, tak se nestane, že jednou to projde a jednou ne, pokud se nepletu?

@iguana007 Jinak server je M. exchange. A mám podezření, že ten mi právě odpovídá jak se mu zrovna chce…

Jinak děkuji za váš čas :-)