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

Envio de E-mail SMTP com Ruby

SMTP (Simple Mail Transfer Protocol) é o Protocolo de Transmissão de E-mail Simples, é um conjunto de regras usado para transmitir e-mails de um endereço de origem para um endereço de destino, controlando a maneira de transferência das mensagens.

O Ruby oferece Net::SMTP para enviar e-mails e fornece dois métodos novo e start:

novo A função tem dois parâmetros:

  • nome do servidor O padrão é localhost

  • número da porta O padrão é  25

iniciar Os parâmetros da função são os seguintes:

  • servidor  - IP do servidor SMTP, o padrão é localhost

  • port  - Porta, o padrão é 25

  • domain - Domínio do remetente de e-mail, o padrão é ENV["HOSTNAME"]

  • account - Nome de usuário, o padrão é nil

  • password - Senha do usuário, o padrão é nil

  • authtype - Tipo de verificação, o padrão é cram_md5

O método de exemplo de objeto SMTP chamou sendmail, os parâmetros são os seguintes:

  • source  - Uma string ou uma matriz ou qualquer coisa que um iterador retorne a qualquer momento.

  • sender -Uma string, que aparece no campo do formulário do e-mail.

  • recipients - Uma string ou uma matriz de strings, representando o endereço do destinatário.

Exemplo Online

A seguir, está fornecido um simples script Ruby para enviar e-mails:

Exemplo Online

require 'net/smtp'
 
message = <<MESSAGE_END
From: Private Person <[email protected]>
Para: Um Usuário de Teste <[email protected]>
Assunto: SMTP e-teste de e-mail
 
This is a test e-mensagem de e-mail.
MESSAGE_END
 
Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', 
                             '[email protected]'
fim

Nos exemplos acima, você configurou uma mensagem de e-mail básica, observe o formato correto do título. Um e-mail deve conter From, To e Subject, e há uma linha em branco entre o conteúdo do e-mail e as informações de cabeçalho.

Conecte-se ao servidor SMTP local usando Net::SMTP, use o método send_message para enviar e-mails, os parâmetros do método são o e-mail do remetente e o e-mail do destinatário.

Se você não estiver executando um servidor SMTP no seu computador, você pode usar Net::SMTP para se comunicar com um servidor SMTP remoto. Se você estiver usando um serviço de e-mail pela Internet (como Hotmail ou Yahoo Mail), seu provedor de e-mail fornecerá os detalhes do servidor de envio de e-mails:

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

O código acima conecta ao host mail.your-domain.com, a porta é 25do servidor de e-mail, se necessário, preencher o nome de usuário e senha, o código é o seguinte:

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

Os exemplos acima utilizaram o nome de usuário e senha específicos para se conectar ao host mail.your-domain.com, a porta é 25do servidor de e-mail.

Envio de e-mails HTML usando Ruby

Net::SMTP também oferece suporte para o envio de e-mails em formato HTML.

Ao enviar e-mails, você pode configurar a versão MIME, o tipo de documento e o conjunto de caracteres para enviar e-mails em formato HTML.

Exemplo Online

A seguir, há um exemplo de envio de e-mails em formato HTML:

Exemplo Online

require 'net/smtp'
 
message = <<MESSAGE_END
From: Private Person <[email protected]>
Para: Um Usuário de Teste <[email protected]>
MIME-Versão: 1.0
Content-type: text/html
Assunto: SMTP e-teste de e-mail
 
Este é um e-mensagem de e-mail a ser enviada no formato HTML
 
<b>This is an HTML message.</b>
<h1>This is headline.</h1>
MESSAGE_END
 
Net::SMTP.start('localhost') do |smtp|
  smtp.send_message message, '[email protected]', 
                             '[email protected]'
fim

Enviar e-mail com anexo

Se precisar enviar e-mails com conteúdo misto, é necessário configurar o Content-O tipo é multipart/mixed. Dessa forma, é possível adicionar conteúdo de anexo ao e-mail.

O anexo precisa ser codificado antes de ser transmitido pack("m") A função converte seu conteúdo para base64 formato.

Exemplo Online

Os seguintes exemplos enviarão anexos como /tmp/E-mail do test.txt:

Exemplo Online

require 'net/smtp'
 
filename = "/tmp/test.txt"
# Leitura do arquivo e codificação em base64Formato
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m") # base64
 
marker = "AUNIQUEMARKER"
 
body =<<EOF
Este é um e-mail de teste para enviar um anexo.
EOF
 
# Definição das informações principais do cabeçalho
part1 =<<EOF
De: Pessoa Privada <[email protected]>
Para: Um Usuário de Teste <[email protected]>
Assunto: Enviando Anexo
MIME-Versão: 1.0
Content-Tipo: multipart/mixed; boundary="#{marker}"
--#{marker}
EOF
 
# Definição da ação da mensagem
part2 =<<EOF
Content-Tipo: text/plain
Content-Transfer-Codificação:8bit
 
#{body}
--#{marker}
EOF
 
# Definição da parte do anexo
part3 =<<EOF
Content-Tipo: multipart/mixed; name="#{filename}"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="#{filename}"
 
#{encodedcontent}
--#{marker}--
EOF
 
mailtext = part1 + part2 + part3
 
# Enviar e-mail
begin 
  Net::SMTP.start('localhost') do |smtp|
     smtp.sendmail(mailtext, '[email protected]',
                          ['[email protected]'])
  fim
rescue Exception => e  
  print "Ocorreu exceção: " + e  
fim

Atenção:Você pode especificar várias endereços de envio, mas precisa usar vírgula para separá-los.