Ruby menghantar e-mel - SMATP


SMTP (Simple Mail Transfer Protocol) ialah protokol pemindahan mel yang ringkas Ia adalah satu set peraturan untuk menghantar mel dari alamat sumber ke alamat destinasi, yang mengawal kaedah pemindahan surat.

Ruby menyediakan Net::SMTP untuk menghantar e-mel, dan menyediakan dua kaedah baharu dan mulakan:

baharu Kaedah ini mempunyai dua parameter:

  • nama pelayan lalai kepada localhost

  • nombor port lalai kepada 25

<🎜 Kaedah >

mula mempunyai parameter berikut:

  • pelayan - IP pelayan SMTP, lalai ialah localhost

  • port - Nombor port, lalai ialah 25

  • domain - Nama domain penghantar e-mel, lalai ialah ENV[" HOSTNAME "]

  • akaun - nama pengguna, lalai ialah sifar

  • kata laluan - kata laluan pengguna , lalai ialah sifar

  • authtype - jenis pengesahan, lalai ialah cram_md5

objek SMTP Kaedah instantiasi memanggil sendmail dengan parameter berikut:

  • sumber - rentetan atau tatasusunan atau apa sahaja yang dikembalikan oleh setiap iterator pada satu-satu masa.

  • pengirim - rentetan yang muncul dalam medan borang e-mel.

  • penerima - Rentetan atau tatasusunan rentetan yang mewakili alamat penerima.

Contoh

Berikut menyediakan skrip Ruby mudah untuk menghantar e-mel:

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


Dalam contoh di atas, anda mempunyai Sediakan mesej e-mel asas, memberi perhatian kepada pemformatan pengepala yang betul. E-mel memerlukan Daripada, Kepada dan Subjek, dan baris kosong antara kandungan teks dan maklumat pengepala.


Gunakan Net::SMTP untuk menyambung ke pelayan SMTP pada mesin tempatan dan gunakan kaedah send_message untuk menghantar e-mel Parameter kaedah ialah e-mel pengirim dan e-mel penerima.

Jika anda tidak mempunyai pelayan SMTP yang berjalan pada mesin tempatan anda, anda boleh menggunakan Net::SMTP untuk berkomunikasi dengan pelayan SMTP jauh. Jika menggunakan perkhidmatan mel web (seperti Hotmail atau Yahoo Mail), pembekal e-mel anda akan memberikan anda butiran pelayan mel keluar:

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

Kod di atas akan menyambungkan hos ke mail.your-domain. com , pelayan mel dengan nombor port 25, jika anda perlu mengisi nama pengguna dan kata laluan, kodnya adalah seperti berikut:


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

Contoh di atas menggunakan nama pengguna yang ditentukan dan kata laluan untuk menyambung ke hos sebagai mel .domain-anda.com, pelayan mel dengan nombor port 25.


Gunakan Ruby untuk menghantar e-mel HTML

Net::SMTP juga menyediakan sokongan untuk menghantar e-mel dalam format HTML.

Apabila menghantar e-mel, anda boleh menetapkan versi MIME, jenis dokumen dan set aksara untuk menghantar e-mel dalam format HTML.

Contoh

Contoh berikut digunakan untuk menghantar e-mel dalam 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


Hantar e-mel dengan lampiran

Jika anda perlu menghantar kandungan bercampur Untuk e-mel, anda perlu menetapkan Jenis Kandungan kepada berbilang bahagian/bercampur. Ini akan membolehkan anda menambah kandungan lampiran pada e-mel.

Lampiran perlu menggunakan fungsi pack("m") untuk menukar kandungannya kepada format base64 sebelum penghantaran.

Contoh

Contoh berikut akan menghantar e-mel dengan lampiran /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

Nota: Anda boleh menentukan berbilang kepada hantar Alamat mesti dipisahkan dengan koma.