🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

829閲覧

[Ruby on Rails6.0]メールでのアカウント有効化機能の実装について/漢字でユーザー名を登録すると、データに余計なものが入ってしまう。

gussan-me

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/03/01 00:44

編集2021/03/01 00:47

Railsで掲示板サイトを作成中の者です。
現在、メール内のリンクをクリックすることでアカウントの有効化を完了させるという機能を実装させようとしているのですが、
下記の不具合が発生して困っております。

#困っていること
コンソール上に表示されるメール文に、下記の不具合が発生してしまう。

・ブラウザユーザー登録フォームから、漢字でユーザー名を登録すると、コンソール常に表示されるデータに余計な文字が入ってしまう。
Hi 山田太郎と表示されるはずが、Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E
とコンソール上に表示されてしまう。

・クエリパラメータに余計な文字が入ってしまう。
edit?email=yamada-t-t%40example.comと表示されるはずが、edit?email=3Dyamada-t-t%40example.com
と表示されてしまう。(メールアドレスの先頭に3Dという文字が入る)

#コンソールに表示されているデータ UserMailer#account_activation: processed outbound mail in 7.7ms Delivered mail 603c32d2a24ae_1afd243f6a08265@ip-172-31-16-95.ap-northeast-1.compute.internal.mail (65.1ms) Date: Mon, 01 Mar 2021 00:18:26 +0000 From: noreply@example.com To: yamada-t-t@example.com Message-ID: <603c32d2a24ae_1afd243f6a08265@ip-172-31-16-95.ap-northeast-1.compute.internal.mail> Subject: Account activation Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_603c32d2a02e7_1afd243f6a08139"; charset=UTF-8 Content-Transfer-Encoding: 7bit ----==_mimepart_603c32d2a02e7_1afd243f6a08139 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E,=0D  #←「Hi 山田太郎」と表示させたい。 =0D Welcome to the Sample App! Click on the link below to activate your accou= nt:=0D =0D https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazon= aws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=3Dyamada-t-= t%40example.com=0D =0D ----==_mimepart_603c32d2a02e7_1afd243f6a08139 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <!DOCTYPE html>=0D <html>=0D <head>=0D <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf= -8" />=0D <style>=0D /* Email styles need to be inline */=0D </style>=0D </head>=0D =0D <body>=0D <h1>Sample App</h1>=0D =0D <p>Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E,</p>=0D =0D <p>=0D Welcome to the Sample App! Click on the link below to activate your accou= nt:=0D </p>=0D =0D <a href=3D"https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northea= st-1.amazonaws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=3D= yamada-t-t%40example.com">Activate</a>=0D </body>=0D </html>=0D ----==_mimepart_603c32d2a02e7_1afd243f6a08139-- Redirected to https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/ Completed 302 Found in 731ms (ActiveRecord: 25.6ms | Allocations: 17348)

#関係があると考えているコードは下記です。

#user_mailer/account_activation.html.erb <h1>Sample App</h1> <p>Hi <%= @user.name %>,</p> <p> Welcome to the Sample App! Click on the link below to activate your account: </p> <%= link_to "Activate", edit_account_activation_url(@user.activation_token,email: @user.email) %>
#user_mailer/account_activation.text.erb Hi <%= @user.name %>, Welcome to the Sample App! Click on the link below to activate your account: <%= edit_account_activation_url(@user.activation_token,email: @user.email) %>
#previews/user_mailer_preview.rb # Preview all emails at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer class UserMailerPreview < ActionMailer::Preview # Preview this email at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/rails/mailers/user_mailer/account_activation def account_activation user = User.first user.activation_token = User.new_token UserMailer.account_activation(user) end # Preview this email at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/rails/mailers/user_mailer/password_reset def password_reset UserMailer.password_reset end end
#maillers/user_mailer.rb class UserMailer < ApplicationMailer def account_activation(user) @user = user mail to: user.email, subject: "Account activation" end def password_reset @greeting = "Hi" mail to: "to@example.org" end end
#model/user.rb class User < ApplicationRecord attr_accessor :remember_token, :activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: true has_secure_password validates :password, presence: true, length: { minimum: 6 }, allow_nil: true #渡された文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def User.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end #渡されたトークンがダイジェストと一致したらtrueを返す #ここでのremember_tokenは、attr_accessor :remember_tokenで定義したアクセサとは異なる。 def authenticated?(attribute, token) digest = self.send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end #ユーザーのログイン情報を破棄する def forget update_attribute(:remember_digest, nil) end private # メールアドレスを全て小文字にする def downcase_email self.email = email.downcase end # 有効化トークンとダイジェストを作成および代入する。 def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end

