Kontakní formulář neposílá email
- Luppo
- Člen | 13
Ahoj všichni,
dneska jsem zkoušel si vytvořit vlastní kontaktní formulář na stránku, ale nedaří se mi. Jsem jak v Nette tak v PHP začátečník a některé věci mi déle trvají. Díval jsem se na nějaká fóra a dokumentaci a dopracoval jsem se ke kódu, který je uveden níže. Bohužel mi výsledný kód neposílá emaily, ale podle TRACY všechno projde. Podle mě mám špatně volanou funkci na posílání, ale proces je v pořádku.
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use Nette\Mail\Message;
use App\Forms;
class ContactPresenter extends Nette\Application\UI\Presenter
{
public function renderDefault()
{
}
//** @var Nette\Mail\IMailer @inject */
public $mailer;
private function sendMail($values) {
$mail = new Message;
$mail->setSubject('Nova sprava');
$mail->setFrom($values['email'], $values['name']);
$mail->addTo('test@test.com');
$this->mailer->send($mail);
}
/**
* Contact form
*/
protected function createComponentContactForm()
{
$form = new Form;
$form->addText('name', 'Jméno:')
->addRule(Form::FILLED, 'Zadejte jméno');
$form->addText('surname', 'Přijímení:')
->addRule(Form::FILLED, 'Zadejte přijímení');
$form->addText('email', 'Email:')
->addRule(Form::FILLED, 'Zadejte email')
->addRule(Form::EMAIL, 'Email nemá správný formát');
$form->addTextarea('message', 'Zpráva:')
->addRule(Form::FILLED, 'Zadejte zprávu');
$form->addSubmit('send', 'Odeslat');
$form->onSuccess[] = [$this, 'processContactForm'];
$form->addProtection('Security token has expired, please submit the form again');
return $form;
}
public function processContactForm(Form $form)
{
$values = $form->getValues();
$message = new Message;
try {
$message->addTo('ondrej.sloup@aol.com')
->setFrom($values['email'])
->setSubject('Zpráva z kontaktního formuláře')
->setBody($values['message']);
$this->flashMessage('Zpráva byla odeslána');
} catch (\Nette\InvalidStateException $e) {
$form->addError('Chyba při odesílání.');
}
$this->redirect('this');
}
}
Pomohl by mi někdo to fixnout aby to všechno jelo? Pouštím to zatím na localhostu, ale nemyslím si že by to měl být problém.
- Luppo
- Člen | 13
rkor napsal(a):
Nikde nevoláš sendMail(), např.
public function processContactForm(Form $form, $values) { try { $this->sendMail($values); $this->flashMessage('Zpráva byla odeslána'); ...
Díky moc. Teď jsem si toho taky všimnul, ale spíš mi to uškodilo než pomohlo.
Teď mám v TRACY error „Call to a member function send() on null“. Na řádce 28 s tím mailer(em). Moc nechápu co mi ten error chce říci.
Editoval Luppo (29. 5. 2018 19:49)
- nightfish
- Člen | 519
Luppo napsal(a):
Oh Cool. Díky moc. Už jsem bez errorů, ale mail pořád nedostávám :/
Neví někdo jak nastavit to odesílání?
V metodě sendMail()
voláš
$mail->addTo('test@test.com');
, takže e-mail odejde na adresu
test@test.com
, což asi nechceš. Řešením je předávat do
funkce sendMail
přímo Message
:
private function sendMail(Message $message) {
$this->mailer->send($message);
}
A nebo $this->mailer->send($message);
zavolat přímo
v metodě processContactForm()
a metodu sendMail()
úplně zrušit.
- Luppo
- Člen | 13
nightfish napsal(a):
Luppo napsal(a):
Oh Cool. Díky moc. Už jsem bez errorů, ale mail pořád nedostávám :/
Neví někdo jak nastavit to odesílání?
V metodě
sendMail()
voláš$mail->addTo('test@test.com');
, takže e-mail odejde na adresutest@test.com
, což asi nechceš. Řešením je předávat do funkcesendMail
přímoMessage
:private function sendMail(Message $message) { $this->mailer->send($message); }
A nebo
$this->mailer->send($message);
zavolat přímo v metoděprocessContactForm()
a metodusendMail()
úplně zrušit.
Já bych chtěl aby mi to odešlo na můj email, kterej jsem tam zadal (akorát jsem ho nechtěl zveřeňovat na fóru a proto tam je test@test.com). Problém je, že ikdyž tam zadám ten svůj mail tak se nic nestane.
- mi teď vlastně došlo, že mi nevyskočila žádná potvrzovací hláška. Kde by se to mělo zobrazit? (Jako JS alert?)
Editoval Luppo (29. 5. 2018 23:07)
- Luppo
- Člen | 13
factor napsal(a):
Jak psal Luppo
public function processContactForm(Form $form, $values) { ... $this->sendMail($values); $this->flashMessage('Zpráva byla odeslana'); # <---- $this->redirect('this'); }
ZDE je vysvětlivka
Kde to můžu najít v TRACY v konzoli? :/ Hledal jsem a bez výsledku. Je to vůbec tam?
A pokud je flash message úspěšná, jakto že mi nic nepřijde na email? :/
- Luppo
- Člen | 13
steelbull napsal(a):
Jediné, čo ma ešte napadlo je problém v config.neon v sekcii mail, či si niečo nezmenil, príp. zle nenastavil.
mail:
smtp: true
host: smtp.aol.com
port: 465
username: *EmailPředZavináčem*
password: *HesloKEmailu*
secure: ssl
Udělal jsem to podle tohodle guidu: https://www.saleshandy.com/…tp-settings/
Editoval Luppo (30. 5. 2018 18:01)
- Luppo
- Člen | 13
Luppo napsal(a):
steelbull napsal(a):
Jediné, čo ma ešte napadlo je problém v config.neon v sekcii mail, či si niečo nezmenil, príp. zle nenastavil.
mail: smtp: true host: smtp.aol.com port: 465 username: *EmailPředZavináčem* password: *HesloKEmailu* secure: ssl
Udělal jsem to podle tohodle guidu: https://www.saleshandy.com/…tp-settings/
Zjistil jsem že když do formuláře vyplním svůj email (ten stejný jako je v configu a test@test.com) tak mi to email pošle, ale já bych potřeboval aby tam mohl každý zadat svůj email a tím pádem aby se to tvářilo jako email z toho jeho emailu. Je to možné?