Kontakní formulář neposílá email

Luppo
Člen | 13
+
0
-

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.

rkor
Člen | 62
+
0
-

Nikde nevoláš sendMail(), např.

public function processContactForm(Form $form, $values)
{
	try {
        $this->sendMail($values);
        $this->flashMessage('Zpráva byla odeslána');
        ...
Luppo
Člen | 13
+
0
-

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)

rkor
Člen | 62
+
0
-

Máš tam lomítko navíc

/** @var Nette\Mail\IMailer @inject */
	public $mailer;
Luppo
Člen | 13
+
0
-

rkor napsal(a):

Máš tam lomítko navíc

/** @var Nette\Mail\IMailer @inject */
	public $mailer;

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í?

Editoval Luppo (29. 5. 2018 20:59)

nightfish
Člen | 519
+
0
-

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

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 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.

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)

factor
Člen | 28
+
0
-

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

Luppo
Člen | 13
+
0
-

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? :/

kalatalabnik
Člen | 35
+
0
-

A odesílaní e-mailů ti mimo Nette funguje?

Luppo
Člen | 13
+
0
-

kalatalabnik napsal(a):

A odesílaní e-mailů ti mimo Nette funguje?

To je v pohodě.

steelbull
Člen | 241
+
0
-

Jediné, čo ma ešte napadlo je problém v config.neon v sekcii mail, či si niečo nezmenil, príp. zle nenastavil.

Luppo
Člen | 13
+
0
-

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

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é?

CZechBoY
Člen | 3608
+
0
-

To uz neni uplne mozny, jde jen poslst hlavicka Reply-To, ktera se pouzije jen kdyz da prijemce Odpovedet. Jinak tu hlavicku nikde neuvidi…

Luppo
Člen | 13
+
0
-

CZechBoY napsal(a):

To uz neni uplne mozny, jde jen poslst hlavicka Reply-To, ktera se pouzije jen kdyz da prijemce Odpovedet. Jinak tu hlavicku nikde neuvidi…

Yap, Chápu. Takže nejednoduší způsob jak jsi poslat email je prostě z mého emailu na můj email. Right?

CZechBoY
Člen | 3608
+
0
-

Tak posílat mail můžeš komu chceš, jen odesilatel bude vždy tvoje adresa.