Delphi mesajları gönderme. E-posta delphi gönderme. Modülün tam kaynak kodu

  • 07.03.2020

Mesaj gönderme

Windows sisteminin mesajlarını çeşitli pencerelere göndermesi gibi, uygulamanın kendisinin de kendi pencereleri ve kontrolleri arasında mesaj alışverişi yapması gerekebilir. İleti göndermenin birkaç yolu vardır: PerForm () yöntemi (Windows API'sinden bağımsız olarak çalışır) ve Win32 API SendMessage () ve PostMessage () işlevleri.

TControl sınıfının tüm alt öğelerinin sahip olduğu PerForm () yöntemi:

işlev TControl.Perform (Mesaj: Kardinal; WParam, LParam: Longint): Longint;

Bir forma veya kontrole mesaj göndermek için aşağıdaki sözdizimi kullanılır:

RetVal: = ControlName.PerForm (MessageID, wParam, lParam);

PerForm() çağrısı, mesaj işlenene kadar kontrolü çağıran programa döndürmez. Bu yöntem, Windows API mesajlaşma sistemini atlayarak mesajı iletir.

Windows biriminde bildirilen SendMessage () ve PostMessage () API işlevleri aşağıdaki gibidir:

fonksiyon SendMessage (hWnd: HWND; Mesaj: UINT; wParam: WPARAM;

lParam: LPARAM): LRESULT; standart çağrı;

fonksiyon Mesaj Mesajı (hWnd: HWND; Mesaj: UINT;

wParam: WPARAM; lParam: LPARAM): BOOL; standart çağrı;

hWnd - mesaj alıcı penceresi tanıtıcısı; Mesaj - mesaj tanımlayıcısı; wParam ve lParam ek verilerdir.

PerForm () yöntemi gibi SendMessage () işlevi, doğrudan pencere prosedürüne bir mesaj gönderir ve işlenmesini bekler ve PostMessage () işlevi, mesajı mesaj kuyruğuna koyar ve kontrolü çağıran programa geri döner. işlem sonuçlarını bekliyoruz.

SendMessage () işlevi, mesajın işlenmesinden elde edilen değeri döndürür. PostMessage () İşlevi - İletinin ileti kuyruğuna başarıyla yerleştirilip yerleştirilmediğini gösteren bir değer döndürür.

Özel mesajlar

Uygulama geliştirirken, uygulamanın bazı işlemleri gerçekleştirmek için kendisine veya başka bir uygulamaya özel bir mesaj göndermesi gereken bir durum ortaya çıkabilir. Windows, WM_USER'dan 7FFF'ye kadar kullanıcı tarafından sağlanan mesajlar için ayrılmış değerler.

Örnek özel gönderi:

TestMsg = WM_USER + 100; // Mesaj Kimliği

TForm1 = sınıf (TForm)

// mesaj işleme yöntemi:

prosedür MyMessage (var Msg: TMessage); mesaj TestMsg;

prosedür TForm1.MyMessage (var Msg: TMessage);

ShowMessage ("TestMsg mesajı çalışıyor");

Mesaj.Sonuç: = 1; // sonuç döndür

Bir forma mesaj gönderme örnekleri:

Form1.PerForm (TestMsg, 0, 0) = 1 ise

SendMessage (Form1.Handle, TestMsg, 0, 0) = 1 ise

ShowMessage ("Mesaj başarıyla işlendi");

PostMessage (Form1.Handle, TestMsg, 0, 0) ise

ShowMessage ("Mesaj, mesaj kuyruğuna yerleştirildi");

Delfi Etkinlikleri

Olay, bir program çalışırken olan şeydir. Delphi dilinin bakış açısından, bir olay prosedürel tipte bir özelliktir ve değeri bir yöntemin göstergesidir. Bu özelliğe bir değer atanması, olay anında yürütülecek olan yöntemin adresinin belirtilmesi anlamına gelir. Bu yöntemlere olay işleyicileri denir.

Olayları kullanmak, alt sınıf oluşturmadan mevcut bir sınıfa yeni işlevler eklemenize olanak tanır.

Olay özellikleri, "Açık" kelimesiyle başlamaya çalışır ve ardından olayın adı gelir.

Mesajlar ve olaylar arasındaki ilişki

Delphi, en azından bir kısmı olmak üzere, Windows mesajlarıyla etkileşim kurmak için bir arayüzdür. Birçok VCL bileşeni olayı, WM_XXX türündeki Windows iletileriyle doğrudan ilişkilidir.

Delphi'de mesaj işleme sırası
Tüm Delphi sınıfları, mesaj işleyicileri adı verilen yerleşik bir mesaj işleme mekanizmasına sahiptir. Sınıf bir mesaj alır ve alınan mesaja bağlı olarak bir dizi tanımlı metottan birini çağırır. Karşılık gelen bir yöntem tanımlanmadıysa, varsayılan işleyici çağrılır. Daha ayrıntılı olarak, bu mekanizma aşağıdaki gibi çalışır.

Mesaj alındıktan sonra, VCL mesajlaşma sistemi onu işlemek için birçok hazırlık çalışması yapar.

Yukarıda belirtildiği gibi, mesaj başlangıçta, onu ana mesaj döngüsündeki kuyruktan getiren TApplication.ProcessMessage yöntemi tarafından işlenir. Aynı zamanda, FOnMessage alanının içeriğini kontrol eder (aslında OnMessage olayı için bir işleyicinin varlığını kontrol eder) ve boş değilse olay işleyicisini çağırır ve alan boşsa (Nil) , ardından API işlevini DispatchMessage (Msg) çağırır. Mesaj gönderildiğinde bu olmaz.

OnMessage olay işleyicisi tanımlı değilse, alınan mesajı işlemek için DispatchMessage API işlevi çağrılır ve mesajı ana pencere prosedürüne iletir.

Bileşenin ana penceresine ulaştıktan sonra bir mesajın işlem döngüsünü düşünün. Mesaj işleme sırası aşağıdaki şekilde gösterilmektedir:

İletinin MainWndProc'a, ardından WndProc'a, ardından Dispatch'e ve ardından DefaultHandler'a iletildiğini görebilirsiniz.

Delphi, sanal olmayan bir ana yöntem sağlar AnaWndProc(Var Mesajı: TMessage) her bileşen penceresi için. İleti yapısını Windows'tan WindowProc özelliğinde tanımlanan sanal yönteme ileten bir istisna işleme bloğu içerir. Ancak, bu yöntem, uygulamanın HandleException yöntemini çağırarak ileti işleme sırasında oluşan istisnaları işler. Bu noktadan itibaren, eğer programınızın mantığı bunu gerektiriyorsa, mesajın özel olarak işlenmesini sağlayabilirsiniz. Tipik olarak, bu noktada, standart VCL işlemenin gerçekleşmesini önlemek için işleme değiştirilir.

Varsayılan olarak, nesnenin WindowProc özellik değeri, WndProc sanal yönteminin adresiyle başlatılır. Ayrıca, TWindowHook türünde kayıtlı mesaj engelleyicileri yoksa, WndProc, alınan mesaj yapısının Msg alanını kullanarak bu mesajın bu nesne için mesaj işleyicileri listesinde olup olmadığını belirleyen sanal TObject.Dispatch yöntemini çağırır. Nesne mesajı işlemezse, üst mesaj işleyicilerinin listesi incelenir. Sonunda böyle bir yöntem bulunursa, çağrılır, aksi takdirde DefaultHandler sanal yöntemi çağrılır.

Son olarak mesaj, kendisi için sağlanan işlemin gerçekleştirildiği uygun işlem prosedürüne ulaşır. Inherited anahtar sözcüğü kullanılarak, atalarda işlenmek üzere ayrıca gönderilir. Bundan sonra mesaj, son mesaj işlemeyi gerçekleştiren ve onu standart Windows işleme için DefWindowProc (DefMDIProc) prosedürüne ileten DefaultHandler yöntemine de iletilir.

Delphi bileşenleri tarafından mesaj işleme
Bu nedenle, mesaj işleme dizisinin kısa bir açıklaması aşağıdaki gibidir. Tüm iletiler başlangıçta, adresi WindowProc özelliğinde belirtilen yöntemden geçer. Varsayılan olarak, bu WndProc yöntemidir. Daha sonra mesaj yöntemlerine göre ayrılarak gönderilirler. Sonunda, daha önce işlenmemişlerse veya işleyicilerde devralınan işleyici (Inherited) çağrıldıysa, DefaultHandler yönteminde tekrar birleşirler. Sonuç olarak, Delphi bileşenleri aşağıdaki mesaj işleme yeteneklerine sahiptir:
a) Herhangi bir mesaj işleyicisi mesajı görmeden önce. Bu durumda, WindowProc özelliğindeki yöntem adresinin değiştirilmesi veya TControl.WndProc yönteminin değiştirilmesi gerekir.
WindowProc özelliği şu şekilde bildirilir:

