MAIL GMAIL: nově hlásí SSL operation failed with code 1

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

Hoy lidi,
z ničehonic (resp. asi po nějaké změně na GMAILu) mi nelze posílat maily, hlásí to:

stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

  1. trochu mi není jasné, jak to, že to před tím šlo
  2. pak nevím, jestli vůbec takovýto kód je v pořádku
$mailer = new Nette\Mail\SmtpMailer([
		  'host' => 'smtp.gmail.com',
		  'port' => '587',
		  'username' => 'xyz@gmail.com',
		  'password' => 'heslo',
		  'secure' => 'tls',
		  ]);

$mailer->send($mail);

musel jsem totiž kvůli tomu na GMAILu povolit
Nastavení Povolit méně bezpečné aplikace: Zapnuto

  1. nu a hlavně mám teď problém s tou hláškou (viz výše)

sice to dokážu vyřešit, přidáním do SmtpMaileru.php ty 3 řádky option /viz níže), ale takovéto znásilňování do frameworku se mi tuze nelíbí – to se přeci nikdy nedělá ne?

if ((int) $this->read() !== 250) {
            $this->write("HELO $self", 250);
        }

        stream_context_set_option($this->connection, 'ssl', 'verify_peer', FALSE);
        stream_context_set_option($this->connection, 'ssl', 'verify_peer_name', FALSE);
        stream_context_set_option($this->connection, 'ssl', 'allow_self_signed', TRUE);


        if ($this->secure === 'tls') {

prosím, můžete mi poradit, jak posíláte maily Vy? – mám nyní možnost to celé předělat a do budoucna budu chtít z GMAILu přejít na samotný hosting (Savanu), aby adresy měly koncovku dle domény … myslím, že to pro eshopy není profesionální používat GMAIL, myslím to správně?

díky moc
za pomoc

Váňa

Editoval rerege (4. 9. 2017 11:06)

matopeto
Člen | 395
+
+2
-

Urcite nepreskakuj verifikovanie ssl!!!

Chyba sa da mozno opravit akutalizaciou certifikatov v php
vid:
https://forum.nette.org/…-tela-emailu#…

Pripadne napis podpore hostingu. Niekde v logu mozno budes mat i preco overenie ssl zlyhalo…

Suhlas, pokial ma eshop vlastnu domenu mal by posielat maily so svojej domeny :)

Druha vec je trochu mimo povodnej otazky ale nevytvaraj mailer rucne ale pouzi DI a konfiguraciu pomocou (local)neonu – ak to mas niekde v presentru

Editoval matopeto (4. 9. 2017 13:31)

rerege
Člen | 58
+
+1
-

@matopeto velice díky

kdyby to někomu pomohlo:

config.neon

mail:
	smtp: true		    # zapne SmtpMailer místo SendmailMailer
	host: smtp.savana.cz
	port: 465
	username: info@domena.cz
	password: *******
	secure: ssl		    # povolené hodnoty jsou ssl, tls nebo null

a v presenteru

/**
  * @var Nette\Mail\IMailer
  */
 private $mailer;

 public function injectMailer(Nette\Mail\IMailer $mailer) {
	$this->mailer = $mailer;
 }

a samotné odesílání

	    $mail = new Message;
	    $mail->setFrom($this->email)
		    ->addTo($email)
		    ->setSubject('Změna stavu objednávky')
		    ->setHtmlBody($template);


	    try {
		  $this->mailer->send($mail);
	    } catch (SendException $e) {
		     Debugger::log($e);
		     throw new SendException('Bohužel se nepodařilo odeslat potvrzovací email.', $e->getCode(), $e);
	    }
rerege
Člen | 58
+
0
-

mě snad klepne…

totální kravina, ale nejsem štonc to elegantně vyřešit

$mail = new Message;
$mail->setFrom('info@domena.cz')
    ->addTo($email)
    ->setSubject('Změna stavu objednávky')
    ->setHtmlBody($template);

Místo ručního zápisu 'info@domena.cz' si chci předat $this->mailer->username injektovaný z configu.neon
když to ale zadám takto

$mail->setFrom($this->mailer->username)

tak to hodí chybu:
Nette\MemberAccessException: Cannot read an undeclared property Nette\Mail\SmtpMailer::$username
v ..\vendor\nette\utils\src\Utils\ObjectMixin.php:153

ale mailer mám injektnut a proměnnou při debugování vidím … takže tipuji, že to „pouze“ nějak špatně předávám, to nemohu předat přímo objekt (typu string) ???

nightfish
Člen | 519
+
+1
-

rerege napsal(a):
$mail->setFrom($this->mailer->username)

tak to hodí chybu:
Nette\MemberAccessException: Cannot read an undeclared property Nette\Mail\SmtpMailer::$username
v ..\vendor\nette\utils\src\Utils\ObjectMixin.php:153

ale mailer mám injektnut a proměnnou při debugování vidím … takže tipuji, že to „pouze“ nějak špatně předávám, to nemohu předat přímo objekt (typu string) ???

Proměnná SmtpMailer::$username je private, proto se k ní nedostaneš.

matopeto
Člen | 395
+
+1
-

Sprav si parameter mailUsername v configu, ten pouzi v konfiguracii maileru, a na message si sprav factory, ktora bude mat na vstupe parameter from (pripadne to v configu nastavis cez setup), tu si injectnes a pouzies TvojaMessageFacgory->create() a dostanes nakonfigurovanu message s from (pripadne inymi parametrami) . Sorry ze tak obecne ale snad to vyskladas

rerege
Člen | 58
+
0
-

@nightfish tybrďo – tak to mě nenapadlo – taková prostota – díky moc

jinak metoda __get by mi nepomohla? Resp. jsem to zkoušel, ale nerozchodil jsem to.
Připadá mi to zbytečné si dávat do configu další parametr, když už to program ví a má to u sebe v username
Ale pokud to jinak nejde, tak no problem…

matopeto
Člen | 395
+
+1
-

Nebude to dalsi parameter, bude to jeden, ktory predas v configu dvom sluzbam.

rerege
Člen | 58
+
0
-

@matopeto Matěji zasejc máš pravdu, ale i tak je to škoda (1 služba navíc), i když věřím, že private nezadal autor jen pro srandu králíkům

díky moc
Váňa

matopeto
Člen | 395
+
+1
-

je to sluzba naviac, ale na druhu stranu bude to viac DI a v tovarni kedykolvek mozes vymenit implementaciu Message (napriklad kvoli testovaniu) a zbavis sa new v kode kde by nemuselo byt.