Ruby envoie un e-mail - SMATP


SMTP (Simple Mail Transfer Protocol) est un protocole de transfert de courrier simple. Il s'agit d'un ensemble de règles permettant de transmettre le courrier de l'adresse source à l'adresse de destination, qui contrôle la méthode de transfert de la lettre.

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

new La méthode a deux paramètres :

  • nom du serveur par défaut localhost

  • numéro de port par défaut 25

<🎜 La méthode >

start a les paramètres suivants :

  • server - IP du serveur SMTP, la valeur par défaut est localhost

  • port - Numéro de port, la valeur par défaut est 25

  • domain - Nom de domaine de l'expéditeur de l'e-mail, la valeur par défaut est ENV[" HOSTNAME "]

  • compte - nom d'utilisateur, la valeur par défaut est nulle

  • mot de passe - mot de passe utilisateur , la valeur par défaut est nil

  • authtype - type d'authentification, la valeur par défaut est cram_md5

Objet SMTP La méthode d'instanciation appelle sendmail avec les paramètres suivants :

  • source - une chaîne ou un tableau ou tout ce que chaque itérateur renvoie à tout moment.

  • expéditeur - une chaîne qui apparaît dans le champ du formulaire de courrier électronique.

  • destinataires - Une chaîne ou un tableau de chaînes représentant l'adresse du destinataire.

Exemple

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

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, 'me@fromdomain.com', 
                             'test@todomain.com'
end


Dans l'exemple ci-dessus, vous avez Configurez un message électronique de base, en faisant attention au formatage approprié de l'en-tête. Un e-mail nécessite De, À et Objet, ainsi qu'une ligne vide entre le contenu du texte 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 des e-mails. 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 ordinateur local, vous pouvez utiliser Net::SMTP pour communiquer avec un serveur SMTP distant. Si vous utilisez un service de messagerie Web (tel 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 connectera l'hôte à mail.your-domain. com , le serveur de messagerie avec le numéro de port 25, si vous devez renseigner le nom d'utilisateur et le 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 spécifié et mot de passe pour se connecter à l'hôte en tant que mail .votre-domaine.com, serveur de messagerie avec le numéro de port 25.


Utilisez Ruby pour envoyer des e-mails HTML

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 des e-mails au format HTML.

Exemples

Les exemples suivants sont utilisés pour envoyer des emails au format HTML :

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: 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, 'me@fromdomain.com', 
                             'test@todomain.com'
end


Envoyer des emails avec pièces jointes

Si vous devez envoyer contenu mixte Pour le courrier électronique, vous devez définir le type de contenu sur multipart/mixed. Cela vous permettra d'ajouter du contenu de pièce jointe à l'e-mail.

La pièce jointe doit utiliser la fonction pack("m") pour convertir son contenu au format base64 avant la transmission.

Exemple

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

require 'net/smtp'

filename = "/tmp/test.txt"
# 读取文件并编码为base64格式
filecontent = File.read(filename)
encodedcontent = [filecontent].pack("m")   # base64

marker = "AUNIQUEMARKER"

body =<<EOF
This is a test email to send an attachement.
EOF

# 定义主要的头部信息
part1 =<<EOF
From: Private Person <me@fromdomain.net>
To: A Test User <test@todmain.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=#{marker}
--#{marker}
EOF

# 定义消息动作
part2 =<<EOF
Content-Type: text/plain
Content-Transfer-Encoding:8bit

#{body}
--#{marker}
EOF

# 定义附件部分
part3 =<<EOF
Content-Type: multipart/mixed; name=\"#{filename}\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename="#{filename}"

#{encodedcontent}
--#{marker}--
EOF

mailtext = part1 + part2 + part3

# 发送邮件
begin 
  Net::SMTP.start('localhost') do |smtp|
     smtp.sendmail(mailtext, 'me@fromdomain.net',
                          ['test@todmain.com'])
  end
rescue Exception => e  
  print "Exception occured: " + e  
end

Remarque : Vous pouvez en spécifier plusieurs à envoyer Les adresses doivent être séparées par des virgules.