Ako nastaviť smtp mailer pre localhost

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

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

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)

Čamo
Člen | 786
+
0
-

Všetko vyzerá v poriadku. Keď si vydumpuje mailer tak je tam všetko ako má byť.

hechj
Člen | 6
+
0
-

To nahoře vypadá jako asociativní pole. Nemají být klíče v uvozovkách?

F.Vesely
Člen | 368
+
0
-

Zkousel jsi jine SMTP, treba gmail?

Altimit
Člen | 82
+
0
-

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

Ešte taká otázka. Používam fake mail server – Test mail server tool. Ten by mal zachytiť odosielaný email, ale ani s ním ani bez neho sa nič nedeje. A nemám dosah na serverové nastavenia.

Čamo
Člen | 786
+
0
-

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

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)