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.