Tur TWndMethod = prosedür(Var Mesajı: TMessage) Nesnenin;
Mülk WindowProc: TWndMethod;

Aslında, WindowProc özelliğini kullanarak, TWndMethod türünde bir yöntem oluşturabilir ve orijinal yöntemi geçici olarak oluşturulan yöntemle değiştirebilirsiniz, ancak yöntemin adresi WindowProc özelliğine kaydedilmediğinden, önce adresini kaydetmeniz gerekir. orijinal WndProc yöntemi, böylece daha sonra geri yüklenebilir.

OldWndProc: TWndMethod;
prosedür NewWndProc (var Message: TMessage);
prosedür TForm1.NewWndProc (var Message: TMessage);
var Ch: char;
başlamak
eğer message.Msg = WM_MOUSEMOVE ise başla
Edit1.Text: = 'x =' + inttostr (message.LParamLo) + ', y =' + inttostr (message.LParamHi);
son
başka WndProc (Mesaj);
son;

prosedür TForm1.FormCreate (Gönderen: TObject);
başlamak
OldWndProc: = WindowProc;
son;

prosedür TForm1.CheckBox1Click (Gönderen: TObject);
başlamak
CheckBox1.Checked ise WindowProc: = NewWndProc
başka WindowProc: = OldWndProc;
son;

