symfony ile batch script içerisiden e-posta göndermek
Çoğu durumda kullanıcılara web uygulamarı içerisinden e-posta göndermek durumunda kalırız, ancak bazen pek çok kişiye (ama herkese değil) e-posta göndermemiz gerekebilir, bu tür durumlarda ben e-posta içeriğini ve gönderilecek olan kişileri iki farklı tabloya kaydedip cron yardımı ile çalışan bir batch script ile bu e-postaları göndermeyi tercih ediyorum. Symfony içerisinde module.yml içerisinde is_internal: on diye bir tanımlama yapmış isek yada uygulamamız bir güvenli uygulama ise (admin paneli mesela) batch script içerisinden bu modüle erişemiyoruz, dersem inanmayın külliyen yalan, her şeyde olduğu gibi bunun da kolay bir yolu var. Öncelikle uygulamamız bir güvenli uygulama ise settings.yml içerisine şu 3 satısı eklememiz gerekiyor,
batch: .setttings use_security: off
Böylece batch script içerisinden kullanıcı girişi yapılması gereken modüllere de erişebilir oluyoruz, şimdi sırada e-posta göndermek için kullandığımız ve sadece internal olarak çağırılabilinen modülümüzü batch içerisiden kullanabilmek için yapmamız gereken yapılandırmaya. ilgili modülün module.yml dosyası içerisine aşağıdaki satırları ekleyelim.
batch: is_internal: off
batch scriptimiz içerisinde
define('SF_ENVIRONMENT', 'batch');
sabitini tanımladıktan sonra e-postaları göndermek için döngü içerisinde
sfContext::getInstance()->getController()->sendEmail('mailModule', 'mailAction');
çağrısını yapmamız yeterli oluyor.
Symfony ile kalın.
Symfony ve E-posta işlemleri
Çoğu zaman web sitemizden e-posta göndermek zorunda kalırız,
symfony ile bu durumda toplam 20 satır gibi bir kod yazarak bu sorunu çok kolay halledebiliriz, bunun için farklı yollar olmasına rağmen şu anda en kolay gördüğüm yolu anlatacağım, bu yol aynı zamanda askeet.com sitesi üzerine kullanılmaktadır.
sfActions ve sfAction nesnesi bize sendMail isimli bir method sunar, bu method iki adet parametre alır, bu parametreler modül adı ve action adı'dır. Bu sayede istediğimiz modulün action'ını e-posta ile gönderebiliriz.
her hangi bir action içerisinden e-posta göndermek istediğimizi var sayalım ve bunu kayıp şifreler için örnekleyelim.
public function executeLostpassword()
{
if($this->getRequest()->getMethod() !== sfRequest::POST)
{
return sfView::INPUT;
}
/* burada yeni şifrenin üretilmesi veri tabanına kaydedilmesi gibi işlemler mevcut.*/
.....
/*Kullanıcı icin üretilmiş şifreyi diğer bir action içerisinden erişebilmek için
Request nesnesi içine attribute olarak atıyoruz, istenirze session içerisinede konulabilinir.*/
$this->getRequest()->setAttribute('newpassword', $uretilensifre);
$this->getRequest()->setAttribute('email', $kullanicinin_eposta_adresi);
$this->sendEmail('mail', 'sendPassword');
return sfView::SUCCESS;
}
şimdi mail isimli bir module ve bu modül içerisinde sendPassword isimli bir action'a ihtiyacımız var,
$ symfony module appname mail
.........
bu Action'ı şu şekilde yazalım,
public function executeSendPassword()
{
$mail = new sfMail();
//Kullanıcının e-posta adresini yukardaki örnekte request nesnesi içerisine yerleştirmiştik.
$mail->addAddress($this->getRequest()->getAttribute('email'));
// yapılandırma dosyasında daha önceden, e-postamızın konusunu ve kimden gönderildiğini belirtiyoruz
$mail->setFrom(sfConfig::get('sf_app_sendpassword_from'));
$mail->setSubject(sfConfig::get('sf_app_sendpassword_subject'));
.......
$mail->setPriority(1);
//Bu satır zorunlu, sfMailView sınıfı tarafından kullanılıyor.
$this->mail = $mail;
$this->password = $this->getRequest()->getAttribute('password');
}
şimdi iki adet template oluşturacağız, birincisi standar template isimlendirmesi kuralına göre, diğeri ise .altbody.php
sendPasswordSuccess.php
sendPasswordSuccess.altbody.php
sendPasswordSuccess.php dosyası html kodları içerirken .altbody.php ile biten dosya düz metin dosyası olacaktır. Böylece aynı e-postanın içerisinde hem html hemde text içerik gönderebiliriz.
Her iki template dosyasıda diğer template dosyalarından farksızdır. executeSendPassword() actionından oluşan sonuç, kullanıcıya e-posta ile gönderilecektir. Son olarak bu method'a dışarıdan erişimi yasaklamamız gerekiyor ve bunun için modülün config dizini içerisinde module.yml dosyası oluşturup,
all:
is_internal: on
yazmamız yetiyor.
E-postayı göndermek için gerekli ayarları ise yine modülün config dizini içerisinde mailer.yml dosyası oluşturarak istediğimiz parameteleri girebiliriz, bu parametreler ise şunlardır, 'mailer', 'priority', 'content_type', 'charset', 'encoding', 'wordwrap', 'hostname', 'port', 'domain', 'username', 'password'.
not: sendPassword action'ı içerisinde toplam 8 satır var (açıklamalar ve boş satırlar hariç) ![]()
not: mailer.yml dosyasında kullanılabilinir parametreleri symfony dokümantasyonunda bulamamıştım, buraya not düşüyorum