Está en la página 1de 12

Mediante el uso de los controles MAPI de Visual Basic, es relativamente sencillo crear un cliente MAPI.

En las instrucciones y cdigo siguientes se demuestra cmo:

1.

Inicie Visual Basic y seleccione un proyecto EXE estndar. En el men Proyecto, haga clic en Componentes y seleccione Microsoft MAPI Controls. Hay dos iconos nuevos en la barra de herramientas. Ambos son sobres, uno con una llave y el otro con un clip. Son los controles MAPI.

2. 3.

Agregue estos controles MAPI al formulario: Agregue los siguientes elementos al formulario:

4. 5. 6. 7.

Cuatro etiquetas Cuatro botones de comandos (CommandButtons) Cuatro cuadros de texto (TextBoxes)

Los ttulos de las etiquetas son:

Label1.Caption = "Para:" Label2.Caption = "ASUNTO :" Label3.Caption = "DE:" Label4.Caption = "MENSAJE:"

8.

Site los cuadros de texto (TextBoxes) en secuencia numrica con estas etiquetas (la 1, 2 y 3 una junto a otra, y la 4 debajo).

9.

Nombre los botones de comando (CommandButton) como sigue:

10. 11. 12. 13. 14. 15. 16. Command1.Caption = "<<" Command2.Caption = ">>" Command3.Caption = "Conectar" Command4.Caption = "Enviar" Command5.Caption = "Cerrar sesin"

17. Agregue el cdigo siguiente al formulario:

18. 19. 20.

Option Explicit Dim X As Long

21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.

Private Sub Command1_Click() If X - 1 < 0 Then Else X = X - 1 MAPIMessages1.MsgIndex = X Text1.Text = MAPIMessages1.RecipDisplayName Text2.Text = MAPIMessages1.MsgSubject Text3.Text = MAPIMessages1.MsgOrigDisplayName Text4.Text = MAPIMessages1.MsgNoteText End If End Sub Private Sub Command2_Click() If X + 1 > MAPIMessages1.MsgCount Then X = MAPIMessages1.MsgCount Else X = X + 1 MAPIMessages1.MsgIndex = X Text1.Text = MAPIMessages1.RecipDisplayName Text2.Text = MAPIMessages1.MsgSubject Text3.Text = MAPIMessages1.MsgOrigDisplayName Text4.Text = MAPIMessages1.MsgNoteText End If End Sub Private Sub Command3_Click() MAPISession1.SignOn MAPIMessages1.SessionID = MAPISession1.SessionID MAPIMessages1.Fetch If MAPIMessages1.MsgCount > 0 Then Text1.Text = MAPIMessages1.RecipDisplayName Text2.Text = MAPIMessages1.MsgSubject Text3.Text = MAPIMessages1.MsgOrigDisplayName Text4.Text = MAPIMessages1.MsgNoteText

59. 60. 61.

Command4.Enabled = True Else MsgBox "No messages to fetch" MAPISession1.SignOff Command4.Enabled = False End If End Sub Private Sub Command4_Click() MAPIMessages1.Compose MAPIMessages1.RecipDisplayName = Text1.Text MAPIMessages1.MsgSubject = Text2.Text MAPIMessages1.MsgNoteText = Text4.Text MAPIMessages1.ResolveName MAPIMessages1.Send End Sub Private Sub Command5_Click() MAPISession1.SignOff Unload Me End Sub

62.
63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.

340 - Enviar email con el control Winsock


<Volver> - Anterior - Siguiente

Formulario para poder enviar un correo mediante el control Winsock de vb


Este ejemplo muestra como enviar un mensaje de correo , utilizando un servidor SMTP sin autentificacin con el control Microsoft Winsock El formulario

Nota: Al final de la pgina , hay otros ejemplos para poder leer y enviar correo con diferentes componentes

Controles para el formulario

1. txt_Server_Smtp : indica la ip o nombre del Host de correo a


utilizar para el envo

2. txt_nameFrom : Nombre del que envia el mail, en este caso


nuestro nombre. este parmetro es opcional

3. txt_emailFrom : Nuestra direccin de mail 4. txt_NameTo : Nombre del destinatario . Parmetro opcional 5. txt_MailTo : Obviamente parmetro obligatorio 6. txt_Asunto : parmetro opcional . Asunto del mensaje 7. txt_Mensaje : Para el texto del mensaje . Coloarle la propiedad
Multiline en true

