lunes, 31 de marzo de 2014

Error "se movio o elimino el elemento" Outlook envio de correo

Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.

 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.

Hola amigos les comparto un problema que tuve y lo resolvi, pero no creo que sea la mejor manera de hacerlo, asi que espero que alguien me oriente.
la rutina siguiente es larga pero eso es para que tengan mas o menos la vision del contexto en que estoy trabajando.
el objetivo es mandar una serie de correos a traves de un datagrid por medio de outlook, o sea, las ordenes que esten marcadas con una bandera se deben enviar,  pero al recorrer ese datagrid donde la tabla subyacente es dtabclientes, me envia un error despues de enviar el primer correo:"se movio o eliminoel elemento "
lo resolvi volviendo a limpiar el objmail y creando el item , pero me imagino que alguien que tenga mas experiencia en el envio de correo por outllok tendra una mejor solucion o porque me manda ese error
pongan atencion a donde dice OJO 
Private Sub cmdout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdout.Click
        'empieza
        Dim m_OutLook As Outlook.Application
        Dim sorden As String = ""
        Dim patharchivo As String
        Try
            ''emieza
            'Creamos un Objeto tipo Mail
            Dim objMail As Outlook.MailItem
            'Inicializamos nuestra apliación OutLook
            m_OutLook = New Outlook.Application
            'Creamos una instancia de un objeto tipo MailItem
' OJO ATENCION AL CREATEITEM
            objMail = CType(m_OutLook.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)
            Dim rutacorreos As String = cldatosorig.Traerutacorreo
            Dim nombrepdf As String
            ''empieza a grabar la fecha y el usuario que autorizo
            For Each dr As DataRow In dtabcliente.Rows
                If IsDBNull(dr("selenviocorreo")) Then
                    sorden = dr("orden").ToString
                Else
                    Dim ajmbandera As Boolean = CType(dr("selenviocorreo"), Boolean)

                    'verificar que exista el archivo
                    sorden = dr("orden").ToString
                    nombrepdf = "orden:" & dr("orden").ToString & "." & Txtext.Text
                    patharchivo = UCase(rutacorreos & dr("orden").ToString & "." & Me.Txtext.Text)
                    Dim Rta As Integer
                    If File.Exists(patharchivo) Then
                      
                        If CType(dr("selenviocorreo"), Boolean) Then 'solo pone fecha a las autorizadas
                            'comprueba si no ha sido autorizado antes
                            Dim usuantes As String
                            usuantes = dr("usuarenviocorreo").ToString
                            Dim cvalor As String
                            'calcula la hora para grabar con separacion de :
                            Dim iminutos As String = CType(Date.Now.TimeOfDay.Minutes(), String)
                            If Len(iminutos) = 1 Then 'agregarun cero porque es un solo digito
                                cvalor = Date.Now.TimeOfDay.Hours & ":0" & iminutos ' esto te da la hora y minutos
                            Else
                                cvalor = Date.Now.TimeOfDay.Hours & ":" & Date.Now.TimeOfDay.Minutes()
                            End If
                            If Len(usuantes) = 0 Then
                                If Me.TXTPARA.Text = String.Empty Then
                                    'OJO AQUI COLOCA LA CADENA DEL CORREO O CORREOS A ENVIAR
                                    objMail.To = dr("ajmmailrep").ToString
                                Else
                                    objMail.To = Me.TXTPARA.Text
                                End If
                                objMail.Subject = Me.Txtasunto.Text.ToString & dr("orden").ToString
                                objMail.Body = Me.txtmensaje.Text & dr("orden").ToString
                                If Me.TXTPARA.Text = String.Empty Then
                                    Rta = MsgBox("¿Realmente desea enviar el Mail? orden:" & dr("orden").ToString _
                                                 & "  al correo:" & dr("ajmmailrep").ToString, MsgBoxStyle.YesNo)
                                Else
                                    Rta = MsgBox("¿(PRUEBA)Realmente desea enviar el Mail? orden:" & dr("orden").ToString _
                                                 & "  al correo de PRUEBA:" & Me.TXTPARA.Text, MsgBoxStyle.YesNo)
                                End If
                                'Si queremos enviar un archivo adjunto usamos este codigo…
                                Dim sSource As String = patharchivo
                                Dim sBodyLen As String = objMail.Body.Length.ToString
                                Dim oAttachs As Outlook.Attachments = objMail.Attachments
                                Dim oAttach As Outlook.Attachment
                                oAttach = oAttachs.Add(sSource, , CType(sBodyLen, Single) + 1, nombrepdf)

                                If Rta = 6 Then
                                    'Enviamos nuestro Mail
                                    objMail.Send()
'OJO DESPUES DE ESTO ENVIA EL ERROR SE MOVIO O ELIMINO EL ELEMENTO POR ESTA RAZON VUELVO A PONERLE NOTHING Y VUELVO A CREAR UN ITEM
                                    objMail = Nothing
                                    objMail = CType(m_OutLook.CreateItem(Outlook.OlItemType.olMailItem), Outlook.MailItem)
                                    'Desplegamos un mensaje indicando que todo fue exitoso
                                    If Me.TXTPARA.Text = String.Empty Then
                                        MessageBox.Show("Envío exitoso.orden:" & dr("orden").ToString, "Enviar Mail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                                        dr("fechaenviocorreo") = Date.Now
                                        dr("horaenviocorreo") = cvalor
                                        dr("usuarenviocorreo") = ajmusuario
                                    Else
                                        MessageBox.Show("Envío PRUEBA exitoso.orden:" & dr("orden").ToString, "Enviar Mail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

                                    End If
                                ElseIf Rta = 7 Then
                                    MessageBox.Show("Envío cancelado", "Enviar Mail", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                                End If

                            Else 'quiere decir que ya grabo algo antes, entonces graba las fechas como modificacion
                                MessageBox.Show("Este correo ya fue enviado anteriormente; orden:" & dr("orden").ToString)
                                'dr("fechautmodif") = Date.Now
                                'dr("horaautmodif") = cvalor
                                'dr("usuautmodif") = ajmusuario
                            End If
                        End If
                    Else
                        MessageBox.Show("El archivo Pdf  de esta orden no existe, orden:" & sorden)
                    End If
                End If
            Next
            'termina grabar fecha y usuario
            If Me.TXTPARA.Text = String.Empty Then
                dacliente.Update(dtabcliente)
                dtabcliente.AcceptChanges()
            End If
          
        Catch ex As Exception
            'Si se produce algun Error
            MessageBox.Show(ex.ToString, "Error!orden:" & sorden, MessageBoxButtons.OK)
            'MessageBox.Show("Error al enviar mail")
        Finally
            m_OutLook = Nothing ' Destruimos el objeto (recoger la basura…)
        End Try
    End Sub