การส่งอีเมลโดยใช้ Ruby - SMTP

Simple Mail Transfer Protocol (SMTP) เป็นโปรโตคอลที่จัดการการส่งอีเมลและการกำหนดเส้นทางอีเมลระหว่างเซิร์ฟเวอร์เมล

ทับทิมให้ระดับสุทธิ :: SMTP สำหรับธรรมดา Mail Transfer Protocol (SMTP) การเชื่อมต่อฝั่งไคลเอ็นต์และการมีสองวิธีการเรียนใหม่และการเริ่มต้น

  • new ใช้สองพารามิเตอร์ -

    • ชื่อเซิร์ฟเวอร์เริ่มต้นเป็น localhost

    • หมายเลขพอร์ตผิดนัดกับพอร์ตที่รู้จักกันดี 25

  • start วิธีใช้พารามิเตอร์เหล่านี้ -

    • เซิร์ฟเวอร์ - ชื่อ IP ของเซิร์ฟเวอร์ SMTP ที่ผิดนัด localhost

    • พอร์ต - หมายเลขพอร์ต, ผิดนัด 25

    • โดเมน - โดเมนของผู้ส่งจดหมายผิดนัด ENV [ "HOSTNAME"]

    • บัญชี - ชื่อผู้ใช้เริ่มต้นเป็นศูนย์

    • รหัสผ่าน - รหัสผ่านของผู้ใช้ผิดนัดศูนย์

    • AuthType - ประเภทการอนุมัติผิดนัดcram_md5

ออบเจ็กต์ SMTP มีวิธีการอินสแตนซ์ที่เรียกว่า sendmail ซึ่งโดยทั่วไปจะใช้ในการทำงานของการส่งข้อความทางไปรษณีย์ ต้องใช้สามพารามิเตอร์ -

  • แหล่งที่มา - สตริงหรืออาร์เรย์หรืออะไรกับแต่ละ iterator กลับหนึ่งสายในเวลา

  • ส่ง - สตริงที่จะปรากฏในจากข้อมูลของอีเมล

  • ผู้รับ - สตริงหรืออาร์เรย์ของสตริงที่เป็นตัวแทนของผู้รับผู้รับ (s)

ตัวอย่าง

นี่เป็นวิธีง่ายๆในการส่งอีเมลโดยใช้สคริปต์ Ruby ลองสักครั้ง -

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

ที่นี่คุณได้วางอีเมลพื้นฐานไว้ในข้อความโดยใช้เอกสารดูแลจัดรูปแบบส่วนหัวให้ถูกต้อง อีเมลต้องการไฟล์From, Toและ Subject ส่วนหัวแยกออกจากเนื้อหาของอีเมลด้วยบรรทัดว่าง

ในการส่งเมลคุณใช้ Net :: SMTP เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SMTP บนเครื่องโลคัลจากนั้นใช้เมธอด send_message พร้อมกับข้อความที่อยู่ต้นทางและที่อยู่ปลายทางเป็นพารามิเตอร์ (แม้ว่าที่อยู่จากและถึงจะเป็น ภายในอีเมลเองสิ่งเหล่านี้ไม่ได้ใช้เพื่อกำหนดเส้นทางอีเมลเสมอไป)

หากคุณไม่ได้ใช้เซิร์ฟเวอร์ SMTP บนเครื่องของคุณคุณสามารถใช้ Net :: SMTP เพื่อสื่อสารกับเซิร์ฟเวอร์ SMTP ระยะไกล เว้นแต่คุณจะใช้บริการเว็บเมล (เช่น Hotmail หรือ Yahoo! Mail) ผู้ให้บริการอีเมลของคุณจะให้รายละเอียดเซิร์ฟเวอร์เมลขาออกที่คุณสามารถส่งไปยัง Net :: SMTP ดังต่อไปนี้ -

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

รหัสบรรทัดนี้เชื่อมต่อกับเซิร์ฟเวอร์ SMTP บนพอร์ต 25 ของ mail.your-domain.com โดยไม่ต้องใช้ชื่อผู้ใช้หรือรหัสผ่านใด ๆ หากคุณต้องการคุณสามารถระบุหมายเลขพอร์ตและรายละเอียดอื่น ๆ ได้ ตัวอย่างเช่น -

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

ตัวอย่างนี้เชื่อมต่อกับเซิร์ฟเวอร์ SMTP ที่ mail.your-domain.com โดยใช้ชื่อผู้ใช้และรหัสผ่านในรูปแบบข้อความธรรมดา ระบุชื่อโฮสต์ของไคลเอนต์เป็น localhost

การส่งอีเมล HTML โดยใช้ Ruby

เมื่อคุณส่งข้อความโดยใช้ Ruby เนื้อหาทั้งหมดจะถือว่าเป็นข้อความธรรมดา แม้ว่าคุณจะรวมแท็ก HTML ไว้ในข้อความ แต่แท็กนั้นจะแสดงเป็นข้อความธรรมดาและแท็ก HTML จะไม่ได้รับการจัดรูปแบบตามไวยากรณ์ HTML แต่ Ruby Net :: SMTP มีตัวเลือกในการส่งข้อความ HTML เป็นข้อความ HTML จริง

ในขณะที่ส่งข้อความอีเมลคุณสามารถระบุเวอร์ชัน Mime ประเภทเนื้อหาและชุดอักขระเพื่อส่งอีเมล HTML ได้

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างในการส่งเนื้อหา HTML เป็นอีเมล ลองสักครั้ง -

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

การส่งไฟล์แนบเป็นอีเมล

ในการส่งอีเมลที่มีเนื้อหาผสมต้องตั้งค่า Content-type ส่วนหัวของ multipart/mixed. จากนั้นสามารถระบุส่วนข้อความและไฟล์แนบได้ภายในboundaries.

ขอบเขตเริ่มต้นด้วยยัติภังค์สองตัวตามด้วยหมายเลขเฉพาะซึ่งไม่สามารถปรากฏในส่วนข้อความของอีเมล ขอบเขตสุดท้ายที่แสดงถึงส่วนสุดท้ายของอีเมลจะต้องลงท้ายด้วยยัติภังค์สองตัว

ไฟล์ที่แนบควรเข้ารหัสด้วยนามสกุล pack("m") ฟังก์ชั่นที่จะมีการเข้ารหัส base64 ก่อนส่ง

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างซึ่งจะส่งไฟล์ /tmp/test.txt เป็นไฟล์แนบ

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 - คุณสามารถระบุปลายทางได้หลายแห่งภายในอาร์เรย์ แต่ควรคั่นด้วยลูกน้ำ