Envoi d'e-mails à l'aide de Ruby - SMTP

Le protocole SMTP (Simple Mail Transfer Protocol) est un protocole qui gère l'envoi d'e-mails et le routage des e-mails entre les serveurs de messagerie.

Ruby fournit la classe Net :: SMTP pour la connexion côté client SMTP (Simple Mail Transfer Protocol) et fournit deux méthodes de classe new et start .

  • le new prend deux paramètres -

    • Le nom du serveur par défaut est localhost.

    • Le numéro de port par défaut sur le port bien connu 25.

  • le start méthode prend ces paramètres -

    • Le serveur - Nom IP du serveur SMTP, par défaut localhost.

    • Le port - Numéro de port, par défaut à 25.

    • Le domaine - Domaine de l'expéditeur du courrier, par défaut ENV ["HOSTNAME"].

    • Le compte - Nom d'utilisateur, la valeur par défaut est nulle.

    • Le mot de passe - Mot de passe utilisateur, nul par défaut.

    • Le authtype - Type d'autorisation, par défaut à cram_md5 .

Un objet SMTP a une méthode d'instance appelée sendmail, qui sera généralement utilisée pour effectuer le travail d'envoi d'un message. Il faut trois paramètres -

  • La source - Une chaîne ou un tableau ou quoi que ce soit avec un chaque itérateur renvoyant une chaîne à la fois.

  • L' expéditeur - Une chaîne qui apparaîtra dans le de domaine de l'e - mail.

  • Les destinataires - Une chaîne ou un tableau de chaînes représentant le (s) destinataire (s) des destinataires.

Exemple

Voici un moyen simple d'envoyer un e-mail à l'aide du script Ruby. Essayez-le une fois -

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

Ici, vous avez placé un e-mail de base dans un message, à l'aide d'un document, en prenant soin de formater correctement les en-têtes. Les e-mails nécessitent unFrom, To, et Subject en-tête, séparé du corps de l'e-mail par une ligne vide.

Pour envoyer le courrier, utilisez Net :: SMTP pour vous connecter au serveur SMTP sur la machine locale, puis utilisez la méthode send_message avec le message, l'adresse de l'expéditeur et l'adresse de destination comme paramètres (même si les adresses de départ et de destination sont dans l'e-mail lui-même, ceux-ci ne sont pas toujours utilisés pour acheminer le courrier).

Si vous n'exécutez pas de serveur SMTP sur votre machine, vous pouvez utiliser Net :: SMTP pour communiquer avec un serveur SMTP distant. Sauf si vous utilisez un service de messagerie Web (tel que Hotmail ou Yahoo! Mail), votre fournisseur de messagerie vous aura fourni les détails du serveur de messagerie sortant que vous pouvez fournir à Net :: SMTP, comme suit -

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

Cette ligne de code se connecte au serveur SMTP sur le port 25 de mail.votre-domaine.com sans utiliser aucun nom d'utilisateur ni mot de passe. Si vous en avez besoin, cependant, vous pouvez spécifier le numéro de port et d'autres détails. Par exemple -

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

Cet exemple se connecte au serveur SMTP à l'adresse mail.votredomaine.com à l'aide d'un nom d'utilisateur et d'un mot de passe au format texte brut. Il identifie le nom d'hôte du client comme localhost.

Envoi d'un e-mail HTML à l'aide de Ruby

Lorsque vous envoyez un message texte à l'aide de Ruby, tout le contenu sera traité comme un simple texte. Même si vous incluez des balises HTML dans un message texte, celui-ci sera affiché sous forme de texte simple et les balises HTML ne seront pas formatées selon la syntaxe HTML. Mais Ruby Net :: SMTP offre l'option d'envoyer un message HTML en tant que message HTML réel.

Lors de l'envoi d'un e-mail, vous pouvez spécifier une version de Mime, un type de contenu et un jeu de caractères pour envoyer un e-mail HTML.

Exemple

Voici l'exemple pour envoyer du contenu HTML sous forme d'e-mail. Essayez-le une fois -

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

Envoi de pièces jointes par e-mail

Pour envoyer un e-mail avec un contenu mixte, vous devez définir Content-type en-tête à multipart/mixed. Ensuite, les sections de texte et de pièce jointe peuvent être spécifiées dansboundaries.

Une limite est commencée par deux traits d'union suivis d'un numéro unique, qui ne peut pas apparaître dans la partie message de l'e-mail. Une limite finale indiquant la section finale de l'e-mail doit également se terminer par deux tirets.

Les fichiers joints doivent être encodés avec le pack("m") fonction d'avoir un encodage base64 avant la transmission.

Exemple

Voici l'exemple, qui enverra un fichier /tmp/test.txt en pièce jointe.

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 - Vous pouvez spécifier plusieurs destinations à l'intérieur du tableau, mais elles doivent être séparées par une virgule.