Envoi d'e-mails avec Ruby - SMTP

SMTP (Simple Mail Transfer Protocol) est un ensemble de règles pour transmettre du courrier d'une adresse source à une adresse de destination, et il contrôle la façon dont les messages sont relayés.

Ruby fournit Net::SMTP pour envoyer des e-mails, et fournit deux méthodes : new et start :

newLa méthode a deux paramètres :

  • nom du serveurValeur par défaut : localhost
  • numéro de portValeur par défaut : 25

startLa méthode a les paramètres suivants :

  • server- IP du serveur SMTP, par défaut localhost
  • port- Numéro de port, par défaut 25
  • domain- Domaine de l'expéditeur, par défaut ENV["HOSTNAME"]
  • account- Nom d'utilisateur, par défaut nil
  • password- Mot de passe de l'utilisateur, par défaut nil
  • authtype- Type d'authentification, par défautcram_md5

La méthode d'instance de l'objet SMTP appelle sendmail, avec les paramètres suivants :

  • source- Une chaîne, un tableau, ou tout ce qui est renvoyé par l'itérateur each à un moment donné.
  • sender- Une chaîne qui apparaît dans le champ de formulaire de l'e-mail.
  • recipients- Une chaîne ou un tableau de chaînes représentant l'adresse du destinataire.

Exemple

Ce qui suit fournit un simple script Ruby pour envoyer un e-mail :

Exemple

require 'net/smtp' message = <<MESSAGE_END From: Private Person <me@fromdomain.com> To: A Test User <test@todomain.com> 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
Dans l'exemple ci-dessus, vous avez configuré un message électronique de base. Notez le format correct de l'en-tête. Un e-mail a besoin de De, À et Objet, et il doit y avoir une ligne vide entre le contenu textuel et les informations d'en-tête.

Utilisez Net::SMTP pour vous connecter au serveur SMTP sur la machine locale, et utilisez la méthode send_message pour envoyer l'e-mail. Les paramètres de la méthode sont l'e-mail de l'expéditeur et l'e-mail du destinataire.

Si vous n'avez pas de serveur SMTP en cours d'exécution sur votre machine locale, vous pouvez utiliser Net::SMTP pour communiquer avec un serveur SMTP distant. Si vous utilisez des services de webmail (tels que Hotmail ou Yahoo Mail), votre fournisseur de messagerie vous fournira les détails du serveur de messagerie sortant :

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

Le code ci-dessus se connectera au serveur de messagerie avec l'hôte mail.your-domain.com et le port 25. Si vous devez renseigner un nom d'utilisateur et un mot de passe, le code est le suivant :

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

L'exemple ci-dessus utilise le nom d'utilisateur et le mot de passe spécifiés pour se connecter au serveur de messagerie avec l'hôte mail.your-domain.com et le port 25.


Envoi d'e-mails HTML avec Ruby

Net::SMTP prend également en charge l'envoi d'e-mails au format HTML.

Lors de l'envoi d'un e-mail, vous pouvez définir la version MIME, le type de document et le jeu de caractères pour envoyer un e-mail au format HTML.

Exemple

L'exemple suivant est utilisé pour envoyer un e-mail au format HTML :

Exemple

require 'net/smtp' message = <<MESSAGE_END From: Private Person <me@fromdomain.com> To: A Test User <test@todomain.com> MIME-Version: 1.0 Content-type: text/html Subject: Test d'e-mail SMTP Ceci est un message électronique à envoyer au format HTML <b>Ceci est un message HTML.</b> <h1>Ceci est un titre.</h1> MESSAGE_END Net::SMTP.start('localhost') do |smtp| smtp.send_message message, '[email protected]', '[email protected]' end

Envoi d'e-mails avec pièces jointes

Si vous devez envoyer un e-mail avec un contenu mixte, vous devez définir Content-type sur multipart/mixed. Ainsi, vous pouvez ajouter le contenu d'une pièce jointe à l'e-mail.

Avant la transmission, la pièce jointe doit utiliser la fonctionpack("m")pour convertir son contenu au format base64.

Exemple

L'exemple suivant enverra un e-mail avec la pièce jointe /tmp/test.txt :

Exemple

require 'net/smtp' filename = "/tmp/test.txt" #Lire le fichier et l'encoder au format base64 filecontent = File.read(filename) encodedcontent = [filecontent].pack("m") # base64 marker = "AUNIQUEMARKER" body =<<EOF Ceci est un a test e-mail pour envoyer une pièce jointe. EOF #Définir les informations d'en-tête principales part1 =<<EOF From: Private Person <me@fromdomain.net> To: A Test User <test@todmain.com> Subject: Envoi Attachement MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=#{marker} --#{marker} EOF # Définir l'action du message part2 =<<EOF Content-Type: text/plain Content-Transfer-Encoding:8bit #{body} --#{marker} EOF #Définir la partie de la pièce jointe part3 =<<EOF Content-Type: multipart/mixed; name=\"#{filename}\"Content-Transfer-Encoding:base64 Content-Disposition: attachment; filename="#{filename}" #{encodedcontent} --#{marker}-- EOF mailtext = part1 + part2 + part3 # Envoyer un e-mail begin Net::SMTP.start('localhost') do |smtp| smtp.sendmail(mailtext, '[email protected]', ['[email protected]']) end rescue Exception => e print "Une exception s'est produite: " + e end

Remarque :Vous pouvez spécifier plusieurs adresses de destinataires, mais elles doivent être séparées par des virgules.

Autres extensions