Ruby 이메일 보내기 - SMATP


SMTP(Simple Mail Transfer Protocol)는 편지의 전송 방법을 제어하는 ​​간단한 메일 전송 프로토콜입니다.

Ruby는 이메일 전송을 위해 Net::SMTP를 제공하고 new 및 start의 두 가지 메소드를 제공합니다.

new 메소드에는 두 개의 매개변수가 있습니다:

  • server name 기본값은 localhost

  • 포트 번호입니다. 기본값은 25

start 메서드에는 다음 매개변수가 있습니다.

  • server - SMTP 서버 IP, 기본값은 localhost

  • port - 포트 번호, 기본값은 25

  • domain - 이메일 발신자 도메인 이름, 기본값은 ENV["HOSTNAME"]

  • account - 사용자 이름, 기본값은 nil

  • password - 사용자 비밀번호, 기본값은 nil

  • authtype - 인증 유형, 기본값은 cram_md5

SMTP 객체 인스턴스화 방법은 다음 매개변수를 사용하여 sendmail을 호출합니다.

  • source - 언제든지 문자열이나 배열 또는 각 반복자 무엇이든 반환됩니다.

  • sender - 이메일 양식 필드에 표시되는 문자열입니다.

  • recipients - 수신자의 주소를 나타내는 문자열 또는 문자열 배열입니다.

이메일을 보내기 위한 간단한 Ruby 스크립트가 아래에 제공됩니다.

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


위의 예에서는 올바른 헤더 형식에 주의하여 기본 이메일 메시지를 설정했습니다. 이메일에는 보낸 사람, 받는 사람, 제목이 필요하며 텍스트 내용과 헤더 정보 사이에 빈 줄이 있어야 합니다.


Net::SMTP를 사용하여 로컬 시스템의 SMTP 서버에 연결하고 send_message 메소드를 사용하여 이메일을 보냅니다. 메소드 매개변수는 보낸 사람의 이메일과 받는 사람의 이메일입니다.

로컬 컴퓨터에서 실행 중인 SMTP 서버가 없는 경우 Net::SMTP를 사용하여 원격 SMTP 서버와 통신할 수 있습니다. 웹메일 서비스(예: Hotmail 또는 Yahoo Mail)를 사용하는 경우 이메일 제공업체에서 보내는 메일 서버의 세부정보를 제공합니다.

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

위 코드는 호스트 mail.your-domain.com 및 포트에 연결됩니다. 25번 메일 서버, 사용자 이름과 비밀번호를 입력해야 하는 경우 코드는 다음과 같습니다.


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

위의 예에서는 지정된 사용자 이름과 비밀번호를 사용하여 호스트 mail.your-를 사용하여 메일 서버에 연결합니다. domain.com 및 포트 번호 25 .


Ruby를 사용하여 HTML 이메일 보내기

Net::SMTP는 HTML 형식으로 이메일 보내기도 지원합니다.

이메일을 보낼 때 HTML 형식으로 이메일을 보내도록 MIME 버전, 문서 유형, 문자 집합을 설정할 수 있습니다.

예제

다음 예는 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

첨부 파일이 포함된 이메일 보내기

혼합 콘텐츠가 포함된 이메일을 보내야 하는 경우 콘텐츠 유형을 multipart/mixed로 설정해야 합니다. 이렇게 하면 이메일에 첨부 파일 내용을 추가할 수 있습니다.

첨부 파일은 전송하기 전에 pack("m") 기능을 사용하여 내용을 base64 형식으로 변환해야 합니다.

Example

다음 예에서는 첨부 파일이 /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

참고: 발신 주소를 여러 개 지정할 수 있지만 쉼표로 구분해야 합니다.