#試したこと
ユーザー名を、アルファベット表示で入力してみました。
その結果、コンソール上には余計なデータは入りませんでした。

また、account_activation.text.erbaccount_activation.html.erbの中に、改行や空白が無いことも確認しましたが、入っておりません。

以上でございます。
ご回答頂けますと幸いです。
恐れ入りますが、ご確認のほどよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Content-Transfer-Encoding: quoted-printable

これは、quoted-printableというエンコーディング方法でエンコードされているということで、
具体的には「ASCII印字可能文字と一部のコントロール文字」以外を=と16進数2文字で表現するということです。=を使うので=自体も=3Dとエンコードされます。
つまり、それで正常です。
メールUAが、Content-Transfer-Encoding: quoted-printableを認識してデコードします。

それより行末の=0Dが気になります。CRはエンコードされないはずですが。

投稿2021/03/01 03:46

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2021/03/01 07:10

正しい quoted-printableでは 改行はエンコードされます。 decodeの時に行末の改行を無視し、=0Dを改行に戻します。 エンコードした時に1行が長くなるのが嫌だ と仕様決定者は考えたのでしょうか、エンコードによりある程度長くなると改行が入るシステムがあります。 outlook(の日本版?)はこれ(行末の改行は無視)をしてくれないので、改行が2つ入って空行が入ってしまうという嫌な実装になってます。
otn

2021/03/01 08:08

ご教示ありがとうございます。 自然な仕様になっていると思っていました。他にも誤解している点があるかも知れないので調べてみます。
winterboum

2021/03/01 08:13 編集

https://tools.ietf.org/html/rfc1521 久しぶりに読んでみました。 思い違いもありました。 quoted-printable := ([*(ptext / SPACE / TAB) ptext] ["="] CRLF) ; Maximum line length of 76 characters excluding CRLF 1行76文字だと宣言してますね。 これは守っていないメールツール多いな。
gussan-me

2021/03/01 12:05 編集

皆様 ご回答いただきまして、ありがとうございます。 ご回答いただいた件、理解することができました。 誠にありがとうございます。 >=を使うので=自体も=3Dとエンコードされます。つまり、それで正常です。 →こちらの「=3D」の件で、質問がございます。 メールコンソール上に表示される下記のコードをブラウザに貼り付けても、 アカウントの有効化ができませんでした。 (改行時に「=」という文字が発生するので、削除して下記に貼り付けています。) https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=3Dyamada-t-t%40example.com そこで、上記のURLの「3D」を消したURLをブラウザに貼り付けてみました。 そうすると、アカウントの有効化が成功しました。 下記のコードになります。 https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=yamada-t-t%40example.com こちらの原因は何なのでしょうか。。 恐れ入りますが、ご確認の程よろしくお願い致します。
otn

2021/03/01 12:15

> メールコンソール上に表示される下記のコードを メールコンソールとは?? 普通のメールソフトの本文表示画面だと、回答に書いたように、quoted-printableを認識してデコードしますので、=3D は = にデコードした上で表示されます。
guest

0

→Hi 山田太郎と表示されるはずが、Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E

とコンソール上に表示されてしまう。

これは、全く問題ありません。メールは歴史的経緯もあって7ビットの範囲内でエンコードして流すことが多いので、山田太郎はUTF-8をQuoted-printableでエンコードした=E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8Eという形になります。

投稿2021/03/01 01:05

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/03/01 01:07

受信したメールソフトの側でデコードが行われて、「山田太郎」として表示されます。
gussan-me

2021/03/01 12:07

maisumakun様 ご回答いただき、誠にありがとうございます。 なるほど。。理解することができました。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問