b) İlgili mesaj yönteminin içinde.
Benzer bir örnek daha verelim.
WMPAINT'i yeniden çizmek için bileşenlere gönderilen mesajı kullanır.

TForml sınıfında, geçersiz kılmak ve geçersiz kılınan mesaj yönteminin uygulamasını sunmak için bu yöntemi bildireceğiz:

Ture TForml = Sınıf (TForm)
... // Gerekli diğer tüm duyurular
Korumalı
Prosedür WMPaint (Var Mesajı: TWMPaint); Mesaj WM_PAINT; Son;
Prosedür TForml.WMPaint (Var Mesajı: TWMPaint); Başlamak
CheckBox1.Checked ise ShowMessage
Miras;
Son;

Belirli mesaj işleyicilerini geçersiz kılarken, Windows'un ihtiyaç duyduğu temel mesaj işlemeyi yapmak için Inherited'ı aramak her zaman iyi bir fikirdir.

c) Mesaja karşılık gelen yöntemlerin her birini gördükten sonra.

Bu durumda, DefaultHandler yöntemini geçersiz kılmalısınız.

prosedür DefaultHandler (var Message); geçersiz kılmak;
prosedür TForm1.DefaultHandler (var Message);
var i: tamsayı;
başlamak
Kardinal (Mesaj) = WM_defh ise
i için: = 0 ila 10 başlar
bip;
uyku (100);
son
Başka
miras;
son;

prosedür TForm1.Button5Click (Gönderen: TObject);
başlamak
SendMessage (İşlemci, WM_defh, 0,0);
son;

Mesajlar ve olaylar arasındaki ilişki
Birçok Delphi VCL olayı, doğrudan Windows mesajlarıyla ilgilidir. Delphi yardım sistemi bu eşlemeleri listeler. Tablo 1'de sunulmuştur.

tablo 1

VCL etkinliğiWindows mesajıVCL etkinliğiWindows mesajı
AçıkEtkinleştirWM_ACTIVATEOnKeyPressWM_CHAR
TıklamadaWM_LBUTTONDOWNOnKeyUpWM_KEYUP
OnCreateWM_CREATEOnPaintWM_PAINT
OnDblClickWM_LBUTTONDBLCLKOnResizeWM_SIZE
OnKeyDownWM_KEYDOWNOnTimerWM_TIMER

