Nette\Mail\SendException – Unable to send e-mail
- cafesk8
- Člen | 103
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 | 1247
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
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
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