Toplu SMS Gönderim Sınıfı

6

Turkcell‘e bağlı SMS gateway sunucuları ile SMS gönderimini birkaç satır kod ile yapmaya olanak sağlayan PHP sınıfını yazının devamında bulabilirsiniz. Sınıfı SMS Makinesi‘ne uygun olarak yazdım ancak bildiğim kadarıyla sınıf içindeki host ve url değerleri değiştirilerek başka firmalar ile de kullanılabilir.

Sınıfın özellikleri;

  • Mesaj 160 karakterden az ise tek gönderim, fazla ise çoklu gönderim yapar
  • Uygunsuz karakterleri mesaj içeriğinden temizler
  • Gateway hata kodlarını kontrol eder

Kullanımı;

<?php

$kisaMesaj = new sms($originator, $kullanici, $parola, $vendorid);

$kisaMesaj->telEkle('5553331122');

$kisaMesaj->telEkle('5554441122');

$kisaMesaj->mesaj('Bu mesajı 900 kişiye gönderen kerizlere Bill Gates servetini veriyor.');

$kisaMesaj->gonder(); // Duruma göre TRUE veya FALSE döner.

?>

Sınıfın kaynak kodları;

<?php

class sms {

private $pKullanici, $pParola, $pGonderen, $pSaglayici,
$pListe, $pMesaj, $pTip, $pXml,
$pHata = array (
"-1"=>"Sunucuya erisimde sorun var. Lutfen internet baglantinizi kontrol ediniz.",
"-2"=>"Sms sepeti bos.",
"01"=>"Hatali kullanici adi – sifre – bayi kodu",
"02"=>"Boyle bir Mesaj id kayitli degil.",
"04"=>"Gelen XML yok",
"05"=>"XML dügümü eksik ya da hatali",
"06"=>"Tanımsız Originator Bilgisi",
"08"=>"Verilen tarihler arasinda SMS gonderimi yok ya da Gonderim Raporu hazir degil",
"09"=>"Tarih alanlari bos veya hatali",
"11"=>"Tanimlanamayan hata",
"14"=>"Gonderimde Hatali Numaralar var.",
"15"=>"Mesaj gonderiminde hatali icerik var.",
"16"=>"Yetersiz Kontor Bilgisi"
);

function __construct($gonderen, $kullanici, $parola, $saglayici) {
$this->pGonderen=$gonderen;
$this->pKullanici=$kullanici;
$this->pParola=$parola;
$this->pSaglayici=$saglayici;
}

function telEkle($no) {
$no=trim($no);
if(is_numeric($no) && strlen($no)==10) {
$this->pListe.='<DST_MSISDN>'.$no.'</DST_MSISDN>';
}
}

function mesaj($mesaj) {
$this->pMesaj=str_replace(
array('ö','ç','ş','ı','ğ','ü','Ö','Ç','Ş','İ','Ğ','Ü'),
array('o','c','s','i','g','u','O','C','S','I','G','U'),
trim(str_replace(array('|','^','{','}','[',']','~','\\','\'','"'),' ', $mesaj)));
strlen($this->pMesaj)<160 ? $this->pTip='SENDSMS>' : $this->pTip='SENDCONCAT>';
}

function gonder() {
if(!$this->pListe) { exit('HATA: Telefon numarasi listesi bos gorunuyor.'); }
$this->pXml = '<?xml version="1.0" encoding="utf-8" ?>
<'.$this->pTip.'
<USERNAME>'.$this->pKullanici.'</USERNAME>
<PASSWORD>'.$this->pParola.'</PASSWORD>
<VENDOR_ID>'.$this->pSaglayici.'</VENDOR_ID>
<SDATE></SDATE>
<SENDER>'.$this->pGonderen.'</SENDER>
<TM_LIST>
<TM>
<DST_MSISDN_LIST>
'.$this->pListe.'
</DST_MSISDN_LIST>
<CONTENT_LIST>
<CONTENT>
<CONTENT_TEXT>'.$this->pMesaj.'</CONTENT_TEXT>
</CONTENT>
</CONTENT_LIST>
</TM>
</TM_LIST>
</'.$this->pTip;

$url = "https://gateway.smsmakinesi.com/SendSMS/SendSMS.asmx/sendSMS";
$h[]='POST /SendSMS/SendSMS.asmx/sendSMS HTTP/1.1';
$h[]='Host: gateway.smsmakinesi.com';
$h[]='Content-Type: application/x-www-form-urlencoded';
$h[]='Content-Length: '.strlen($this->pXml);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS,'xml='.$this->pXml);
curl_setopt($ch, CURLOPT_HTTPHEADER,$h);
curl_setopt($ch, CURLOPT_FAILONERROR, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

$data=curl_exec($ch);
$data=trim(strip_tags($data));

curl_close($ch);

if(strlen($data)==2) {
echo 'HATA: '.$this->pHata[$data];
return false;
} else {
return true;
}

}
}

?>

Yorumlar (6)

brsyukselMay 11th, 2009 at 00:23

Murat abi geçen gün soracaktım unuttum. Bu tarz değil de, kullanıcıdan mesaj alabilmemiz gerekiyor diyelim.Operatörler bu hizmeti ne şartlar karşılığında sağlıyor bilgin var mı?

brsyukselMay 11th, 2009 at 14:20

Bu arada Murat abi, yazdığın sınıf PHP5 ile PHP4 arasında kalmış onu da söyleyeyim. Sınıfta “sms” fonksiyonunu yapılandırıcı ( constructor ) olarak kullanmışsın ki bu PHP4′e ait bir özelliktir, bunun yanında görünürlük kullanmışsın ( private, public, protected ) ki bu da PHP5′e özgüdür. en güzel çözüm, sms fonksiyonunu __construct olarak değiştirmek :)

TekinsizMay 11th, 2009 at 18:32

Ya kardeşim farkındayım; yemin ederim kaç gündür aklımdaydı :) Düzelttim bile… Bu arada bahsetttiğin çift yönlü SMS hizmetini operatörler veriyor mu bilmiyorum. Ama parası olan şirketler için mutlaka bir çözümleri vardır.

brsyukselMay 11th, 2009 at 22:05

:) Parası olan şirket değil, birey sınıfına bile girebilmiş değilim :D

pojeckMay 21st, 2009 at 17:41

eğer isteyen olursa
vb.net
asp.net
için gerekli kodları sağlayabilirim, bende şirketimizin yönetim programından günü geldiğinde müşterilere doom günü mesajı yollayan bir yazılım hazırlıyorum.

saygılar

hergezenNovember 10th, 2009 at 23:56

smsmakinesi çift yönlü smsi ücretsiz olarak veriyor. bunla ilgili örnekler yolladılar paylaşabilirim isterseniz.

Yorum Yaz