English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Envío de correo SMTP en Ruby

SMTP (Simple Mail Transfer Protocol) es el Protocolo de Transferencia de Correos Electrónicos Simple, es un conjunto de reglas utilizado para enviar correos electrónicos de una dirección de origen a una dirección de destino, y controla la forma en que se transfieren los correos.

Ruby proporciona Net::SMTP para enviar correos electrónicos y proporciona dos métodos new y start:

new El método tiene dos parámetros:

  • nombre del servidor Por defecto es localhost

  • número de puerto Por defecto es  25

start El método tiene los siguientes parámetros:

  • servidor  - SMTP 服务器 IP, 默认为 localhost

  • port  - 端口号,默认为 25

  • domain - 邮件发送者域名,默认为 ENV["HOSTNAME"]

  • account - 用户名,默认为 nil

  • password - 用户密码,默认为nil

  • authtype - 验证类型,默认为 cram_md5

SMTP 对象示例化方法调用了 sendmail, 参数如下:

  • source  - 一个字符串或数组或每个迭代器在任一时间中返回的任何东西。

  • sender -一个字符串,出现在 email 的表单字段。

  • recipients - 一个字符串或字符串数组,表示收件人的地址。

Ejemplo en Línea

以下提供了简单的Ruby脚本来发送邮件:

Ejemplo en Línea

require 'net/smtp'
 
message = <<MESSAGE_END
From: Private Person <[email protected]>
Para: Un Usuario de Prueba <[email protected]>
Asunto: SMTP e-correo electrónico de prueba
 
This is a test e-mail message.
MESSAGE_END
 
Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', 
                             '[email protected]'
final

在以上示例中,你已经设置了一个基本的电子邮件消息,注意正确的标题格式。一个电子邮件要要From,To和Subject,文本内容与头部信息间需要一个空行。

使用Net::SMTP连接到本地机器上的SMTP服务器,使用send_message方法来发送邮件,方法参数为发送者邮件与接收者邮件。

如果你没有运行在本机上的SMTP服务器,您可以使用Net::SMTP与远程SMTP服务器进行通信。如果使用网络邮件服务(如Hotmail或雅虎邮件),您的电子邮件提供者会为您提供发送邮件服务器的详细信息:

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

以上代码将连接主机为 mail.your-domain.com,端口号为 25的邮件服务器,如果需要填写用户名密码,则代码如下:

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

以上示例使用了指定的用户名密码连接到主机为 mail.your-domain.com,端口号为 25的邮件服务器。

使用 Ruby 发送 HTML 邮件

Net::SMTP同样提供了支持发送 HTML 格式的邮件。

发送电子邮件时你可以设置MIME版本,文档类型,字符集来发送HTML格式的邮件。

Ejemplo en Línea

以下示例用于发送 HTML 格式的邮件:

Ejemplo en Línea

require 'net/smtp'
 
message = <<MESSAGE_END
From: Private Person <[email protected]>
Para: Un Usuario de Prueba <[email protected]>
MIME-Versión: 1.0
Contenido-tipo: texto/html
Asunto: SMTP e-correo electrónico de prueba
 
Este es un e-mensaje de correo electrónico para enviar en formato HTML
 
<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]'
final

Enviar correo electrónico con adjunto

Si se necesita enviar un correo electrónico con contenido mixto, se debe configurar el Content-tipo multipart/mixed. de esta manera se puede agregar contenido adjunto al correo electrónico.

La adjunto necesita ser usada pack("m") La función lo convierte en base64 formato.

Ejemplo en Línea

El siguiente ejemplo enviará el adjunto como /tmp/Correo electrónico de test.txt:

Ejemplo en Línea

require 'net/smtp'
 
filename = "/tmp/test.txt"
# Leer archivo y codificar en base64Formato
filecontent = File.read(filename)
contenido_codificado = [filecontent].pack("m") # base64
 
marcador = "AUNIQUEMARKER"
 
cuerpo =<<EOF
Este es un correo electrónico de prueba para enviar un adjunto.
EOF
 
# Definición de la información principal de la cabecera
part1 =<<EOF
De: Persona Privada <[email protected]>
Para: Un Usuario de Prueba <[email protected]>
Asunto: Enviando Adjunto
MIME-Versión: 1.0
Contenido-Tipo: multipart/mixed; límite=#{marker}
--#{marker}
EOF
 
# Definición de la acción del mensaje
part2 =<<EOF
Contenido-Tipo: texto/plano
Contenido-Transferencia-Codificación:8bit
 
#{body}
--#{marker}
EOF
 
# Definición de la parte adjunta
part3 =<<EOF
Contenido-Tipo: multipart/mixed; nombre=\"#{filename}\"
Contenido-Transferencia-Codificación: base64
Contenido-Disposición: adjunto; nombre_de_archivo="#{filename}"
 
#{encodedcontent}
--#{marker}--
EOF
 
mailtext = part1 + part2 + part3
 
# Enviar correo
begin 
  Net::SMTP.start('localhost') do |smtp|
     smtp.sendmail(mailtext, '[email protected]',
                          ['[email protected]'])
  final
rescue Exception => e  
  print "Exception occurred: " + e  
final

Nota:Puedes especificar múltiples direcciones de envío, pero deben separarse con comas.