Bunun için önceden tanımlanmış bir olay varsa, mesaj işleyicileri oluşturmaya değmez. Bu gibi durumlarda, üzerinde daha az kısıtlama olduğundan olay işlemenin kullanılması tavsiye edilir.

Genellikle, delphi programları e-posta yoluyla kullanılır. Bu makale, e-postanızın başka bir kullanıcıya nasıl gönderildiğini tam olarak açıklayacaktır. delphi'yi kullanarak. Bu durumda sadece standart delphi bileşenlerini kullanacağız.

İlk olarak yeni bir proje oluşturalım ve adını \ "Delphi ile mail gönderme\" olarak koyalım. Ardından 1x Memo, 3x Edit, 2x Botton gibi birkaç bileşen forma aktarılmalı ve ayrıca IdSMTP, IdAntiFreeze, IdMessage da aktarılmalıdır. Ardından, herhangi bir düğmenin onclick olayına yazın:

// SMTP sunucusunu seçin. Şu anda yandex var. IdSMTP1.Host:= "smtp.yandex.ru"; // giriş bilgileriniz (bazıları için alan adı ile yazmak gerekir). IdSMTP1.Kullanıcı Adı: = " [e-posta korumalı]"; // mail'den şifre. IdSMTP1.Password: =" qwerty123 "; // port, 587 kullanmanızı öneririz. IdSMTP1.Port: = 587; // Edit2'de mektubun konusu girilecektir. IdMessage1.Subject: = Edit2.Text; // Edit1 alıcının adresini içerecek. [e-posta korumalı]"; // memo1 göndermek istediğiniz metni içerecektir. IdMessage1.Body.Text: = memo1.Text; // Edit3 elektronik imzanızı (Ad) içerecektir. IdMessage1.From.Name:= Edit3.Text; // IdSMTP1.connect'i bağla; // IdSMTP1.Send (IdMessage1) gönder; // IdSMTP1.Disconnect'i kes;

IdMessage soru işaretleri gösteriyorsa

Bu hata, Rus harflerini girmeniz ve not bileşeninin bunları doğru okuyamamasından kaynaklanmaktadır, bunun için Utf8 kodlamasını belirtmeniz gerekir.

// IdMessage1.Charset kodlamasını ayarlayın: = "UTF-8"; // metni istediğiniz kodlamaya çevirin IdMessage1.Body.Text: = UTF8Encode (memo1.text);

Sevkiyata sorunsuz yaklaşıyoruz SMS- hücresel operatörlerin sms ağ geçidi aracılığıyla mesajlar. Bu yazıda, genel olarak nasıl mesaj gönderebileceğinize bakacağız ( e-posta-mesaj) aracılığıyla Delfi... Göndermek e-posta- İleteceğimiz mesajlar TidSMTP... Yani, adresi bilmemiz gerektiği ortaya çıktı. smtp-Mesajı göndereceğimiz sunucu. Genellikle posta hizmeti veren hizmetler adreslerinden önce atanır. smtp ve adresi alıyoruz smtp-sunucu. Sonuç olarak, alacağız rambler.ru... Buna göre yerine smtp ve Al smtp.mail.ru- bu bizim smtp sunucumuzun adresidir, bu sunucular için port hemen hemen her yerde aynıdır ve eşittir 25 ... Tüm bunlar sunucumuza bağlanırken bizim için faydalı olacaktır. Ardından, şifremize ihtiyacımız var ve giriş yap rambler.ru mesaj göndereceğimiz postamıza bağlanmak için. Şimdi forma başlayalım ve aşağıdaki bileşenleri yükleyelim

  • TidSMTP
  • TidAntiFreeze
  • T Düğmesi

Formdaki bileşenler, yani sunucumuza bağlanmak ve mesaj göndermek için hiçbir şey kalmadı. Bir form olayı için sunucumuza bağlanmak için OnCreate aşağıdaki kodu yaz

prosedür TForm1. FormCreate (Gönderen: TObject); IdSMTP1'i denemeye başlayın. AuthenticationType: = atLogin; IdSMTP1. Sunucu: = "smtp.rambler.ru"; IdSMTP1. Bağlantı Noktası: = 25; IdSMTP1. Kullanıcı adı: = " [e-posta korumalı]"; IdSMTP1. Şifre: =" şifre "; IdSMTP1. Bağlan; e dışında: İstisna do end; end;

