Emailové notifikace + MySQL – timer?
- Desttro
- Člen | 126
Zdravím,
chtěl jsem se zeptat, zda by mi nekdo mohl poradit, jak udělat notifikace
emailem.
Konkrétně:
- případ: Budu mít v MySQL vložený termín, a potřeboval bych, aby 2 týdny před termínem přišel email a potom ještě jeden 1 týden před termínem
- případ: V databázi bude políčko pro váhu a pro skutečně dodanou váhu. Když bude rozdíl mezi váhou a skutečne dodanou váhou víc a nebo méně jak 10%, tak zase příjde email.
Jak se tohle řeší? Nějaké timery?
Děkuji mnohokrát
- Tirus91
- Člen | 199
napíšeš si nějakou službu, která bude dělat jen toto mailování a tu přidáš do cronu (nejlépe).
Tudíž jako první proběhne SQL dotaz, kterým si vyselektuješ jen ty záznamy, které splňují tvou podmínku
( where termin = termin-1tyden OR termin = termin-2tydny or vaha > skutecnaVaha OR vaha < 10%)
a nasledne uz tvoříš jen maily a rozesíláš je
- Tirus91
- Člen | 199
Tak záleží zda to máš u nějakého poskytovatele či na svém serveru. Například u Wedosu to jde jen na URL adresu, což by bylo pro tebe nejjednodušší skript. V ostatních případech si tu sám nechám poradit (teprve mne toto čeká – s Nette pracuji krátce a dělal jsem jen jednoduché aplikace/weby)
- David Kudera
- Člen | 455
Tak buď je tady např. cronner a nebo kdyby/console , což používám i já, protože je to super nejen pro cron, ale i pro jakýkoliv jiný cli skripty.
- Desttro
- Člen | 126
Zdravím,
konečně jsem se k tomu cronu dostal. Cronner nefunguje – už jsem
informoval autora tady.
Tak zkouším kdyby/console, ten názorný příklad na GitHubu.
Spouštím v konzoli: php index.php app:newsletter
ale furt to hází chybu: ERROR: application encountered an error and can not
continue.
zde je kód:
namespace App\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class SendNewslettersCommand extends Command
{
protected function configure()
{
$this->setName('app:newsletter')
->setDescription('Sends the newsletter');
}
protected function execute(InputInterface $input, OutputInterface $output)
{
//$newsletterSender = $this->getHelper('container')->getByType('Models\NewsletterSender');
try {
//$newsletterSender->sendNewsletters();
$output->writeLn('Newsletter sended');
return 0; // zero return code means everything is ok
} catch (\Nette\Mail\SmtpException $e) {
$output->writeLn('<error>' . $e->getMessage() . '</error>');
return 1; // non-zero return code means error
}
}
}
není nějaká jednodušší cesta jak spustit cron? Potřebuju jenom aby se mi v presenteru kontrolovala podmínka, a po její splnění, aby se odeslal email.
Děkuji
- Desttro
- Člen | 126
aha já jsem blb
[2014-09-15 13-22-09] Nette\Utils\AssertionException: The url 'localhost:8888' is not valid, please use this format: 'http://domain.tld/path'. in /Users/petr/Disk Google/htdocs/lija.cz/vendor/kdyby/console/src/Kdyby/Console/DI/ConsoleExtension.php:108 @ CLI: index.php app:newsletter @@ exception-2014-09-15-12-37-54-5769e0e5a974548acd9e43b117cda248.html
na lokálu to nepůjde, zkusím upravit /etc/hosts – třeba to půjde.
- David Kudera
- Člen | 455
Docela jednoduše. Asi jde o nějakou „pomocnou“ funkci že? Vše jde mít někde jinde, kde to dává větší smysl, než v presenterech. Nějaký model, služba, fasády, cokoliv… Pokud potřebuješ použít v presenteru, jen to zavoláš, pokud potřebuješ v cli, taky jen zavoláš..
Nakonec budeš mít jen hezké a jednoduché presentery, které sami celkem nic nedělají
- Desttro
- Člen | 126
Díky, ještě jsem modely nepoužíval – asi je načase. Furt mi to ale hází chybu:
Nette\DI\MissingServiceException
Service of type Models\NewsletterSender not found.
v app/models mám NewsletterSender.php
namespace App\Model;
use \Nette\Mail\Message;
use \Nette\Mail\SendmailMailer;
class NewsletterSender extends Nette\Object {
public function SendNewsletters()
{
$mail = new Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('test@test.cz')
->setSubject('Potvrzení objednávky')
->setBody("Dobrý den,\nvaše objednávka byla přijata.");
$mailer = new SendmailMailer;
$mailer->send($mail);
}
}
furt to nemůžu rozchodit :/ Jak kdybych to měl někde zaregistrovat
Editoval Desttro (15. 9. 2014 21:41)
- David Kudera
- Člen | 455
Přihodím tu odkaz na namespaces (doporučuji pořádně nastudovat ;-)
Do configu si pak zaregistruješ tuhle svoji službu a její celý název je \App\Model\NewsletterSender a ne \Models\NewsletterSender, takže tam, kde to tak je, to přepiš.
Ukázka configu:
services:
- App\Model\NewsletterSender
a dál už to stačí si to nechat jen injectnout tam, kam potřebuješ..
jo a ještě v use nemusí být počáteční zpětné lomítko