Jak nastavit více mailerů

Phalanx
Člen | 310
+
+1
-

Ahoj, mohl by mi prosím někdo poradit, jak nastavit více mailerů v aplikaci?

mail:
	smtp: true
	host: localhost
	username:
	password:

mail2:
	smtp: true
	host: smtp.mailgun.org
	username:
	password:
	public function __construct(
		IMailer $mailer,
		IMailer $mailer2
	)
David Matějka
Moderator | 6445
+
0
-

na co potřebuješ více mailerů?

Phalanx
Člen | 310
+
0
-

Jeden máme pro maily v aplikaci (registrační atd.), druhý pro kampaně.

David Matějka
Moderator | 6445
+
+6
-

ten druhý budeš muset registrovat jako neautowirovanou službu:

services:
	campaignMailer:
		create: Nette\Mail\SmtpMailer([
			username: ...
			password: ...
			host: ...
		])
		autowired: false

	- SomeSerivce(@campaignMailer)
Phalanx
Člen | 310
+
0
-

Díky moc Davide!

Phalanx
Člen | 310
+
0
-

Prosím, co dělám blbě?

Our\Model\Mailer Reference to missing service ‚campaignMailer‘. (used in __construct())

services:
	campaignMailer:
		create: Nette\Mail\SmtpMailer([
			username: ...
			password: ...
			host: ...
		])
		autowired: false

	- Our\Model\Mailer(@campaignMailer, ...)
<?php
class Mailer
{
	/** @var SmtpMailer */
	protected $campaignMailer;

	/** @var IMailer */
	protected $mailer;

	public function __construct(
		SmtpMailer $campaignMailer,
		IMailer $mailer
	) {
		$this->campaignMailer = $campaignMailer;
		$this->mailer = $mailer;
	}
}
?>
David Matějka
Moderator | 6445
+
0
-

co pouziváš za verzi nette/di?

máš tu definici services v hlavním configu? nenačítáš to třeba z extension?

Phalanx
Člen | 310
+
0
-

Máš pravdu, načítám ji z extension. v2.4.15

edit: pokud dám servisu do hlavního config.neon, tak to frčí. Pokud bys znal způsob, jak ji nechat v extension, rád se nechám poučit.

Editoval Phalanx (2. 4. 2019 17:05)

David Matějka
Moderator | 6445
+
+2
-

jj, tak to je tím. té service se totiž přidá prefix dle názvu extension, ale odkazuješ se na ni bez toho prefixu

Ale abys tam nemusel mít hardcodovaný aktuální název, pod kterým to registruješ (tedy nějaké @abc.campaignMailer), můžeš použít @extension.campaignMailer, to extension se pak nahradí názvem aktuální extenion

MKI-Miro
Člen | 261
+
0
-

plati to aj pre nette v3 ?

David Matějka
Moderator | 6445
+
0
-

ano

Felix
Nette Core | 1186
+
+2
-

Jenom pro info, kdyby se nekomu hodilo, rada pripravenych maileru je v contributte/mail balicku.

Vice na https://contributte.org/…te/mail.html#…

  • FileMailer
  • SendmailMailer
  • DevOpsMailer
  • DevNullMailer
  • CompositeMailer
  • TraceableMailer
MKI-Miro
Člen | 261
+
0
-

Vedeli by ste prosím aj reálne uviesť ako potom ten campaignMailer použiť v presentery?

Phalanx
Člen | 310
+
0
-

@MKI-Miro Jelikož není ta služba autowired, tak si ji musíš nastavit v configu ručně pro svůj presenter.

<?php
services:
    campaignMailer:
        create: Nette\Mail\SmtpMailer([
            username: ...
            password: ...
            host: ...
        ])
        autowired: false

services:
    -
        create: Namespace\Presenter
        setup:
            - setCampaignMailer(@campaignMailer)



namespace Namespace;

class Presenter extends BasePresenter {
    protected $campaignMailer;

    public function setCampaignMailer($campaignMailer) {
        $this->campaignMailer=$campaignMailer;
    }

    public renderSend()
    {
		// vytvor si Message $message
        $this->campaignMailer->send($message);
    }
}
?>

Editoval Phalanx (5. 5. 2019 17:27)

MKI-Miro
Člen | 261
+
0
-

a ako by mala vyzerá trieda campaignMailer mailer?

Tento príklad asi nie je celý nie? minimálne by to malo implementovať IMailer ?

class Mailer
{
    /** @var SmtpMailer */
    protected $campaignMailer;

    /** @var IMailer */
    protected $mailer;

    public function __construct(
        SmtpMailer $campaignMailer,
        IMailer $mailer
    ) {
        $this->campaignMailer = $campaignMailer;
        $this->mailer = $mailer;
    }
}
Phalanx
Člen | 310
+
0
-

edit: campaignMailer dědí od SmtpMaileru z configu. A SmtpMailer implementuje IMailer. Můžeš samozřejmě použít i obecný IMailer, v mém konkrétním případě se jednalo o Smtp.

Upravil jsem ještě maličko kód, mrkni na renderSend()

MKI-Miro
Člen | 261
+
0
-

dakujem, este mam ale jednu otazku, ja by som potreboval dotiahnut taky mailer aka je domena, toznamena pre .sk potrebujem ine meno heslo server nez pre .cz

ako to nejako rozumne spravit?

Kamil Valenta
Člen | 758
+
0
-

Udělal bych si něco jako config.cz.neon a config.sk.neon a v nich definoval patřičné mailery.
V bootstrap.php pak natáhneš config dle domény.
Samotný mechanismus v app už by to řešit neměl, ten si prostě vyžádá mailer a nějaký z DI dostane…

MKI-Miro
Člen | 261
+
0
-

to znie celkom fajn ale netrufnem si nieco vkladat do booting (mám už nette v3)

vedeli by ste mi opat napisat priklad?

dakujem

CZechBoY
Člen | 3608
+
0
-
if ($_SERVER['SERVER_NAME'] === 'domena.cz') {
    $configurator->addConfig('config.cz
neon');
}

bylo by fajn pouzit google, uz se to tu resilo tak milionkrat
ps. psano z mobilu takze zadna zaruka funkcnosti

Editoval CZechBoY (5. 5. 2019 23:20)

MKI-Miro
Člen | 261
+
0
-

dakujem

mozno este jedna podotazka, mozem natiahnut aj 2 configy?

V prvom by bolo nastavenie pre mailer napr config.cz.neon
V druhom by bolo vsetko ostatne co je spolocne pre vsetky domeny cize klasiky config.neon

este raz dakujem

David Matějka
Moderator | 6445
+
+3
-

Lepší bude udělat mailer factory, která bude závislá na http requestu a dle něj vytvoří správnou instanci maileru.

MKI-Miro
Člen | 261
+
0
-

cize nacitat 2 configy nie je mozne?

Kamil Valenta
Člen | 758
+
+1
-

Je to možné, můžeš si natáhnout třeba 10 configů.

Jsou to dva různé přístupy, buď budeš mít nějaký obecný config, kde bude skoro vše – a k němu dílčí configy, které budeš načítat podle domény,

nebo

použiješ řešení od @DavidMatějka, kde budou oba mailery definované v jednom configu a nějaká factory vrátí ten správný podle http requestu.

Vyber si jeden ze způsobů a ten realizuj.