Hat IdSMTP1.AuthenticationType: = atLogin; sunucumuzda yetkilendirdiğimizi gösterir. Bu bizim bağlantımız smtp-sunucu, kullanarak Bağlamak bağlandığımızı belirtiyoruz. Ardından, bir mesaj göndermemiz gerekiyor, bunun için özel bir veri türü var. TidMessage, gönderilen mektubumuzun biçimini tamamen belirler. Bu veri türünü kullanmak için şunları yapmanız gerekir: kullanır bağlantı modülü kimlik mesajı... Başlamak için, onu oluşturmanız ve ardından belirli bir şablona göre doldurmanız ve ardından ihtiyacımız olan adrese göndermeniz gerekir. Şimdi etkinliğe T Düğmesi- Tıklamada mesajımızı doldurup göndereceğiz.

prosedür TForm1. Button1Click (Gönderen: TObject); var msg: TIdMessage; msg deneyin: = TIdMessage. Oluştur (sıfır); mesaj Vücut. Ekle ("postayı test et"); mesaj Konu: = "başlık mesajı"; mesaj İtibaren. Adres: = " [e-posta korumalı]"; msj. Gönderen. Ad: =" Andrey "; msj. Alıcılar. EMailAdresleri: =" [e-posta korumalı]"; msg. IsEncoded: = True; IdSMTP1. Gönder (msg); msg. Ücretsiz; IdSMTP1. Bağlantıyı kes; e dışında: İstisna başlar msj. Ücretsiz; IdSMTP1. Bağlantıyı kes; bitir; bitir; bitir;

Şimdi tırmanabilirsin e-posta Mektubu nereye gönderdiğiniz ve ulaştığından emin olun, tabii ki gönderirken herhangi bir hata olmadıysa. Gövde.Ekle- mesaj metnini ayarlar, konular- mesajın başlığı, Kimden.Adres- gönderenin adresi, İsimden- Gönderenin adı, Alıcılar.E-postaAdresleri- alıcının muhatabını (yani kime göndereceğimizi) belirler e-posta). Sonunda, sadece kendimizden kopuyoruz smtp- yöntemi kullanan sunucular bağlantıyı kes.

Bu yazıda, kullanarak posta gönderme ve alma yöntemlerini ele alacağız. Delfi... Posta almak ve göndermek oldukça basittir, ancak hala birçok tuzak vardır, bu nedenle bu makaleyi dikkatlice okumak en iyisidir. Posta göndermek için bir bileşene ihtiyacımız var idSMTP sayfadan HindistanMüşteriler bileşen paletleri Delfi. Bu bileşen, protokolü kullanarak e-posta göndermek için ihtiyacınız olan her şeyi uygular. SMTP (Basit Posta Aktarım Protokolü), genellikle 25 numaralı bağlantı noktasını kullanır, ancak bunu başka bir bağlantı noktasıyla değiştirebilirsiniz (Port özelliği). Ayrıca şekil (boyut, renk vb.)

Müşterimizi uygulamaya başlayalım, bunun için forma koyacağız idSMTP.Ayrıca formun görünümünü de ayarlayın (ad, boyut vb.). Gerekirse, bağlantı noktasını değiştirebilirsiniz, ancak asıl şey, güvenlik duvarında bu bağlantı noktasının engelinin kaldırılması gerektiğini unutmamaktır. ile bağlanmak içinSMTPsunucu, ana bilgisayarını belirtmelisiniz (özellik ev sahibi). Örneğin: IdSMTP1.Host:= "smtp.posta.ru "; Veya (bizim yaptığımız gibi) forma yerleştirin etiket veDüzenlemek... Biraz ileriye koşarak, sunucuya bağlantının yöntemle yapıldığını söyleyeceğim. Bağlamak.

Örnek:

prosedürBağlamak (constAZaman aşımı:tamsayı);geçersiz kılmak;

Nereye ATimeout- isteğe bağlı parametre, bir yanıt için beklenecek maksimum süreyi milisaniye cinsinden ayarlar SMTP sunucu, ardından bağlantı kurma girişimi sonlandırılır. Örneğin: IdSMTP1.Connect (5000);

