Toplu SMS gönderimi için aşağıdaki kodu kullanıyorum fakat her numaraya tek tek gönderim yapıyor dolayısıyla liste uzayınca programda kasıyor; hızlandırmak için nasıl bir yol izleyebilirim, elinde örnek olan var mı acaba paylaşabilir mi acaba ?
procedure TSMS_GONDER_PENCERE.SPED_BTN_TOPLU_SMSClick(Sender: TObject);
var
xsml, MESAJ: string;
degisken: string;
begin
if (IsConnectedToInternet) then
if Demo then
ShowMessage('DEMO UYGULAMADA KULLANAMAZSINIZ.')
else
begin
if (Application.MessageBox('TOPLU SMS GÖNDERİLSİNMİ ?' + #13 + 'ONAYLIYORMUSUNUZ?', 'UYARI!', mb_YesNo + MB_ICONINFORMATION)) = IdYes then
begin
if QRY_MUSTERILER.RecordCount < 0 then
ShowMessage('SMS gönderilecek numara bulunamadı.')
else if Rz_TOPLU_SMS.Text = '' then
ShowMessage(' Lütfen mesaj içeriği giriniz.')
else
begin
QRY_MUSTERILER.Prior;
mmoNUMARALAR.Clear;
begin
QRY_MUSTERILER.Open;
while not QRY_MUSTERILER.Eof do
begin
if QRY_MUSTERILER.Fieldbyname('TELEFON').Text <> '' then
mmoNUMARALAR.Text := mmoNUMARALAR.Text + '<no>' + QRY_MUSTERILER.Fieldbyname('TELEFON').Text + '</no>';
QRY_MUSTERILER.next;
end;
end;
/// SMS GÖNDER
DM.R.CloseKey();
DM.R.RootKey := HKEY_CURRENT_USER;
DM.R.OpenKey('\Software\EliteSistem\Servis Takip', true);
MESAJ := Rz_TOPLU_SMS.Lines.Text;
xsml:='<?xml version="1.0" encoding="UTF-8"?>' +
'<mainbody><header><company dil="TR">'+DM.R.ReadString('SMS Operatör')+'</company>'+
'<usercode>'+ DM.R.ReadString('SMS Kullanıcı') + '</usercode>'+
'<password>'+ DM.R.ReadString('SMS Şifre') + '</password>'+
'<startdate></startdate>'+
'<stopdate></stopdate>'+
'<type>1:n</type>'+
'<msgheader>' + DM.R.ReadString('SMS Orginatör') + '</msgheader>'+
'</header>'+
'<body>'+
'<msg><![CDATA['+MESAJ+' '+ DM.R.ReadString('SMS Mersis No') + ']]></msg>'+
mmoNUMARALAR.Text +
// '<no>' + mmoNUMARALAR.Text + '</no>'+
'</body>'+
'</mainbody>';
if not uUtils.XmlPost.XMLPOST(DM.SMS_URL, xsml, degisken) then
begin
// eğer hata veriecek ise burada verilecek
end;
if degisken='20'
then ShowMessage(' Mesaj Metninde boş olmasından veya maksimum mesaj karakterini geçildi ') else
if degisken='30'
then ShowMessage(' Kullanıcı bilgisi bulunamadı ') else
if degisken='40'
then ShowMessage(' Geçersiz Mesaj Başlığı (başlık sistem e tanımlanmamış) ') else
if degisken='50'
then ShowMessage(' Yetersiz Kredisi Lütfen Kredi Yükleyiniz ') else
if degisken='60'
then ShowMessage(' Telefon Numarası hiç tanımlanmamış ') else
if degisken='70'
then ShowMessage(' Mesaj Başlığı hatalı ') else
end;
end;
end;
end;
SMS gönderim firmalarının API dökümanları olması gerekli. Bu tür firmalar genelde toplu gönderim ve tek tek gönderim için farklı API metodları kullanırlar. Alternatif olarak @freeman35 dediği gibi tek metod içinde iki yöntem desteği veriyor olabilirler. Ancak bu bilgi sadece bu hizmeti veren firmadan alınabilir.
Sizin kullandığınız yöntemde bir defada birden fazla telefon bilgisi iletiyorsunuz. Bu noktada kontrol etmeniz gereken iki nokta var.
A- XML hazırlama süresi nedir?
B- Sunucu iletişim süresi nedir?
Kısacası, sizin XML gönderme işleminizde en uzun süreyi ne alıyor? Neyi düzeltmeniz gerekli? Bunu tespit etmelisiniz.
Mevcut kod ile aklıma gelen iki çözüm var.
1- SMS gönderimini bir thread içinde yaparak ana uygulama donmasını engellemek mümkün. Gönderilemeyen SMS için thread içinden bir event tetikleyerek ana uygulama ile iletişim kurabilirsiniz.
2- SMS gönderimine özel ayrı bir proje geliştirerek SMS gönderme için kendi geliştirdiğiniz bu uygulamayı çalıştırabilirsiniz. Bu yöntemde gönderilemeyen SMS bilgisini almak için yine bir iletişim yönetmi kullanmanız gerekecektir.
procedure TSMS_GONDER_PENCERE.SPED_BTN_TOPLU_SMSClick(Sender: TObject);
var
xsml, MESAJ: string;
degisken: string;
begin
if (IsConnectedToInternet) then
if Demo then
ShowMessage('DEMO UYGULAMADA KULLANAMAZSINIZ.')
else
begin
if (Application.MessageBox('TOPLU SMS GÖNDERİLSİNMİ ?' + #13
+ 'ONAYLIYORMUSUNUZ?', 'UYARI!', mb_YesNo + MB_ICONINFORMATION)) = IdYes then
begin
if QRY_MUSTERILER.RecordCount < 0 then
ShowMessage('SMS gönderilecek numara bulunamadı.')
else if Rz_TOPLU_SMS.Text = '' then
ShowMessage(' Lütfen mesaj içeriği giriniz.')
else
begin
try
/// SMS GÖNDER
DM.R.CloseKey();
DM.R.RootKey := HKEY_CURRENT_USER;
DM.R.OpenKey('\Software\EliteSistem\Servis Takip', true);
QRY_MUSTERILER.DisableControls;
QRY_MUSTERILER.Open;
QRY_MUSTERILER.Prior;
mmoNUMARALAR.Clear;
begin
while not QRY_MUSTERILER.Eof do
begin
if QRY_MUSTERILER.Fieldbyname('TELEFON').Text <> '' then
mmoNUMARALAR.Lines.Add('<no>' + QRY_MUSTERILER.Fieldbyname('TELEFON').Text + '</no>');
QRY_MUSTERILER.next;
caption:='SMS Gönder | Müşteri Sayısı: '+IntToStr(QRY_MUSTERILER.RecordCount);
end;
end;
finally
QRY_MUSTERILER.EnableControls;
MESAJ := Rz_TOPLU_SMS.Lines.Text;
xsml:='<?xml version="1.0" encoding="UTF-8"?>' +
'<mainbody><header><company dil="TR">'+DM.R.ReadString('SMS Operatör')+'</company>'+
'<usercode>'+ DM.R.ReadString('SMS Kullanıcı') + '</usercode>'+
'<password>'+ DM.R.ReadString('SMS Şifre') + '</password>'+
'<startdate></startdate>'+
'<stopdate></stopdate>'+
'<type>1:n</type>'+
'<msgheader>' + DM.R.ReadString('SMS Orginatör') + '</msgheader>'+
'</header>'+
'<body>'+
'<msg><![CDATA['+MESAJ+' '+ DM.R.ReadString('SMS Mersis No') + ']]></msg>'+ mmoNUMARALAR.Text +
// '<no>' + mmoNUMARALAR.Text + '</no>'+
'</body>'+
'</mainbody>';
if not uUtils.XmlPost.XMLPOST(DM.SMS_URL, xsml, degisken) then
begin
end;
caption:='SMS Gönder ';
end;
if degisken='20'
then ShowMessage(' Mesaj Metninde boş olmasından veya maksimum mesaj karakterini geçildi ') else
if degisken='30'
then ShowMessage(' Kullanıcı bilgisi bulunamadı ') else
if degisken='40'
then ShowMessage(' Geçersiz Mesaj Başlığı (başlık sistem e tanımlanmamış) ') else
if degisken='50'
then ShowMessage(' Yetersiz Kredisi Lütfen Kredi Yükleyiniz ') else
if degisken='60'
then ShowMessage(' Telefon Numarası hiç tanımlanmamış ') else
if degisken='70'
then ShowMessage(' Mesaj Başlığı hatalı ') else
end;
end;
end;
end;