Ako nastaviť smtp mailer pre localhost
- Čamo
- Člen | 798
Zdravím,
mám v rukách projekt, ktorý posiela maily cez smtp. Všetko vyzerá byť
v poriadku.
smtp_host => "smtp.websupport.sk"
smtp_username => "test@xxxx.sk"
smtp_password => "************"
smtp_secure => "ssl"
smtp_port => "465"
ale ja som neni z localohostu schopný poslať jediné písmeno.
Vyhodí mi error Nette\Mail\SmtpException na riadku $mailer->send($mail);
Nič viacej tam nieje. Všetko čo som doteraz prečítal je buď
o nastavení(to by malo byť ok), alebo ako to začalo zázračne fungovať a
nikto vlastne neviem prečo.
Čo môže byť príčinou zlyhania smtp na lokalhoste? Môže to byť tým, že používam virtualhost(fakt už neviem), alebo je treba niečo nastaviť v php.ini? V php.ini je riadok smtp_port = 25, čo mi trochu nejde do hlavy. Skúšal som to aj zmeniť na 465, ale bez úspechu. Nejaké nápady?
Editoval Čamo (21. 10. 2016 16:51)
- PavelS
- Člen | 66
Ahoj,
1, si dej nastavení mailu do config.neon
Bude to vypadat nějak takto:
mail:
smtp: true
host: smtp.websupport.sk
port: 465
username: test@xxxx.sk
password: ***********
secure: ssl
Pak si jen v presenteru (nebo odkud posíláš mejly) inejctneš mailer, takto
/** @var Nette\Mail\IMailer @inject */
public $mailer;
a pak už jen voláš $this->mailer->send($mail);
2, Mezi odesíláním z localhostu a jiného serveru není rozdíl.
Navrhuji kontrolu, jestli posíláš instanci Nette\Mail\Message a jestli máš
správně údaje jak na smtp, tak v Message.
Editoval PavelS (21. 10. 2016 17:04)
- Altimit
- Člen | 82
když to máš na localhostu tak to máš „jednoduché“ postfix si
nastav, že se může připojit pouze localhost (127.0.0.1, ::1, localhost,
localdomain,..) a heslo vyruš udělá se to, že se na smtp připojí pouze ten
kdo má localni ip (přesněji interní local ip) tak to mám já a doteď se mi
tam nikdo nedostal.
Protože mně připadá, že nette mi blbě šifruje heslo a jméno (vyhodí mi
to chybu s údaji).
- Čamo
- Člen | 798
Takže problém je s ssl certifikátom a týka sa to špeciálne Php 5.6
https://github.com/…r/issues/368
Problém je hlavne v tom, že Nette nevracia žiadny error message. Metoda
connect() to totiž nejako nezvláda:
$this->connection = @stream_socket_client( // @ is escalated to exception
($this->secure === 'ssl' ? 'ssl://' : '') . $this->host . ':' . $this->port,
$errno, $error, $this->timeout, STREAM_CLIENT_CONNECT, $this->context
);
if (!$this->connection) {
throw new SmtpException($error, $errno);
}
Premenná $error je prázdna. Skúšal som odstrániť @ a dať to do try-catch bloku, ale komentár neklamal. Vyhodí to warning, ktorý sa nedá zachytiť. Ale aspoň už viem čo sa deje.
try {
$this->connection = stream_socket_client( // @ removed
($this->secure === 'ssl' ? 'ssl://' : '') . $this->host . ':' . $this->port,
$errno, $error, $this->timeout, STREAM_CLIENT_CONNECT, $this->context
);
if (!$this->connection) {
throw new SmtpException($error, $errno);
}
} catch ( \Exception $e )
{
throw new SmtpException($e->getMessage(), $e->getCode());
}
EDIT: Správne by metóda connect mala zrejme nastaviť set_error_handler? Ako napr: http://stackoverflow.com/…ch-a-warning
Editoval Čamo (13. 11. 2016 11:37)
- Čamo
- Člen | 798
Tak som to teda cez ten set_error_handler, na miesto kde sa volá $mailer->send()
try {
set_error_handler( function( $errno, $errstr, $errfile, $errline, array $errcontext )
{
if( $errno == 2 ) throw new \Exception( $errstr, $errno );
return true; // Is necessary to handle other errors by default handler.
});
$mailer->send( $mail );
restore_error_handler();
return $mailer;
} catch ( \Exception $e ) {
Debugger::log( $e->getMessage(), 'error' );
return false;
}
Toto zdá sa funguje.
Editoval Čamo (13. 11. 2016 22:15)