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
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.
- hancs
- Člen | 57
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
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.
- hancs
- Člen | 57
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
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)
- Pavel Kravčík
- Člen | 1196
@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
@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 :-)