viernes, 8 de mayo de 2009

ASP.NET – Enviar correos con archivos adjuntos

email Para enviar correos con archivos adjuntos, tenemos dos maneras,

1.- adjuntamos el archivo indicándole la ruta física donde está ubicado (en el servidor, claro):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim mail As New MailMessage

    mail.From = New MailAddress("algun_correo1")
    mail.To.Add("algun_correo2")

    mail.Subject = "Email de prueba con archivo adjunto"
    mail.Body = "chequea el archivo adjunto que viene en este email"

    Dim FilePath As String = Server.MapPath("~/files/simple_file.txt")
    'el archivo se adjunta indicándole la ruta
    mail.Attachments.Add(New Attachment(FilePath))

    Dim mailClient As New SmtpClient()

    Dim basicAuthenticationInfo As New NetworkCredential("algun_correo1", "algun_password1")

    mailClient.Host = "algun_email_host"

    mailClient.UseDefaultCredentials = True
    mailClient.Credentials = basicAuthenticationInfo
    mailClient.Send(mail)

End Sub

Este caso es útil cuando ya tenemos guardado el archivo en el servidor.

2.- Obtenemos el archivo mediante el control FileUpload, osea el archivo está en la máquina del cliente… sin necesidad de previamente guardarlo en el servidor:

Código ASPX:

<form id="form1" runat="server">
    <asp:FileUpload ID="FileUpload1" runat="server" />
    <br /><br />
    <asp:Button ID="Button1" runat="server" Text="Enviar correo con archivo adjunto" />
</form>

Código VB.NET:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

End Sub

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    Dim mail As New MailMessage

    mail.From = New MailAddress("algun_correo1")
    mail.To.Add("algun_correo2")

    mail.Subject = "Email de prueba con archivo adjunto"
    mail.Body = "chequea el archivo adjunto que viene en este email"

    If FileUpload1.HasFile Then

        Dim MyFile As String = System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName)
        Dim attachmentFile As New Attachment(FileUpload1.PostedFile.InputStream, MyFile)
        mail.Attachments.Add(attachmentFile)

    End If

    Dim mailClient As New SmtpClient()

    Dim basicAuthenticationInfo As New NetworkCredential("algun_correo1", "algun_password1")

    mailClient.Host = "algun_email_host"

    mailClient.UseDefaultCredentials = True
    mailClient.Credentials = basicAuthenticationInfo
    mailClient.Send(mail)

End Sub

Para ambos casos debemos importar:

Imports System.Net
Imports System.Net.Mail

Cualquier duda, comentan?

21 comentarios:

PDG dijo...

Breve, conciso y al pié... ¡Excelente!
Muchas gracias!

Elena A. dijo...

Hola,
Si tengo dos archivos en el servidor que quiero mandar por email, sé como adjuntar uno de los archivos, pero cómo adjunto los dos??

Saludos y gracias!

Segundo Serrano dijo...

Hola Elena,

sólo repite el código:

Dim File1 As String = Server.MapPath("~/files/simple_file1.txt")
Dim File2 As String = Server.MapPath("~/files/simple_file2.txt")

Mail.Attachments.Add(New Attachment(File1))
Mail.Attachments.Add(New Attachment(File2))

Saludos

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...
Este comentario ha sido eliminado por el autor.
Segundo Serrano dijo...

Hola charlie,

pon esto:
Imports System.Net
Imports System.Net.Mail

como las primeras dos líneas en tu código.

Saludos,

Unknown dijo...

gracias de verdad, tenia las importaciones del system.web.mail, la elimine y coloque las que me pusiste ahi y funciono correctamente, ahora no hay la necesidad de subir el archivo a mi servidor, gracias de antemano segundo y mis respetos para ti, tienes un chorro de material... exelente

Segundo Serrano dijo...

Charlie,

en el correo anterior has puesto tu correo y contraseña originales... ERROR!!

te sugiero que cambies tu contraseña porque hasta este momento ya alguien puede haberse enterado y podría ingresar a tu cuenta.

