Nette\Mail\SendException – Unable to send e-mail

cafesk8
Člen | 103
+
0
-

Zdravím,

nedaří se mi zprovoznit rozesílání e-mailů na localhostu (v kódu níže používám Contributte/Mail, ale zkoušel jsem to i bez něj se stejným výsledkem).

Nejsem schopný zjistit z jakého důvodu – Tracy mi vyhodí pouze Nette\Mail\SendException: Unable to send email. bez jakékoliv další informace proč, viz.: https://i.imgur.com/o6dLMFv.png

config

mail:
	smtp: true
	host: smtp.gmail.com
	port: 587
	username: moje.adresa@gmail.com
	password: heslo // pouzivam heslo, ktere jsem si na gmailu vygeneroval pro "nedůvěryhodné apps"
	secure: ssl

mailer

class EmailManager extends Control {

	/** @var Contributte\Mailing\IMailBuilderFactory */
	public $mailBuilderFactory;

	public function __construct(
		IMailBuilderFactory	$mailBuilderFactory
	) {
		$this->mailBuilderFactory 	= $mailBuilderFactory;
	}

	public function create(): EmailManager {
		return new EmailManager();
	}

	protected function sendMail($email, $subject, $template) {

		$mail = $this->mailBuilderFactory->create();
		$mail->setSubject($subject);
		if(is_array($email)) {
			foreach($email as $e) {
				$mail->addTo($e);
			}
		} else {
			$mail->addTo($email);
		}

		// Sending
		$mail->setFrom('moje.adresa@gmail.com');
		$mail->setTemplateFile(__DIR__ . '/templates/'.$template.'.latte');

		$mail->send();
	}

	public function sendTest() {
		$this->sendMail('moje.adresa@gmail.com','Test','welcome');
	}
}

interface IEmailManager {
	public function create(): EmailManager;
}

Presenter

/** @var IEmailManager */
public $emailManager;

 public function __construct(IEmailManager $emailManager) {
 	$this->emailManager 	= $emailManager->create();
 }

public function handleTestMail() {
	$this->emailManager->sendTest();

	$this->flashMessage('E-mail odeslán');
	if($this->isAjax()) {
		$this->redrawControl('flashes');
	}
}

Ještě bych chtěl podotknout, že toto mi funguje:

protected function sendMail() {
	$mail = new Message;
	$mail->setFrom('Franta <moje.adresa@gmail.com>')
		->addTo('moje.adresa@gmail.com')
		->setSubject('Test')
		->setBody("Zpráva.");

	$mailer = new SmtpMailer([
		'host' => 'smtp.gmail.com', //  pokud není nastaven, použijí se hodnoty z php.ini
		'username' => 'moje.adresa@gmail.com',
		'password' => 'heslo',
		'secure' => 'ssl',
	]);
	$mailer->send($mail);
}

Když jsem se stejným nastavením zkusil e-mail poslat z jednoduchého PHP souboru (bez Nette) o pár řádcích za pomocí PHPMailer – tak se zpráva v pořádku odeslala. Z toho usuzuji, že problém nebude v nějakém firewallu, či nastavení Apache/PHP/Sendmail na localhostu.

Za každou radu budu rád.

Editoval cafesk8 (16. 7. 2020 17:35)

Felix
Nette Core | 1189
+
0
-

Ahoj @cafesk8.

Zkousel jsi upravovat nastaveni? Zmenit port na 465 nebo 25, security na tls, ssl nebo none. Osobne pres gmail neodesilam, tak nevim, ale pouzivame Google SMTP relay a chodi to v pohode.

Treba tohle je nastaveni pro mailtrap, ktere pouzivam a vsechno bezi.

Nette\Mail\SmtpMailer([
	host: smtp.mailtrap.io
	username: ***
	password: ***
	port: 2525
	secure: null
])
cafesk8
Člen | 103
+
0
-

Problém byl nakonec v tom, že jsem vlastně vůbec to SMTP nastavení nepoužil, v configu jsem měl:

post:
	# Required option
	mailer:
		class: Contributte\Mail\Mailer\SendmailMailer
		setup:
			- setBounceMail('moje.adresa@gmail.com')

	# Optional options
	debug: %debugMode% #shows sent emails in Tracy
	mode: override

Používal se tedy SendMailer namísto SmtpMaileru … Problém je v tom, že Contributte/Mail neumí používat SmtpMailer pokud jsem to správně pochopil – Když jsem celou Contributte extension dal pryč, tak to funguje.

Bohužel mi teď Tracy neukazuje v debug panelu odeslané e-maily, kvůli čemuž jsem vlastně celou Contributte extension používal. Nevíte tedy, zda je možné rozchodit pod tím Contributte balíkem SmtpMailer anebo o nějaké alternativě, která by uměla odeslané e-maily zobrazovat v debug baru?

cafesk8
Člen | 103
+
+2
-

SOLVED

V kombinaci nette/mail + contributte/mail + contributte/mailing nakonec díky @Felix zafungovalo následující nastavení:

post:
	mailer: Nette\Mail\SmtpMailer([
		host: %smtp.host%
		username: %smtp.username%
		password: %smtp.password%
		secure: %smtp.secure%
	])
services:
	nette.mailer: @post.mailer

Díky