Sunucuya bağlanırken yetkilendirme gerekiyorsa, özellik değeri Kimlik Doğrulama Türü içine kurulması gerekiyor atGiriş, nesne denetçisindeyken özellikleri de tanımlamanız gerekir Kullanıcı adı ( Kullanıcı adı). Örneğin, posta kutusunun kullanıcı adı [e-posta korumalı] daha sonra kullanıcı adı bu durumda Delphi ve Parola (posta kutusu için parola) olacaktır veya bu işlem programlı olarak yapılabilir.

IdSMTP1.AuthenticationType: = atLogin;
IdSMTP1.Username: = "delphi";
IdSMTP1.Password: = "parola";

IdSMTP1.AuthenticationType: = atNone;

Örneğimizde, yetkilendirme için bir kullanıcı adı ve şifreye ihtiyacımız olacağını varsayacağız.

Yöntemi uyguladıktan sonra Bağlamak yürütülmesinin sonucunu kontrol etmek gerekir. Bu özellik kullanılarak yapılır bağlı, eğer doğruysa, o zaman bağlantı tamamdır.

Mesaj göndermek için işlevi kullanın Göndermek.

Örnek:

IdSMTP1.Gönder (Mesaj);

Şimdi mektubun yapısına daha yakından bakalım. Daha önce belirtildiği gibi, gönderme yöntemi, bir tür yapısı olan mesajın gövdesini gönderir. TIdMessage... Delphi'deki mektubun yapısı ayrı bileşenler tarafından uygulanmaktadır. TIdMessage... Bileşen paletinde bulunur Indy çeşitli.

tanım örneği TIdMessage yapılar:

var
Mesaj: TIdMessage;
başlamak
Msg.Subject: = "mesaj konusu"; // mesaj konu metni
Msg.Recipients.EMAilAddresses: = " [e-posta korumalı]";
// alıcının adresini belirtin
Msg.From.Adres: = " [e-posta korumalı]"; // mektubun yazarını belirtin
Msg.Body.Text: = "mesaj metni"; // mesaj metnini yerleştir
Msg.Date:=StrToDate("01.12.2004"); // mektubun gönderilme tarihi herhangi biri olabilir
son;

Mülk Ders mesajın konusunu tanımlar. Mülk alıcılar mülk içerir E-mail adresleri muhatapları tanımlar. Yani, sadece mektubun kime yönelik olduğu, virgül iki veya daha fazla posta adresinin ayırıcısı olarak işlev görür.

Örnek:

Msg.Recipients.EMAilAddresses: = "oluşturucu @ mail.ru, [e-posta korumalı] ";

Mülk İtibaren bir tür nesnesidir TIdEmailAdresÖğesi mektubu gönderen hakkında bilgi içerir. Bu özellik üç özellik içerir: İsim, Adres, Metin... Mülk Adres gönderenin e-posta kutusu hakkında bilgi içerir, türü vardır Sicim.

Örnek:

Msg.From.Adres: = " [e-posta korumalı]";

Mülk isim gönderenin adını temsil eder, türdedir Sicim.

Örnek:

Msg.From.Name:="Ivan Ivanovich ";

Mülk Metin, bu özelliklerin her ikisinin birleşik bilgilerini içerir. Şimdi mektubun gövdesine geçelim, tipi var TString'ler... Şimdi bir mektuba dosya eklemekten bahsedelim, yani ek... Bir mektuba dosya eklemeniz gerekiyorsa, sınıfın bir nesnesini oluşturmanız gerekecektir. TidEki... Bunu yapmak için, formun yapıcısını kullanmanız gerekecek:

yapıcı Oluştur (Koleksiyon: TIdMessageParts; const AFileName: TFileName = ""); yeniden tanıtmak;

Nereye Toplamak bir mektuba eklerin bir koleksiyonudur, türü TIdMessageParts... TFileName türündeki AFileName sabiti, sıradan bir metin dizesidir. İçinde, dosyanın doğru yolunu belirtmelisiniz.

Örnek:

TIdAttachment.Create (Msg.MessageParts, "c: file.zip");

Mesajı gönderdikten sonra, iletişim kanalının yüklenmemesi için sunucu ile bağlantının kesilmesi tavsiye edilir. Bağlantıyı Kes yöntemi kullanılarak bağlantı kesildi.

Örnek:

IdSMTP1.Bağlantıyı kes;