none
Enviar un mail desde SQL SERVER ESPRESS 2012 atravez de VS 2013 RRS feed

  • Pregunta

  • saludos amigos del foro, le traigo un inconveniente, necesito que desde el SQL server express 2012 se envie un mail en base a una hora especifica, como esta abajo con automatizacion de crystal report, ahora no se como hacerlo, se puede hacer eso si o no, si es si me podran ayudasr por favor,

    saludos,

    Rudolf Heiner.

    PD: Les dejo mi codigo

    Imports CrystalDecisions.CrystalReports.Engine
    Imports CrystalDecisions.Shared
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.IO

    Public Class vregistro

        Dim nue_conexion As New conexion
        Dim nue_var As New variables

        Public Sub Automatizacion()

            nue_var.consulta = _
                "SELECT id, fecha, idcli, nomcli, moneda, tc," & _
                " IIF(anulado = 1, 0, subtotmn2) AS subtotmn2, IIF(anulado = 1, 0, impuestomn) AS impuestomn, IIF(anulado = 1, 0, totmn) AS totmn," & _
                " anulado, 'FAC' AS Documento" & _
                " FROM vfacturasc WHERE fecha BETWEEN @FechaInicial AND @FechaFinal AND pais = '" & Sys_Pais & "' AND empresa = '" & Sys_Cia & "'" & _
                " ORDER BY Documento, Fecha, Id"

            Try

                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.Parameters.Add("@FechaInicial", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                nue_var.cmd.Parameters.Add("@FechaFinal", SqlDbType.Date).Value = Format(Date.Now, "dd/MM/yyyy")
                Dim Table As New DataTable()
                nue_var.dt = New DataTable("vregistro")
                nue_var.da = New SqlDataAdapter(nue_var.cmd)
                nue_var.da.Fill(nue_var.dt)
                nue_conexion.desconectar()
                Table = nue_var.dt

                Dim RepCrystal As New reporte_vregistro
                RepCrystal.SetDataSource(Table)
                RepCrystal.SetParameterValue("Usuario", Sys_Usuario)
                RepCrystal.SetParameterValue("Cia", Sys_Cia)
                RepCrystal.SetParameterValue("SimboloImpuesto", Sys_SimboloImpuesto)
                RepCrystal.SetParameterValue("Simbolo", Sys_Simbolo)

                Dim CrExportOptions As ExportOptions
                Dim CrDiskFileDestinationOptions As New DiskFileDestinationOptions()
                Dim CrFormatTypeOptions As New PdfRtfWordFormatOptions()
                CrDiskFileDestinationOptions.DiskFileName = "C:\Temp\Registro_de_Ventas.pdf"
                CrExportOptions = RepCrystal.ExportOptions
                With CrExportOptions
                    .ExportDestinationType = ExportDestinationType.DiskFile
                    .ExportFormatType = ExportFormatType.PortableDocFormat
                    .DestinationOptions = CrDiskFileDestinationOptions
                    .FormatOptions = CrFormatTypeOptions
                End With

                RepCrystal.Export()

            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

        End Sub

        Public Sub EnviaEmail()

            If File.Exists("C:\Temp\Registro_de_Ventas.pdf") Then
                My.Computer.FileSystem.DeleteFile("C:\Temp\Registro_de_Ventas.pdf")
            End If

            Automatizacion()

            Dim Mail As New NetMail.NetMail

            Dim Enviar_A As String = "arteycocinacartago@gmail.com" '"arteycocina@racsa.co.cr"
            Dim Nombre_a_Mostrar As String = "SysInt ~ Sistemas Integrados"
            Dim Subject As String = "Reporte de Registro de Ventas"
            Dim Host As String = "smtp.live.com" 'stmp hotmail        
            'Dim Host As String = "smtp.gmail.com" 'stmp gmail

            Dim Texto_A_Enviar As String = "Este es un mensaje desde el Sistema de Facturacion v.2016.1.0" 'mensaje
            Dim correo_Electronico As String = "rudolf_heiner@hotmail.com" 'tu correo electronico
            Dim Contrasena As String = "**********" ' tu contrasena

            Dim Puerto As String = "587"

            ''llenamos conla informcion la sub SendMail que se encuentra en nuestro nameSpace NetMail.NetMail
            Mail.SendMail(Enviar_A, Nombre_a_Mostrar, Net.Mail.MailPriority.High, Subject, Host, Texto_A_Enviar, correo_Electronico, Contrasena, Puerto)

        End Sub

    End Class

    Namespace NetMail

        ''' <summary>
        ''' Da Lugar a espesificar Lo Necesario para que el mensaje de correo electronico sea enviado
        ''' </summary>
        ''' <remarks></remarks>
        Public Class NetMail

            ''' <summary>
            '''  Envia Un E-mail Especificando LosParametros Necesarios que se Piden
            ''' </summary>
            ''' <param name="SendTo">E-mail Aquien se enviara el Mensaje de Correo Electronico</param>
            ''' <param name="DisplayName">Nombre Que se mostrara En el Mensaje Ejemplo: Su Nombre O Nombre de Su Amigo</param>
            ''' <param name="MailPriority">Prioridad Del mensaje Ejemplo: High, Low, Normal</param>
            ''' <param name="Subjet">Texto Que se mostrara como Descripcion del Mensaje Ejemplo:Productos En Ofertas </param>
            ''' <param name="BodyTextToSend">Texto que se Mostrara Como Cuerpo Del Mensaje, Para Mejor Calidad Use Un Control RichTextBox</param>
            ''' <param name="Host">Nombre Del Servidor De la Cuenta de Su Correo Electronico Ejemplo: si Tiene una cuenta de Gmail el Servidor seria "Smtp.Gmail.com" </param>
            ''' <param name="UserName">Espesifique Su Correo electronico </param>
            ''' <param name="PassWord">Spesifique su Contrasena de Su correo electronico </param>
            ''' <param name="Ports" >Puerto de su servidor Para Gmail es 587 </param>
            ''' <remarks></remarks>

            Public Overloads Sub SendMail(ByVal SendTo As String, ByVal DisplayName As String, ByVal MailPriority As Net.Mail.MailPriority, ByVal Subjet As String, ByVal Host As String, ByVal BodyTextToSend As String, ByVal UserName As String, ByVal PassWord As String, ByVal Ports As String)

                Dim correo As New System.Net.Mail.MailMessage
                Dim smtp As New System.Net.Mail.SmtpClient

                If My.Computer.Network.IsAvailable = True Then

                    Try

                        correo.From = New Net.Mail.MailAddress(SendTo, DisplayName, System.Text.Encoding.Default)

                        correo.To.Add(SendTo)

                        correo.SubjectEncoding = System.Text.Encoding.Default

                        correo.Subject = Subjet

                        correo.Body = BodyTextToSend

                        correo.BodyEncoding = System.Text.Encoding.Default

                        correo.IsBodyHtml = True

                        correo.Priority = MailPriority

                        Dim attachment As System.Net.Mail.Attachment
                        attachment = New System.Net.Mail.Attachment("C:\Temp\Registro_de_Ventas.pdf")
                        correo.Attachments.Add(attachment)

                        smtp.Timeout = "500000"

                        smtp.Credentials = New System.Net.NetworkCredential(UserName, PassWord)
                        smtp.Host = Host
                        smtp.Port = Ports

                        smtp.EnableSsl = True
                        smtp.Send(correo)

                        MessageBox.Show("Mensaje enviado", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)

                    Catch ex As Exception

                        MessageBox.Show(ex.Message, "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Error)

                    End Try

                Else

                    MessageBox.Show("No tiene conexion a Internet, Verfique su conexion y intentelo de nuevo", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information)

                End If

            End Sub

        End Class

    End Namespace


    • Editado Rudolf Heiner miércoles, 1 de febrero de 2017 3:16
    • Cambiado Joyce_AC miércoles, 1 de febrero de 2017 15:55
    miércoles, 1 de febrero de 2017 2:44

Respuestas

  • Para usar el envío de correo desde SQL Server necesitarías una de las ediciones "grandes". En la Express no se incluye el envío de correo. Y lo mismo pasa en cuanto a que lo haga "a una hora específica". Eso se logra con el Agente de SQL Server, pero una vez más no está en la Express, se necesitaría una edición más grande.

    Así que, si no puedes adquirir un SL Server de pago, entonces me temo que vas a tener que hacerlo por programación. Podrías hacer en VB.NET un Servicio Windows que use un Timer y el reloj del sistema para ver cuándo se alcanza la hora del envío, y cuando llegue la hora, enviar el correo mediante System.Net.Mail de forma parecida a como lo tienes ahora.

    • Marcado como respuesta Rudolf Heiner miércoles, 1 de febrero de 2017 9:57
    miércoles, 1 de febrero de 2017 7:40
  • Gracias por responder Alberto, lo que me dices de hacerlo ya esta en vb.net, te podria preguntar otra cosa, como podria que mi aplcacion se gargue cuando encienden el windows, me podras ayudar en eso?

    saludo,

    rudolf  heiner.

    • Marcado como respuesta Rudolf Heiner miércoles, 1 de febrero de 2017 9:57
    miércoles, 1 de febrero de 2017 9:34

Todas las respuestas

  • Para usar el envío de correo desde SQL Server necesitarías una de las ediciones "grandes". En la Express no se incluye el envío de correo. Y lo mismo pasa en cuanto a que lo haga "a una hora específica". Eso se logra con el Agente de SQL Server, pero una vez más no está en la Express, se necesitaría una edición más grande.

    Así que, si no puedes adquirir un SL Server de pago, entonces me temo que vas a tener que hacerlo por programación. Podrías hacer en VB.NET un Servicio Windows que use un Timer y el reloj del sistema para ver cuándo se alcanza la hora del envío, y cuando llegue la hora, enviar el correo mediante System.Net.Mail de forma parecida a como lo tienes ahora.

    • Marcado como respuesta Rudolf Heiner miércoles, 1 de febrero de 2017 9:57
    miércoles, 1 de febrero de 2017 7:40
  • Gracias por responder Alberto, lo que me dices de hacerlo ya esta en vb.net, te podria preguntar otra cosa, como podria que mi aplcacion se gargue cuando encienden el windows, me podras ayudar en eso?

    saludo,

    rudolf  heiner.

    • Marcado como respuesta Rudolf Heiner miércoles, 1 de febrero de 2017 9:57
    miércoles, 1 de febrero de 2017 9:34
  • como podria que mi aplcacion se gargue cuando encienden el windows

    Para que se cargue nada mas iniciar Windows, y ANTES de que un usuario haya hecho Login, no puede ser una aplicacion corriente, porque la aplicacion requiere acceso al escritorio y no existe escritorio hasta que el usuario hace Login.

    Asi que la aplicacion tiene que ser un Servicio Windows para poderla iniciar de esta manera (que ruede en background en Windows aunque nadie haya hecho login).

    Suponiendo que efectivamente hayas programado la aplicacion como Servicio Windows, entonces si has seguido las recomendaciones para estos Servicios y has generado en la aplicacion las clases que instalan el servicio, entonces basta que instales la aplicacion (con un .msi o con InstallUtil) y automaticamente se configura para que se inicie al iniciar Wiindows.

    miércoles, 1 de febrero de 2017 16:23