Enviando e-mail usando Ruby - SMTP

O protocolo SMTP (Simple Mail Transfer Protocol) é um protocolo que lida com o envio e o roteamento de e-mail entre servidores de e-mail.

Ruby fornece a classe Net :: SMTP para conexão do lado do cliente SMTP (Simple Mail Transfer Protocol) e fornece dois métodos de classe new e start .

  • o new leva dois parâmetros -

    • O nome do servidor padronizado para localhost.

    • O número da porta padronizado para a porta 25 conhecida.

  • o start método usa esses parâmetros -

    • O servidor - nome IP do servidor SMTP, padronizando para localhost.

    • A porta - número da porta, com o padrão de 25.

    • O domínio - Domínio do remetente do e-mail, padronizado para ENV ["HOSTNAME"].

    • A conta - nome de usuário, o padrão é nulo.

    • A senha - senha do usuário, com o padrão nulo.

    • O authtype - tipo de autorização, padronizado para cram_md5 .

Um objeto SMTP tem um método de instância chamado sendmail, que normalmente será usado para fazer o trabalho de envio de uma mensagem. Leva três parâmetros -

  • A fonte - uma string ou array ou qualquer coisa com cada iterador retornando uma string por vez.

  • O remetente - Uma string que aparecerá no do campo de e-mail.

  • Os destinatários - uma string ou uma matriz de strings que representa o (s) destinatário (s) dos destinatários.

Exemplo

Esta é uma maneira simples de enviar um e-mail usando o script Ruby. Experimente uma 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

Aqui, você colocou um e-mail básico na mensagem, usando um documento, cuidando para formatar os cabeçalhos corretamente. Os e-mails requerem umFrom, Toe Subject cabeçalho, separado do corpo do e-mail por uma linha em branco.

Para enviar o e-mail você usa Net :: SMTP para se conectar ao servidor SMTP na máquina local e então usa o método send_message junto com a mensagem, o endereço de e o endereço de destino como parâmetros (mesmo que os endereços de e para sejam no próprio e-mail, nem sempre são usados ​​para encaminhar e-mail).

Se você não estiver executando um servidor SMTP em sua máquina, poderá usar o Net :: SMTP para se comunicar com um servidor SMTP remoto. A menos que você esteja usando um serviço de webmail (como Hotmail ou Yahoo! Mail), seu provedor de e-mail fornecerá detalhes do servidor de envio de e-mail que você pode fornecer ao Net :: SMTP, da seguinte maneira -

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

Esta linha de código se conecta ao servidor SMTP na porta 25 de mail.seu-domínio.com sem usar nenhum nome de usuário ou senha. Se for necessário, você pode especificar o número da porta e outros detalhes. Por exemplo -

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

Este exemplo se conecta ao servidor SMTP em mail.seu-domínio.com usando um nome de usuário e uma senha em formato de texto simples. Ele identifica o nome do host do cliente como localhost.

Enviando um e-mail HTML usando Ruby

Ao enviar uma mensagem de texto usando Ruby, todo o conteúdo será tratado como texto simples. Mesmo que você inclua tags HTML em uma mensagem de texto, ela será exibida como texto simples e as tags HTML não serão formatadas de acordo com a sintaxe HTML. Mas Ruby Net :: SMTP oferece a opção de enviar uma mensagem HTML como uma mensagem HTML real.

Ao enviar uma mensagem de e-mail, você pode especificar uma versão Mime, tipo de conteúdo e conjunto de caracteres para enviar um e-mail em HTML.

Exemplo

A seguir está o exemplo para enviar conteúdo HTML como um e-mail. Experimente uma 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

Envio de anexos por e-mail

Para enviar um e-mail com conteúdo misto, é necessário definir Content-type cabeçalho para multipart/mixed. Então, as seções de texto e anexo podem ser especificadas dentroboundaries.

Um limite é iniciado com dois hifens seguidos por um número exclusivo, que não pode aparecer na parte da mensagem do e-mail. Um limite final denotando a seção final do e-mail também deve terminar com dois hifens.

Os arquivos anexados devem ser codificados com o pack("m") função para ter codificação base64 antes da transmissão.

Exemplo

A seguir está o exemplo, que irá enviar um arquivo /tmp/test.txt como um anexo.

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 - Você pode especificar vários destinos dentro da matriz, mas eles devem ser separados por vírgula.