Saludos,

Unknown dijo...

uuutaaaaa es cierto, en fin ya hice los ajustes ahi necesarios y gracias por la observacion, no volvera a pasar

Unknown dijo...

Hola Segundo mucho gusto de saludarle...tengo una consulta:

encuentro su ejemplo muy interesante, estoy empezando con asp.net.. al emplear su ejemplo para enviar un correo aparece el error:

No connection could be made because the target machine actively refused it 64.202.165.58:25

Unknown dijo...

Dim _correode As String = Trim(Me.TextBox2.Text)
Dim _correopara As String = Trim(Me.TextBox5.Text)
Dim _proposito As String = Trim(Me.TextBox3.Text)

Dim mail As New MailMessage

mail.From = New MailAddress(_correode) '("algun_correo1")
mail.To.Add(_correopara) '("algun_correo2")

mail.Subject = _proposito '"Email de prueba con archivo adjunto"
mail.Body = "chequea el archivo adjunto que viene en este email"

If FileUpload1.HasFile Then

Dim MyFile As String = System.IO.Path.GetFileName(FileUpload1.PostedFile.FileName)
Dim attachmentFile As New Attachment(FileUpload1.PostedFile.InputStream, MyFile)
mail.Attachments.Add(attachmentFile)

End If

Dim mailClient As New SmtpClient()
Dim basicAuthenticationInfo As New NetworkCredential("pongo mi correo de empresa", "pongo mi password") '("algun_correo1", "algun_password1")

mailClient.Host = "smtpout.secureserver.net" '"algun_email_host"

mailClient.UseDefaultCredentials = True
mailClient.Credentials = basicAuthenticationInfo
mailClient.Send(mail)

Unknown dijo...

agradezco de antemano su apoyo..
saludos desde Nicaragua... Carlos

Segundo Serrano dijo...

Hola Carlos,

Pienso que no hay error del código ASP.NET, por otro lado, puedes intentar algunas cosas para ir descartando la causa del problema:
1.- Verifica que el nombre tanto del usuario/contraseña/servidor SMTP sean correctos.
2.- Haz Telnet al puerto 25 de tu servidor para ver si está trabajando.
3.- chequea que no haya firewalls bloqueando tu conexión.
4.- Verifica que el servicio SMTP está corriendo y trabajando sobre el puerto 25.

Saludos

Edwin Cieza Mostacero dijo...

me sale un error en mailClient.Send(mail)

y dice No se puede resolver el nombre remoto: 'juanperez483@gmail.com'

que pasa??

FrankoFull dijo...

Quiero poder adjuntar varios archivos atravez con el fileUpload... Alguna sugerencia? Gracias

Segundo Serrano dijo...

Hola Edwin,
disculpa la tardanza... pero recién vuelvo a estar operativo. No me ha pasado tu caso, necesito más detalles para poder ayudarte.
Saludos

Segundo Serrano dijo...

Hola Franco,

con un FileUpload no podrás. Peor puedes usar este componente en flash para realizar lo que deseas:
http://www.codeproject.com/KB/aspnet/FlashUpload.aspx
Saludos

Segundo Serrano dijo...

Franco,

Si quieres adjuntar varios archivos, y no te importa seleccionar de uno en uno, entonces puedes usar esta solución:
http://www.dotnetcurry.com/ShowArticle.aspx?ID=317

Unknown dijo...

[FormatException: La cadena especificada no tiene la forma obligatoria para una dirección de correo electrónico.]

en referencia a:
mail.From = New MailAddress("algun_correo1")

Segundo Serrano dijo...

Hola Unknown,

debes cambiar el texto "algun_correo1" por un correo válido.

Saludos

Unknown dijo...

Se produjo un error durante el intento de conexión ya que la parte conectada no respondió adecuadamente tras un periodo de tiempo, o bien se produjo un error en la conexión establecida ya que el host conectado no ha podido responder 173.194.68.108:25

Error en referencia a:
Línea 36: mailClient.Send(mail)


Estimado Segundo, agradecería tu apoyo.