Nefunkční SMTP mailer na produkčním serveru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Richard Faila
Člen | 40
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@vymak: a proc to vubec resis takhle? proc si v configu nedefinujes potrebny mailer?

vymak
Člen | 92
+
0
-

S Nette teprve začínám :) Tak pomalu začínám objevovat nové věci :) Jdu to zkusit přepsat do configu tak se uvidí jak to bude fungovat :)

EDIT: Tak už jsem to přepsal do configu a musím uznat že se kód řádně pročistil a zpřehlednil :)

Editoval vymak (2. 1. 2014 18:14)