8. ProgressBar : para mostrar l progreso 9. Dos CommandButton . Para conectar y desconectar 10. Un control Microsoft Winsock
Cdigo fuente en el formulario Texto planoCopiar cdigo fuenteImprimir

1. Option Explicit
2. 3.

4. Private m_Sleep
6. 7.

As Boolean

5. Private Estado As String

8. ' Rutina que enva el correo mediante el Winsock 9. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


10. 11.

12. Private Sub Winsock_mail(Smtp_Server As String, _ 13. 14. 15. 16. 17. 18.
19. Name_From As String, _ Mail_From As String, _ Name_To As String, _ Mail_to As String, _ Asunto_Mensaje As String, _ Mensaje As String)

20.
21. 22. 23. 24. 25. 26.

On Error GoTo Err_Sub Estado = vbNullString ProgressBar1.Max = 4 ProgressBar1.Value = 0

27.

With Winsock1

28.

29.
30.

' cierra el winsock .Close ' conecta al servidor en el puerto 25 .Connect Smtp_Server, "25"

31. 32.
33.

34. 35.
36.

' Bucle mientras conecta al Smtp Do While .State <> sckConnected DoEvents If .State = sckClosed Or .State = sckError Then MsgBox "Error ", vbCritical Desconectar Exit Sub End If Loop

37. 38.
39.

40. 41. 42.


43.

44. 45.
CrLf 46. 47.

' almcena el texto del estado del envio Estado = Estado & "Conectado a " & Smtp_Server & "." & vb

48.
49.

Do While m_Sleep = False DoEvents Loop

50.
51.

52. 53.
54.

' Envia los datos del remitente .SendData "MAIL FROM: " & Mail_From & vbCrLf

55. 56.
57.

' texto de estado Estado = Estado & "MAIL FROM: " & Mail_From & vbCrLf

58.
59.

Do While ProgressBar1.Value <> 1 DoEvents Loop

60.
61.

62. 63.
64.

' Envia los datos del destinatario .SendData "RCPT TO: " & Mail_to & vbCrLf

65. 66.
67.

' texto de estado Estado = Estado & "RCPT TO: " & Mail_to & vbCrLf

68. 69.
70.

' espera Do While ProgressBar1.Value <> 2 DoEvents Loop

71.
72.

73. 74. 75.


76.

' ac se enva el mail .SendData "DATA" & vbCrLf Estado = Estado & "DATA" & vbCrLf

77.
78. 79.

Do While ProgressBar1.Value <> 3 DoEvents

80.
81. 82.

Loop

83. 84.

.SendData "FROM: " & Name_From & " <" & Mail_From & ">" & vbCrLf .SendData "TO: " & Name_To & " <" & Mail_to & ">" & vbCrL f .SendData "SUBJECT: " & Asunto_Mensaje & vbCrLf .SendData vbCrLf .SendData Mensaje & vbCrLf Estado = Estado & Mensaje & vbCrLf

85.
86. 87. 88. 89. 90.

91.
92.

.SendData vbCrLf & "." & vbCrLf

93.
94.

Estado = Estado & vbCrLf & "." & vbCrLf

95.
96.

Do While ProgressBar1.Value <> 4 DoEvents Loop

97.
98.

99. 100.
101.

' Enva el comando de cierre .SendData "QUIT" & vbCrLf

102.
103. 104.

' cierra la conexin del winsock .Close

105.
106.

' muestra el mensaje de estado ( se puede _ mostrar en un textbox multilinea ) MsgBox Estado, vbInformation

107.

108. 109.

ProgressBar1.Value = 0

110.
111.

End With

112.
113.

Exit Sub

114.Err_Sub:

115.
116. 117.

' Si hay error muestra el mensaje y cierra el socket Winsock1.Close

118.
119.

MsgBox Err.Description, vbCritical

120.End Sub
121. 122. 123.

124.Private Sub Desconectar() 125.


126. 127. 'Cierra el Winsock Winsock1.Close

128.End Sub
129.

130.' Botn que enva el e-mail 131.'''''''''''''''''''''''''''''''''''''''''''''''''''''


132.

133.Private Sub Command1_Click()


134. Winsock_mail txt_Server_Smtp, _ txt_nameFrom, _ txt_emailFrom, _ txt_NameTo, _ txt_MailTo, _ txt_Asunto, _ txt_Mensaje

135.
136. 137. 138. 139. 140.

141.End Sub
142.

143.' Botn que Finaliza el socket abierto 144.''''''''''''''''''''''''''''''''''''''''''''''''''''' 145.Private Sub Command2_Click() 146.
148. 149. Call Desconectar

