Invio di e-mail utilizzando Ruby - SMTP

Il protocollo SMTP (Simple Mail Transfer Protocol) è un protocollo che gestisce l'invio di e-mail e il routing della posta tra i server di posta.

Ruby fornisce la classe Net :: SMTP per la connessione lato client SMTP (Simple Mail Transfer Protocol) e fornisce due metodi di classe new e start .

  • Il new accetta due parametri -

    • Il nome del server predefinito su localhost.

    • Il numero di porta predefinito per la nota porta 25.

  • Il start il metodo accetta questi parametri:

    • Il server : nome IP del server SMTP, predefinito su localhost.

    • La porta : numero di porta, il valore predefinito è 25.

    • Il dominio - Dominio del mittente della posta, predefinito su ENV ["HOSTNAME"].

    • L' account - Nome utente, il valore predefinito è zero.

    • La password - Password utente, predefinita a zero.

    • Il tipo di autenticazione - Tipo di autorizzazione, predefinito su cram_md5 .

Un oggetto SMTP dispone di un metodo di istanza chiamato sendmail, che in genere verrà utilizzato per eseguire il lavoro di invio di un messaggio. Ci vogliono tre parametri:

  • La fonte - Una stringa o un array o qualsiasi cosa con una ogni iteratore ritorno una corda alla volta.

  • Il mittente - Una stringa che apparirà nel dal campo della e-mail.

  • I destinatari - Una stringa o un array di stringhe che rappresentano i destinatari dei destinatari.

Esempio

Ecco un modo semplice per inviare un'e-mail utilizzando lo script Ruby. Provalo una volta -

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

Qui hai inserito una semplice e-mail nel messaggio, usando un documento, avendo cura di formattare correttamente le intestazioni. Le e-mail richiedono un fileFrom, To, e Subject intestazione, separata dal corpo dell'e-mail con una riga vuota.

Per inviare la posta si utilizza Net :: SMTP per connettersi al server SMTP sulla macchina locale e quindi utilizzare il metodo send_message insieme al messaggio, all'indirizzo del mittente e all'indirizzo di destinazione come parametri (anche se gli indirizzi da e a all'interno della posta elettronica stessa, questi non sono sempre utilizzati per instradare la posta).

Se non stai eseguendo un server SMTP sulla tua macchina, puoi usare Net :: SMTP per comunicare con un server SMTP remoto. A meno che tu non stia utilizzando un servizio di webmail (come Hotmail o Yahoo! Mail), il tuo provider di posta elettronica ti fornirà i dettagli del server di posta in uscita che puoi fornire a Net :: SMTP, come segue:

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

Questa riga di codice si connette al server SMTP sulla porta 25 di mail.tuo-dominio.com senza utilizzare alcun nome utente o password. Se necessario, tuttavia, è possibile specificare il numero di porta e altri dettagli. Ad esempio:

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

Questo esempio si connette al server SMTP all'indirizzo mail.tuo-dominio.com utilizzando un nome utente e una password in formato di testo normale. Identifica il nome host del client come localhost.

Invio di un'e-mail HTML utilizzando Ruby

Quando invii un messaggio di testo utilizzando Ruby, tutto il contenuto verrà trattato come testo semplice. Anche se includerai tag HTML in un messaggio di testo, verrà visualizzato come testo semplice e i tag HTML non verranno formattati secondo la sintassi HTML. Ma Ruby Net :: SMTP fornisce l'opzione per inviare un messaggio HTML come messaggio HTML effettivo.

Durante l'invio di un messaggio di posta elettronica è possibile specificare una versione Mime, un tipo di contenuto e un set di caratteri per inviare un messaggio di posta elettronica HTML.

Esempio

Di seguito è riportato l'esempio per inviare contenuto HTML come posta elettronica. Provalo una volta -

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

Invio di allegati come e-mail

Per inviare un'e-mail con contenuto misto è necessario impostare Content-type intestazione a multipart/mixed. Quindi è possibile specificare sezioni di testo e allegati all'internoboundaries.

Un confine inizia con due trattini seguiti da un numero univoco, che non può apparire nella parte del messaggio dell'email. Anche un confine finale che denota la sezione finale dell'email deve terminare con due trattini.

I file allegati dovrebbero essere codificati con l'estensione pack("m") funzione per avere la codifica base64 prima della trasmissione.

Esempio

Di seguito è riportato l'esempio, che invierà un file /tmp/test.txt come un allegato.

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 - È possibile specificare più destinazioni all'interno dell'array, ma devono essere separate da virgola.