前提・実現したいこと
当方、プログラミングを始めて3か月の初心者です。
現在、rails 5.2.3でメールの自動送信機能を実装しようとしております。
production環境はheroku&sendgridを利用しています。
rails チュートリアルを参考にメール本文を日本語にして、
下記のようなテストコードを書いたところ、
エンコードに関するエラーが発生しており、困っております。
どのようにテストコードを書き換えるべきか、またはエンコードの設定をすべきか
ご教示のほど、よろしくお願いします。
ruby
1class UserMailerTest < ActionMailer::TestCase 2 3 test "アカウント開設用URLのご案内" do 4 user = users(:michael) 5 user.activation_token = User.new_token 6 mail = UserMailer.account_activation(user) 7 assert_equal "アカウント開設用URLのご案内", mail.subject 8 assert_equal [user.email], mail.to 9 assert_equal ["noreply@yoursite.com"], mail.from 10 assert_equal [ENV['YAHOOMAIL_ADRESS']], mail.bcc 11 assert_match user.email, mail.body.encoded 12 assert_match user.activation_token, mail.body.encoded 13 assert_match CGI.escape(user.email), mail.body.encoded 14 end 15end
発生している問題・エラーメッセージ
Failure: UserMailerTest#test_アカウント開設用URLのご案内 [/home/vagrant/workspace/app/test/mailers/user_mailer_test.rb:13]: Expected /michael@example.com/ to match # encoding: US-ASCII # valid: true "\r\n----==_mimepart_5dc16b84311c1_e422b0a01ce39946426b\r\nContent-Type: text/plain;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\(省略)==\r\n\r\n---- ==_mimepart_5dc16b84311c1_e422b0a01ce39946426b\r\nContent-Type: text/html;\r\n charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\(省略)==\r\n\r\n---- ==_mimepart_5dc16b84311c1_e422b0a01ce39946426b--\r\n". bin/rails test test/mailers/user_mailer_test.rb:5
現在の対応
railsにはdefaultでhtmlとtextの2種類のメール本文がありますが、
htmlは<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
と設定されているようですので、対策として現在は下記のようなコードを書いています。
ruby
1class UserMailerTest < ActionMailer::TestCase 2 3 test "アカウント開設用URLのご案内" do 4 user = users(:michael) 5 user.activation_token = User.new_token 6 mail = UserMailer.account_activation(user) 7 assert_equal "アカウント開設用URLのご案内", mail.subject 8 assert_equal [user.email], mail.to 9 assert_equal ["noreply@yoursite.com"], mail.from 10 assert_equal [ENV['YAHOOMAIL_ADRESS']], mail.bcc 11 assert_match user.email, 12 mail.text_part.body.to_s.encode("UTF-8") 13 assert_match user.email,mail.html_part.body.encoded 14 assert_match user.activation_token, 15 mail.text_part.body.to_s.encode("UTF-8") 16 assert_match user.activation_token,mail.html_part.body.encoded 17 assert_match CGI.escape(user.email), 18 mail.text_part.body.to_s.encode("UTF-8") 19 assert_match CGI.escape(user.email),mail.html_part.body.encoded 20 end 21end
疑問点・補足
①railsの ApplicationMailerはdefaultでcharset=UTF-8と
設定されているようですが、送信時に
UTF-8を一端ASCII文字(7bit文字)のbase64にエンコードして、
再度、受信側でデコードするのでしょうか?
②なぜtext形式のみこのようになっているのでしょうか?
③どのようにテストコードを書き換えるべきでしょうか。
assert_equrlの期待値をbase64に変換する?
なお、gmailやyahooメールで受信したところ、文字化け等はありませんでした。
以上よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/06 08:13 編集
退会済みユーザー
2019/11/06 11:28
退会済みユーザー
2019/11/07 01:39