1

Konu: Mail gönderiminde hata

Mail gönderimi konusunda bir sorunum var arkadaşlar.
Aşağıdaki parametreleri göndererek mail gönderimini gerçekleştirebiliyorum. Eğer gönderdiğim mail adresi doğru ise sorunsuz çalışıyor. Yanlış ise try...catch ile yakalayıp yine sonraki mail gönderimi işlemine devam edebiliyorum. Tek mail adresi için hiç sorunsuz çalışıyor.
Ama eğer mailin gideceği adres birden fazla ise ve adreslerden 1 tanesi hatalı ise try... catch bloğuna düşmeden, doğru adreslere mailin gönderilmesini nasıl sağlayabilirim.
"OLE IDispatch exception.. The server rejected one or more address..." hatasıyla o mail gönderimi tümden kesiliyor. Benim istediğim doğru adreslere gitsin, yanlış adreslere gitmesin.
Try...catch ile hatayı yakalayıp çoklu adresleri tek tek ayırıp göndermeyi de deneyebilirim ama bu sefer mailin to: kısmı, cc: kısmı.. orjinalliği bozulacak.


Visual Fox Pro
PARAMETERS kimden1, kime1, baslik1, mesaj1, kime_cc1, kime_bcc1, mailserver1, kullanici1, sifre1, htmlformat1, atac1

LOCAL sema, ayar, mail
sema = "http://schemas.microsoft.com/cdo/configuration/"
ayar = CREATEOBJECT("CDO.Configuration")
WITH ayar.FIELDS
    .ITEM(sema + "smtpserverport") = 25
    .ITEM(sema + "sendusing") = 2
    .ITEM(sema + "smtpserver") = mailserver1
    .ITEM(sema + "smtpauthenticate") = 1
    .ITEM(sema + "sendusername") = kullanici1
    .ITEM(sema + "sendpassword") = sifre1
    .UPDATE
ENDWITH
mail = CREATEOBJECT ("CDO.Message")
mail.Configuration = ayar
WITH mail
    .FROM = kimden1
    .TO = kime1
    IF TYPE("kime_cc1") = "C"
        .CC = kime_cc1
    ENDIF
    IF TYPE("kime_bcc1") = "C"
        .BCC = kime_bcc1
    ENDIF
    .Subject = baslik1
    IF htmlformat1
        .HTMLBody = mesaj1
    ELSE
        .TextBody = mesaj1
    ENDIF
    IF ATAC1<>""
        att=.AddAttachment(atac1)
    ENDIF
    .SEND()
ENDWITH

2 Son düzenleyen, cetinbasoz (21.11.2007 23:41:12)

Re: Mail gönderiminde hata

kime1,kime_cc1,kime_bcc1'i bir fonksiyona gonder o adresleri ayırıp, vb.regexp ile kontrol etsin, sadece dogru olanlardan yeni listeyi geri gondersin.

Not: Email reg.exp pattern:

Visual Fox Pro
\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

3

Re: Mail gönderiminde hata

Çetin Hocam, vb.regexp nedir ?
Yazdığınız pattern'i nasıl kullanabilirim.

4

Re: Mail gönderiminde hata

Vb.RegExp bir string icinde bir 'kalip'a uyan parcalari bulmakta, degistirmekte filan kullanilan bir obje. Solution.app'ta baska ornekleri ve biraz dokumantasyon var. Tools\Code refrences icindeki aramalarda da kullanilabiliyor.
Email dogrulama:

Visual Fox Pro
lcAddressList = "cetin.basoz@somewhere.com;gecerliaddress@valid.com;"+;

  "gecerli-adres@xx.com;gecerli.adres@gecerli.com;gecersiz@gecersiz;sonadres@son.com"
lcAddressList = ValidateAddress(m.lcAddressList)
 
? m.lcAddressList
Procedure ValidateAddress
  Lparameters tcAddress
  tcAddress = Evl(m.tcAddress,'')
  Local loRegEx, loMatch, loMatches, lcEmailPattern, lcAddressList
  lcEmailPattern = "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"
 
  Local loRegEx, loMatch, loMatches, i
 
  loRegEx = Createobject("VBScript.RegExp")
  loRegEx.Pattern = m.lcEmailPattern
  loRegEx.ignoreCase = .T.
  loRegEx.Global = .T.
 
  loMatches = loRegEx.execute(m.tcAddress)
  Local Array aMatches[Max(loMatches.count,1),2]
 
 
  Set Textmerge To Memvar m.lcAddressList Noshow
  Set Textmerge On
  For Each loMatch In loMatches
\\<<loMatch.Value>>;
  Endfor
  Set Textmerge To
  Set Textmerge Off
  loMatches = .F.
  loRegEx = .F.
  Return Iif(Empty(m.lcAddressList),'',Stuff(m.lcAddressList,Len(m.lcAddressList),1,''))
Endproc


Baska ornek:

Visual Fox Pro
lcString = "mikrosoft foxpro mikro olcude vs mikroskop gibi bir cumle.Mikro, aranan."

oRX = Createobject("VBScript.RegExp")
With oRX
  .Pattern = "\bmikro\b" && mikro - ama sadece kelime ise, bilesikleri atla
  .IgnoreCase = .T. && buyuk kucuk ayrimi yapma
  .Global = .T.
ENDWITH
 
_screen.FontName = "Courier New"
 
** Test ile sadece var mi diye sor
? oRX.Test(m.lcString)
 
** Bulduklarini ^ isaretleyerek goster
clear
? m.lcString
Local loMatches
loMatches = oRX.Execute(m.lcString)
For Each loMatch In loMatches
    ? PADL("^",loMatch.firstIndex+1)
ENDFOR
 
* Bulduklarini "makro" ile degistir
NewString = oRX.Replace(m.lcString, "makro")
? m.lcString
? m.NewString

Email orneginde oldugu gibi cok karmasik 'pattern' tanimlamalari yapilabiliyor. Aynisini foxproda dongulerle yapmak cok karmasik.

5

Re: Mail gönderiminde hata

Hocam, öncelikle belirteyim, çok güzel ve gerekli bir konuda harika örneklerinizle bilgi sahibi oldum.
Bendeki sorun mail adresi kurallı dahi yazılsa karşı server yok ise veya karşı server adresi reject ederse hata mesajı alıyor olmamdı. Bunu da try..catch bloğu içine geri dönen adresleri tek tek bölerek tekrar göndermeyi deneyen en azından bir mailde 4-5 adres kullanılıyorsa o mailin try..catch sonucu iptal edilmemesi için gidebilenleri tekrar yolamaya çalışan halini yazdım. Kısacası try..catch içinde hata mesajı aldığında adresleri tek tek bölüyor, tekrar bir try..catch bloğuna sokarak çalışan mail adreslerine maili gönderiyor. Şimdilik bu yöntemle hallettim.
Ama yukarıdaki örnekleriniz başka konularda ufkumu açtı, kullanım alanları oldukça geniş ve yararlı olacak.
Tekrar teşekkürler.

6

Re: Mail gönderiminde hata

bunu deneyin: tamamen vfp koduyla yazılmış ve ücretsiz http://www.xfrx.net/vfpWinsock/SendMaildownload_e.asp

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com