Envío de correo electrónico mediante Ruby - SMTP

El Protocolo simple de transferencia de correo (SMTP) es un protocolo que maneja el envío de correo electrónico y el enrutamiento de correo electrónico entre servidores de correo.

Ruby proporciona la clase Net :: SMTP para la conexión del lado del cliente del Protocolo simple de transferencia de correo (SMTP) y proporciona dos métodos de clase new y start .

  • los new toma dos parámetros -

    • El nombre del servidor predeterminado es localhost.

    • El número de puerto predeterminado es el puerto conocido 25.

  • los start método toma estos parámetros -

    • El servidor : nombre de IP del servidor SMTP, cuyo valor predeterminado es localhost.

    • El puerto : número de puerto, cuyo valor predeterminado es 25.

    • El dominio : dominio del remitente del correo, cuyo valor predeterminado es ENV ["HOSTNAME"].

    • La cuenta : nombre de usuario, el valor predeterminado es nulo.

    • La contraseña : contraseña de usuario, por defecto nula.

    • El AuthType - Tipo de Autorización, por defecto a cram_md5 .

Un objeto SMTP tiene un método de instancia llamado sendmail, que normalmente se utilizará para hacer el trabajo de enviar un mensaje. Se necesitan tres parámetros:

  • La fuente : una cadena o matriz o cualquier cosa con cada iterador que devuelve una cadena a la vez.

  • El emisor - Una cadena que aparecerá en el del campo del correo electrónico.

  • Los destinatarios : una cadena o una matriz de cadenas que representan los destinatarios de los destinatarios.

Ejemplo

Aquí hay una forma sencilla de enviar un correo electrónico usando el script Ruby. Pruébelo una vez -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', '[email protected]'
end

Aquí, ha colocado un correo electrónico básico en el mensaje, utilizando un documento, teniendo cuidado de formatear los encabezados correctamente. Los correos electrónicos requieren unFrom, Toy Subject encabezado, separado del cuerpo del correo electrónico con una línea en blanco.

Para enviar el correo, use Net :: SMTP para conectarse al servidor SMTP en la máquina local y luego use el método send_message junto con el mensaje, la dirección de remitente y la dirección de destino como parámetros (aunque las direcciones de origen y destino son dentro del propio correo electrónico, estos no siempre se utilizan para enrutar el correo).

Si no está ejecutando un servidor SMTP en su máquina, puede usar Net :: SMTP para comunicarse con un servidor SMTP remoto. A menos que esté utilizando un servicio de correo web (como Hotmail o Yahoo! Mail), su proveedor de correo electrónico le habrá proporcionado los detalles del servidor de correo saliente que puede proporcionar a Net :: SMTP, de la siguiente manera:

Net::SMTP.start('mail.your-domain.com')

Esta línea de código se conecta al servidor SMTP en el puerto 25 de mail.your-domain.com sin usar ningún nombre de usuario o contraseña. Sin embargo, si es necesario, puede especificar el número de puerto y otros detalles. Por ejemplo

Net::SMTP.start('mail.your-domain.com', 
                25, 
                'localhost', 
                'username', 'password' :plain)

Este ejemplo se conecta al servidor SMTP en mail.your-domain.com usando un nombre de usuario y contraseña en formato de texto sin formato. Identifica el nombre de host del cliente como localhost.

Enviar un correo electrónico HTML usando Ruby

Cuando envía un mensaje de texto con Ruby, todo el contenido se tratará como texto simple. Incluso si incluye etiquetas HTML en un mensaje de texto, se mostrará como texto simple y las etiquetas HTML no se formatearán de acuerdo con la sintaxis HTML. Pero Ruby Net :: SMTP ofrece la opción de enviar un mensaje HTML como mensaje HTML real.

Al enviar un mensaje de correo electrónico, puede especificar una versión de Mime, el tipo de contenido y el juego de caracteres para enviar un correo electrónico HTML.

Ejemplo

A continuación se muestra el ejemplo para enviar contenido HTML como correo electrónico. Pruébelo una vez -

require 'net/smtp'

message = <<MESSAGE_END
From: Private Person <[email protected]>
To: A Test User <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END

Net::SMTP.start('localhost') do |smtp|
   smtp.send_message message, '[email protected]', '[email protected]'
end

Envío de archivos adjuntos como correo electrónico

Para enviar un correo electrónico con contenido mixto, es necesario configurar Content-type encabezado a multipart/mixed. Luego, las secciones de texto y adjuntos se pueden especificar dentroboundaries.

Un límite se inicia con dos guiones seguidos de un número único, que no puede aparecer en la parte del mensaje del correo electrónico. Un límite final que indique la sección final del correo electrónico también debe terminar con dos guiones.

Los archivos adjuntos deben codificarse con la pack("m") función para tener codificación base64 antes de la transmisión.

Ejemplo

A continuación se muestra el ejemplo, que enviará un archivo /tmp/test.txt como un archivo adjunto.

require 'net/smtp'

filename = "/tmp/test.txt"
# Read a file and encode it into base64 format
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")   # base64

marker = "AUNIQUEMARKER"
body = <<EOF
This is a test email to send an attachement.
EOF

# Define the main headers.
part1 = <<EOF
From: Private Person <[email protected]>
To: A Test User <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary = #{marker}
--#{marker}
EOF

# Define the message action
part2 = <<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

# Define the attachment section
part3 = <<EOF
Content-Type: multipart/mixed; name = \"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename = "#{filename}"

#{encodedcontent}
--#{marker}--
EOF

mailtext = part1 + part2 + part3

# Let's put our code in safe area
begin 
   Net::SMTP.start('localhost') do |smtp|
      smtp.sendmail(mailtext, '[email protected]', ['[email protected]'])
   end
rescue Exception => e  
   print "Exception occured: " + e  
end

NOTE - Puede especificar varios destinos dentro de la matriz, pero deben estar separados por comas.