หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 3 3 2 6 3 2

7 ธันวาคม พ.ศ.2549
48 Users On-Line.
Visitors - Page views
 8 6 6 7 4 5 5
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

VB6 กับการส่งอีเมล์ด้วย MAPI (Messaging Application Program Interface)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 10/8/2552   เวลา: 13:58
(อ่าน : 16296) 
การเขียนโค้ดประกอบบทความ VB6 ในแต่ละตอนนั้น ผมอยากจะเสริม เพิ่มเติมในส่วนที่น้องๆรุ่นใหม่ๆหาไม่ค่อยเจอนักหรอก ในสถาบันการศึกษาที่ร่ำเรียนกันอยู่ นั่นคือผมพยายามจะนำเสนอเรื่องของ "การคิดที่จะเขียนโปรแกรม ไม่ใช่การคิดที่จะใช้โปรแกรม" ... ซึ่งผมแสวงหามันมาได้จากประสบการณ์จริงๆที่สัมผัสอยู่กับงาน และ ผู้คน ... บทความชิ้นนี้เป็นการใช้งาน MAPI (Messaging Application Program Interface) เพื่อใช้ในการส่งอีเมล์ แทนที่จะใช้ Winsock Control ซึ่งค่อนข้างจะมีความยุ่งยากในเรื่องของ Coding มากมายกว่า (ในความคิดของผมน่ะ) แต่ต้องทำงานร่วมกับ Microsoft Outlook Express ซึ่งมันติดมาพร้อมกับ MS Windows ทุกรุ่น ทุกสมัยเลยครับพี่น้อง ... ผมตระหนักดีว่าบทความประเภทนี้มันเป็นเสมือนดาบ 2 คม ดังนั้น ... หากอยากรู้เรื่องเต้าหู้ ก็ลองถามสาวยาคูลท์ดูเองล่ะกันครับ ... อิอิอิอิอิ
ดาวน์โหลด
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
  • จากเมนู Project --> Components ...
  • ออกแบบโปรแกรม (Design - Time)
  • RUN TIME
  • Browse
  • รับอีเมล์ใน GMAIL
    เริ่มต้นกระบวนการทำงาน
    
    Option Explicit
    
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' โปรแกรมย่อยในการส่งอีเมล์ผ่านทาง MAPI
    ' Messaging Application Program Interface (MAPI)
    Public Sub SendMail()
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
        ' อันที่จริงเรียกใช้ MAPI Control โดยตรงก็ได้ เช่น MAPISession1.SignOn
        Dim MySession As MAPISession
        Set MySession = MAPISession1
    
        ' หลักการของการใช้ MAPI Control มีดังนี้คือ
        ' สร้างหรือติดตั้ง Session ขึ้นมาใหม่ เพื่อทำการรับ หรือ ส่ง อีเมล์
        ' อ่านรายละเอียดตามลิ้งค์ด้านล่างนี้เลยครับ
        ' http://msdn.microsoft.com/en-us/library/aa733653(VS.60).aspx
        
        ' เริ่มต้นการสร้าง Session ... เอาแบบง่ายๆ (อธิบายเป็นข้อความช่างยากจริงๆ)
        ' Session คือ การเก็บข้อมูลของผู้ใช้งานเพื่อติดต่อกับ Server ไว้ในห้วงเวลาหนึ่งๆ
        ' เพื่อยืนยันตัวตน ให้ง่าย และ สะดวกต่อการเรียกใช้งาน
        With MySession
            
            ' เข้าสู่ระบบเพื่อทำการสร้าง Session ขึ้นมาใหม่
            If MAPISession1.SessionID = 0 Then .SignOn
            
            .NewSession = True
            
            MAPISession1.SessionID = .SessionID
            
        End With
    
        ' พอเริ่ม Session ใหม่แล้ว ก็ต้องจัดการเรื่องของ Message ในลำดับถัดไป
        Dim MyMessage As MAPIMessages
        Set MyMessage = MAPIMessages1
    
        With MyMessage
            ' เริ่มการส่งข้อมูลใหม่
            .Compose
            ' ระบุชื่อเมล์ที่ต้องการส่งไปหา
            .RecipAddress = txtSendTo.Text
            .AddressResolveUI = True
            .ResolveName
            
            ' หัวข้อเรื่องที่ส่ง
            .MsgSubject = txtSubject.Text
            ' เนื้อหา ข่าวสาร
            .MsgNoteText = txtBody.Text
            
            ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            ' ATTACH FILE - ไฟล์เอกสารแนบไปด้วย
            If Trim(txtAttachment.Text) <> "" Or Len(Trim(txtAttachment.Text)) > 0 Then
                With MyMessage
                    .AttachmentPosition = 0
                    ' ระบุการแนบไฟล์
                    .AttachmentType = 0
                    ' ตั้งค่าหัวข้อในการแนบไฟล์
                    .AttachmentName = "แนบไฟล์มาด้วย"
                    ' ส่งไฟล์ที่ต้องการแนบไปด้วย
                    .AttachmentPathName = txtAttachment.Text
                End With
            End If
            ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            
            ' ให้เป็น False เพื่อไม่ต้องการ Outlook Express แสดงผล
            .Send (False)
        End With
        
            ' หากไม่ต้องการให้ถามเพื่อยืนยันการส่งเมล์
            
            ' เปิดโปรแกรม Outlook Express 
            
            ' ไปที่เมนู Tools --> Options ... 
            
            ' ปลดเครื่องหมายถูกออก (บริเวณลูกศรสีแดงชี้)
            
            
        
        ' คืนค่าให้กับหน่วยความจำ ... หากจะส่งใหม่ก็ค่อยสร้าง Session ขึ้นมาใหม่
        Set MyMessage = Nothing
        Set MySession = Nothing
        
    End Sub
    
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' โปรแกรมย่อยในการแนบไฟล์ (Attachment)
    Private Sub cmdAttachment_Click()
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    'On Error Resume Next
    On Error GoTo ErrHandler
        
        Dim oAttachFile As String
        
        oAttachFile = Trim(txtAttachment.Text)
        dlgAttachment.FileName = ""
        dlgAttachment.CancelError = True ' ไม่สนใจ Error ที่เกิดขึ้น
        dlgAttachment.InitDir = App.Path    ' เลือกตำแหน่งปัจจุบันของ Project
        dlgAttachment.DialogTitle = "เลือกไฟลที่ต้องการแนบ" ' ตั้งค่า Title ของ Dialog
        dlgAttachment.Filter = "แสดงทุกไฟล์ (*.*) | *.*" ' แสดงผลทุกไฟล์
        dlgAttachment.ShowOpen
        dlgAttachment.DefaultExt = "*.*"
        
        ' อันนี้ยกมาทั้ง Path
        'oAttachFile = dlgAttachment.FileName
        
        ' อันนี้มาเฉพาะชื่อ และ นามสกุลไฟล์ที่ระบุ
        oAttachFile = dlgAttachment.FileTitle
        
        ' หากไม่มีการเลือกไฟล์ใดๆก็ให้ออกไปจากโปรแกรมย่อยส่วนนี้ได้เลย
        If oAttachFile = "" Then Exit Sub
        
        txtAttachment.Text = oAttachFile
    
    ExitProc:
        Exit Sub
    
    ErrHandler:
        ' หากไม่เท่ากับ 32755 ... คือหมายเลข Error 32755 นี้ คือ การกดปุ่ม Cancel น่ะครับ
        ' พูดง่ายๆ ผมไม่สนใจการเกิด Error นี้น่ะครับ ... แต่ Error อื่นๆ จะคอยดักไว้อีกที
        If Err.Number <> 32755 Then
            MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
            ' การสั่ง Resume คือ กระโดดไปยังตำแหน่งป้าย (Label) ที่ระบุ
            ' แต่ ณ บรรทัดนี้ มันจะออกจากโปรแกรมย่อยแล้ว ผมจึงไม่จำเป็นต้องสั่ง Resume
            ' Resume ExitProc
        End If
    End Sub
    
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' เหตุการณ์กดปุ่มส่งเมล์ ... มีการตรวจสอบข้อมูลด้วย
    Private Sub cmdSendMail_Click()
    ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' เริ่มต้นการตรวจสอบความถูกต้องของข้อมูล
        ' มือใหม่ๆถามกันมามากมายเหลือเกิน ... ขออธิบายฉบับย่อๆล่ะกันครับ
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' คำสั่ง TRIM คือ การตัดช่องว่างทั้งด้านหน้า และ ด้านหลังออก เช่น
        ' ให้ X = " ABC123   " ... เมื่อสั่ง Trim(X) จะทำให้มีค่า "ABC123"
        ' LTrim คือ การตัดช่องว่างด้านหน้าออก (ซ้ายมือ)
        ' RTrim คือ การตัดช่องว่างด้านหลังออก (ขวามือ)
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' คำสั่ง LEN คือ การนับความยาวของตัวอักขระ (Character) เช่น
        ' ให้ X = "ABC123" ... เมื่อสั่ง Len(X) จะทำให้ได้คำตอบเป็น 6 (ตัว)
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        
        ' ตรวจสอบข้อมูลเมล์ผู้รับ
        If Trim(txtSendTo.Text) = "" Or Len(Trim(txtSendTo.Text)) = 0 Then
            MsgBox "กรุณาป้อนอีเมล์ผู้รับให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
            txtSendTo.SetFocus
            Exit Sub
        ' ElseIf ควรตรวจสอบรูปแบบของอีเมล์ด้วยว่าถูกต้องหรือไม่ เช่น [email protected] Then
        ' ให้พี่น้องลองเอาไปคิดเป็นการเมือง เอ้ย การบ้านเองครับผม ... ว่าจะทำเช่นไร ...
        '
        ElseIf Trim(txtSubject.Text) = "" Or Len(Trim(txtSubject.Text)) = 0 Then
            MsgBox "กรุณาป้อนหัวข้อเรื่องให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
            txtSubject.SetFocus
            Exit Sub
        ElseIf Trim(txtBody.Text) = "" Or Len(Trim(txtBody.Text)) = 0 Then
            MsgBox "กรุณาป้อนเนื้อเรื่องให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
            txtBody.SetFocus
            Exit Sub
        End If
        
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' เรียกไปยังโปรแกรมย่อยที่ใช้ในการส่งเมล์
        Call SendMail
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        
    End Sub
    
    ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' ---------------- MAIN FORM ------------------
    Private Sub Form_Load()
    ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        Dim Ctrl As Control
        
        Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
        
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        ' การเคลียร์ค่า TextBox ทุกตัวในฟอร์มนี้ให้เป็นค่าว่าง
        ' Control ทุกๆตัวที่อยู่บนฟอร์ม
        For Each Ctrl In Me
            ' ถ้ามันเป็น TextBox ครั้นแล้วจงเป็นค่าว่าง .... คิกๆๆๆๆๆ
            If TypeOf Ctrl Is TextBox Then Ctrl.Text = ""
        Next
        ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        
    End Sub
    
    Private Sub txtSendTo_KeyDown(KeyCode As Integer, Shift As Integer)
        ' หากกดลูกศรลง ให้เลื่อน Cursur ไปยัง Control ตัวต่อไป
        If KeyCode = vbKeyDown Then SendKeys "{TAB}"
        ' หากกดลูกศรขึ้น ให้เลื่อน Cursur กลับไป Control ตัวก่อนนี้
        If KeyCode = vbKeyUp Then SendKeys "+{TAB}"
    End Sub
    
    Private Sub txtSendTo_KeyPress(KeyAscii As Integer)
        ' หากกดปุ่ม Enter หรือ ASCII Code = 13
        If KeyAscii = vbKeyReturn Then
            ' ปิดเสียงลำโพง
            KeyAscii = 0
            ' เลื่อน Cursur ไปยัง Control ตัวต่อไป
            SendKeys "{TAB}"
        End If
    End Sub
    
    
    Conclusion:
    จากการเกริ่นนำทางเพื่อให้พี่น้องได้รับชมกันมาพอสมควร หากคุณยังไม่รู้ว่าจะเอามันไปประยุกต์ใช้งานได้ยังไงต่อไปอีก โอ้โห ... ต้องฝึกคิดให้มากกว่านี้แล้วล่ะครับ ... แต่ยังไงๆแล้ว มันก็หนีไม่พ้นเรื่องของฐานข้อมูล ที่ต้องมาเกี่ยวข้องอยู่เสมอ ดังนั้นแล้วหากว่าคุณเป็นระดับมือใหม่ๆ ที่กำลังศึกษาการเขียนโปรแกรมอยู่ จงให้ความสำคัญกับเรื่อง DataBase เอาไว้ด้วย ... มันนำมาหากินได้อมตะนิรันดร์กาลจริงๆครับ ... พี่น้อง

  • จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
    เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
    CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
    Email: [email protected] หรือ โทร. 08-6862-6560