Rubyでyahooメール送信 その2


やっと動くようになりました。前回のだとなぜか接続に失敗するケースが多かった問題や、テストメールを送信していた先のgmailが迷惑メールと判別してくれた事などの為、一日もかかってしまいました。

送信が時々失敗する現象について
ISPのほうのOutbound Port 25 Blockingにより接続に失敗していたみたいです。これについてSMTPのポートを25→587とし、SMTP-AUTHを実施する事で対応できました。

結果
ruby sendmail.rbを実行するとメールが送信されます。
sendmail.rb
#!/usr/bin/ruby

require ‘mail_util’

print “## メール送信中\n”
# メール送信用データ作成
mail                = Mail_Util.new
mail.user           = “account_user_name”
mail.password       = “account_user_password”
mail.pop_server     = “pop.mail.yahoo.co.jp”
mail.smtp_server    = “smtp.mail.yahoo.co.jp”
mail.smtp_port      = 587
mail.host           = “ihp.mydns.jp”
mail.authtype       = “plain”
mail.pop_before_smtp= true
mail.from           = “
from@yahoo.co.jp“, “管理者@ihp-server”
mail.to             = “
to@mail.com
mail.to_name        = “to name word”
mail.subject        = “件名”
mail.body           = <<EndOfBody
テストメールです。
メールの本文みたいです。
EndOfBody
mail.send
print “## メール送信完了\n”

 

mail_util.rb
require ‘net/smtp’
require ‘net/pop’

class Mail_Util
# 動作定義
@@user              = “”                                                      # メールアカウント ユーザー名
@@password          = “”                                                      # メールアカウント パスワード
@@pop_server        = “localhost”                                             # POPサーバー
@@smtp_server       = “localhost”                                             # SMTPサーバー
@@apop              = false                                                   # use APOP authentication
@@pop_port          = 110                                                     # POPポート
@@smtp_port         = 25                                                      # SMTPポート
@@pop_before_smtp   = false                                                   # PopBeforeSmtp有無
@@host              = “localhost.localdomain”                                 # Message-Idにて使用するホスト名
@@open_timeout      = 30                                                      # 接続待ちタイムアウト
@@read_timeout      = 60                                                      # 読み込み待ちタイムアウト
@@authtype          = nil                                                     # SMTP認証モード[plain login cram_md5] or nil
@@from              = [“”, “”]                                                # 送信元
@@to                = [“”]                                                    # 送信先
@@to_name           = [“”]                                                    # 送信元名称
@@subject           = “”                                                      # 件名
@@body              = “”                                                      # メール本文
# メールアカウント ユーザー名
def user
return @@user
end
def user=(val)
@@user = val
end
# メールアカウント パスワード
def password
return @@password
end
def password=(val)
@@password = val
end
# POPサーバー
def pop_server
return @@pop_server
end
def pop_server=(val)
@@pop_server = val
end
# SMTPサーバー
def smtp_server
return @@smtp_server
end
def smtp_server=(val)
@@smtp_server = val
end
# use APOP authentication
def apop
return @@apop
end
def apop=(val)
@@apop = val
end
# POPポート
def pop_port
return @@pop_port
end
def pop_port=(val)
@@pop_port = val
end
# SMTPポート
def smtp_port
return @@smtp_port
end
def smtp_port=(val)
@@smtp_port = val
end
# PopBeforeSmtp有無
def pop_before_smtp
return @@pop_before_smtp
end
def pop_before_smtp=(val)
@@pop_before_smtp = val
end
# Message-Idにて使用するホスト名
def host
return @@host
end
def host=(val)
@@host = val
end
# SMTP認証モード
def authtype
return @@authtype.to_s
end
def authtype=(val)
@@authtype = val.intern
end
# 接続待ちタイムアウト
def open_timeout
return @@open_timeout
end
def open_timeout=(val)
@@open_timeout = val
end
# 読み込み待ちタイムアウト
def read_timeout
return @@read_timeout
end
def read_timeout=(val)
@@read_timeout = val
end
# 送信元
def from
return @@from
end
def from=(*args)
@@from = Array.new(args[0].to_a) if args[0].size > 0
end
# 送信先
def to
return @@to
end
def to=(*args)
@@to = Array.new if args[0].size > 0
args[0].each do |t|
@@to << t
end
end
# 送信先名称
def to_name
return @@to_name
end
def to_name=(*args)
@@to_name = Array.new if args[0].size > 0
args[0].each do |t|
@@to_name << t
end
end
# 件名
def subject
return @@subject
end
def subject=(val)
@@subject = val
end
# メール本文
def body
return @@body
end
def body=(val)
@@body = val
end
# メール送信
def send
require ‘kconv’

# from 変換
from    = “
=?ISO-2022-JP?B?#{@@from[1].kconv(Kconv::JIS, Kconv::UTF8).to_a.pack(‘m’).chomp}?= <#{@@from[0]}>”
# to 変換 フォーマット:[“ip”, “name”], [“ip”, “name”]
to      = “”
i       = 0
@@to.each do |t|
to   += “
=?ISO-2022-JP?B?#{@@to_name[i].kconv(Kconv::JIS, Kconv::UTF8).to_a.pack(‘m’).chomp}?= <#{t}>,”
i    += 1
end
to.chop!
# 件名 変換
subject = “
=?ISO-2022-JP?B?#{@@subject.kconv(Kconv::JIS, Kconv::UTF8).to_a.pack(‘m’).chomp}?=”
# body 変換
body    = @@body.kconv(Kconv::JIS, Kconv::UTF8)
# ヘッダ作成
head     = “From: #{from}\n”
head    += “To: #{to}\n”
head    += “Subject: #{subject}\n”
head    += “Date: #{Time.now}\n”
head    += “Message-Id: <#{Time.now.strftime(“%Y%m%d%H%M”)}.#{rand(10000)}@#{@@host}>\n”
head    += “MIME-Version: 1.0\n”
head    += “Content-Transfer-Encoding: 7bit\n”
head    += “Content-Type: text/plain; charset=iso-2022-jp\n”
# メール作成
mail    = head + “\n” + body
# POP before SMTP
if @@pop_before_smtp
pop = Net::POP3.APOP(@@apop).new @@pop_server, @@pop_port
pop.open_timeout = @@open_timeout
pop.read_timeout = @@read_timeout
pop.start @@user, @@password
pop.finish
end
# メール送信
smtp = Net::SMTP.new @@smtp_server, @@smtp_port
smtp.open_timeout = @@open_timeout
smtp.read_timeout = @@read_timeout
if @@authtype
smtp.start @@host, @@user, @@password, @@authtype
else
smtp.start @@host
end
smtp.send_mail mail, @@from[0], @@to
smtp.finish
end
end

 

ただクラスインスタンスの値代入&参照のみのメソッド達はもうちょっとスマートにならないものかと・・・
どっかのpluginでそんな感じのに便利なのがあったような気もする。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。