Nefunkční SMTP mailer na produkčním serveru
- Richard Faila
- Člen | 40
Chtěl jsem v aplikaci použít SMTP mailer, protože základní
Nette\Mail\Message
využívající pouze mail()
měl
v minulosti problémy.
$mail = new Nette\Mail\Message;
//nastavení adresáta atd...
$mailer = new Nette\Mail\SmtpMailer(array(
'host' => 'smtp.gmail.com', //zkoušel jsem i smtp.googlemail.com
'username' => 'info@mydomain.cz',
'password' => '******',
'secure' => 'ssl', //zkoušel jsem i bez toho, žádný rozdíl
));
$mail->setMailer($mailer);
$mail->send();
Na localhostu vše funguje na jedničku, ale jakmile se to pokusím spustit na ostrém serveru, dostanu Nette\Mail\SmtpException #110 Spojení bylo příliš dlouho neaktivní
Hosting mám na Savaně a pokud mě paměť neplete, tak tam dřív mail přes SMTP fungoval (asi ještě přes PHPMailer)
Neměl někdo podobnou zkušenost? Díky.
PHP Version 5.3.6 Nette Framework version 2.1-dev
- Richard Faila
- Člen | 40
Tak problém byl vyřešen, jednalo se o chybu na serveru, kterou jsem musel řešit s tech supportem.
Takže kdyby se někomu stalo něco podobného, tady to technik prý nakonec (po více jak 5-ti hodinách) vyřešil tím, že nechal znovu přeložit nastavení na serveru.
- vymak
- Člen | 92
Mám asi podobný problém. Na localhostu vyvíjím aplikaci tak jsem si napsal tuhle metodu aby se v devel režimu nastavil SMTP pro odesílaný email
/**
* V debug režimu nastaví SMTP pro odesílanou zprávu
* @return SmtpMailer
* @final
*/
protected final function setMailer() {
if (!Debugger::$productionMode) {
$mailer = new SmtpMailer([
'host' => 'smtp.cesky-hosting.cz',
'username' => 'test@example.com',
'password' => '****************'
]);
Debugger::log('Email odeslán přes SMTP Mailera');
Debugger::fireLog('Email odeslán přes SMTP Mailera');
return $mailer;
}
return new SmtpMailer;
}
Pokud email odesílám z localhostu všechno funguje.
Jakmile ale aplikaci nahraji na produkční server odeslání už nefunguje a
dostanu vyjímku:
Nette\Mail\SmtpException #111
Connection refused
Na verzi 2.1 RC4 mi odesílání fungovalo i na produkčním. Dnes jsem ale aktualizoval na verzi 2.1.0 a odesílání jaksi přestalo fungovat :(
Možná že s tím nemá Nette co dočinění, ale jen kdyby měl někdo podobný problém tak budu rád za každou radu :)
Jo a email odesílám takto:
$this->setMailer()->send($message);
- Šaman
- Člen | 2668
Ověř si, zda jsi skutečně v (!Debugger::$productionMode)
.
Kde pak nastavuješ parametry SMTP serveru, pokud jsi
v produkčním módu?
Resp. jestli jsem to dobře pochopil, tak na localhostu běžíš ve
vývojovém režimu a po nahrání na server ti to vyhazuje tuto výjimku
v produkčním módu? Pak to bude tím, že nemáš nakonfigurovaný
ten 'new SmtpMailer;'
V připojování a odesílání mailů sice k několika změnám došlo, ale nic, co by změnilo komunikaci se serverem (porovnání verzí 2.0.14 a 2.1).
Jinak mailer je lepší vytvářet přímo v systémovém kontejneru, tedy
zapsat to do configu. Pomocí přepsání config.local.neon pak můžeš
nastavit jiný mailer pro localhost a jiný pro produkční server aniž bys
potřeboval nějakou setMailer
metodu (mimochodem tvoje
setMailer
je ve skutečnosti getMailer
) :)
- vymak
- Člen | 92
Tak už se mi to podařilo rozběhat. Chyba byla v tom, že jsem v produkčním vytvářel SmtpMailer a přitom to mělo být SendmailMailer.
/**
* V debug režimu nastaví SMTP pro odesílanou zprávu
* @return SmtpMailer
* @final
*/
protected final function setMailer() {
if (!Debugger::$productionMode) {
$mailer = new SmtpMailer([
'host' => 'smtp.cesky-hosting.cz',
'username' => 'test@example.com',
'password' => '***************'
]);
Debugger::log('Email odeslán přes SMTP Mailera');
Debugger::fireLog('Email odeslán přes SMTP Mailera');
return $mailer;
}
return new SendmailMailer;
}
Jinak to s tou konfigurací přes config.neon to vyzkouším. Určitě to bude přehlednější než teď :)
- David Matějka
- Moderator | 6445
@vymak: a proc to vubec resis takhle? proc si v configu nedefinujes potrebny mailer?