147.End Sub

150.' este evento recibe los datos de respuesta del servidor Smtp
_ 151. para poder almacenar el texto del estado de la operacion de e nvo _ 152. y mostrar el progreso en el progressbar

153. ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
''''''

154.Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)


155.

156.
157.

Dim Data As String 'Datos

158. 159.
160.

' Retorno del Winsock Dim ret As String

161.
162.

' recupera los datos Winsock1.GetData Data ' formatea ret = Mid(Data, 1, 3) Estado = Estado & Data & vbCrLf

163.
164. 165. 166. 167.

168. 169.
170.

Select Case ret Case 250 ProgressBar1.Value = ProgressBar1.Value + 1 Case 354 ProgressBar1.Value = ProgressBar1.Value + 1 Case 220 m_Sleep = True End Select

171.
172.

173. 174. 175.


176.

177.End Sub
178.

179.Private Sub Form_Load() 180. 181. 182.


Command1.Caption = " Enviar " Command2.Caption = " Desconectar " Me.Caption = "Envo de email con el control Winsock "

183.End Sub

Leer los correos de un Pop3 con el winsock y guardar los mensajes en disco como archivos EML
Este ejemplo se conecta a un Pop3, y obtiene todos los mail y los lista en un ListBox. Luego escribe el contenido del mail y lo guarda como archivo .Eml en el App.path En el formulario agregar un control Winsock llamado Winsock1. Un control Listbox y un CommandButon A al procedimiento LeerMail, pasarle como parmetro el nombre del servidor pop3, la cuenta, el password y el puerto
Texto planoCopiar cdigo fuenteImprimir

1. Dim Recibido As Boolean 2. Dim Mensaje As String 3. Dim sckError


4. 5.

6. Private Sub Command1_Click() 7. ' por ejemplo : 8. ' Call Leer("pop3.dominio.com", 110, "cuenta@dominio.com", "pas
sword")

9. End Sub
10.

11. ' se reciben los datos 12. '''''''''''''''''''''''''''' 13. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
14.

15.
16.

Winsock1.GetData Mensaje

17. 18. 19.


20. 21.

Select Case Winsock1.Tag Case "RETR" ' escribe en disco el archivo eml Put #1, , Mensaje

22. 23. 24. 25.


26.

If InStr(Mensaje, vbLf + "." + vbCrLf) Then Close 1 Recibido = True End If

27. 28. 29.

Case Else sckError = (Left$(Mensaje, 3) = "-ER") Recibido = True

30.
32.

End Select

31. End Sub 33. Private Sub Winsock1_Close()


34. Winsock1.Close

35. End Sub


36.

37. Private Sub Leer(Pop3 As String, _ 38. 39. 40.


41. 42. Puerto As Integer, _ Cuenta As String, _ Password As String)

43. ' Conecta con el Pop3


44. 45. Winsock1.Connect Pop3, Puerto

46.
47.

Do Until Recibido DoEvents Loop

48.
49.

50. 51. 52. 53.


54.

If sckError Then MsgBox "Error al conectar con el servidor Pop3", vbCritical Exit Sub End If

55. 56.
57.

' usuario SendCommand "USER " & Cuenta

58. 59. 60. 61.


62.

If sckError Then MsgBox "Error con el nombre de usuario ", vbCritical Exit Sub End If

63. 64.
65.

' Enva el passowrd SendCommand "PASS " & Password

66. 67. 68. 69.

If sckError Then MsgBox "Password incorrecto", vbCritical Exit Sub End If

70.

71. ' Get Number of Messages and total size in bytes 72. 73. 74. 75.
76. SendCommand "STAT" x = InStr(Mensaje, " ") b = InStrRev(Mensaje, " ") Messages = Val(Mid$(Mensaje, x + 1, b - x))

77. ' Recorre la cantidad de mensajes 78.


79. For i = 1 To Messages

80. 81. 82.


83.

Winsock1.Tag = "RETR" 'crea un archivo Open App.Path & "\eMail-" & i & ".eml" For Binary Access Write As #1

84. 85. 86.


87.

Call SendCommand("RETR " & i) List1.AddItem "eMail " & i Next

88.
90.

Winsock1.Tag = ""

89. End Sub 91. Sub SendCommand(Comando As String) 92.


93. Winsock1.SendData Comando + vbCrLf

94. 95.
96.

Recibido = False Do Until Recibido DoEvents Loop

97.

98. End Sub