루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer)


## 루비 온 레일즈 액션 메일러를 이용해 메일 기능 구현하기(Creating mail function by using Ruby on Rails ActionMailer)

Ruby on Rails ActionMailer 를 이용해 메일 기능을 구현해보려고합니다. 이 때 준비된 예제가 있으면 좋겠다 싶어 기존 게시글(아래 링크)을 활용해보려고 합니다.

회원가입을 하고나면 회원가입이 되었다고 메일이 오는 경우가 대부분입니다. 이번 예제 또한 회원가입이 정상적으로 완료되면 가입한 이메일 주소로 회원가입 완료에 대한 메일을 보내주는 예제를 해볼까 합니다. 아래 링크를 참고해 쭉 따라하시면 회원가입까지 할 수 있습니다.

### [루비 온 레일즈에서 devise gem 없이 로그인 기능 구현하기 (How to build authentication system without devise gem in Ruby on Rails)](https://ghkdgh2365.blogspot.com/2020/03/devise-gem-how-to-build-authentication.html)

위 링크까지 코딩이 다 되었다는 가정하에, 메일 기능을 구현하겠습니다. 구현 순서는 다음과 같습니다.

1. Action Mailer 와 관련된 파일 등을 구현한다.
2. 보낼 메일 내용을 작성한다.
3. 메일 구현에 필요한 환경설정을 세팅한다.
4. 회원가입을 하고 메일을 받아본다.

그럼 이제 1번부터 시작하겠습니다. 콘솔에 아래와 같이 입력합니다.

```ruby
rails generate mailer UserMailer
```

그럼 아래와 같이 파일들이 생성될 것입니다.

```bash
$ rails generate mailer UserMailer
      create  app/mailers/user_mailer.rb
      invoke  erb
      create    app/views/user_mailer
      invoke  test_unit
      create    test/mailers/user_mailer_test.rb
      create    test/mailers/previews/user_mailer_preview.rb
```

다음 app/mailers/application_mailer.rb 파일에 가서 아래와 같이 입력합니다.

```ruby
class ApplicationMailer < ActionMailer::Base
  default from: 'your_id@email.com'
  layout 'mailer'
end
```

`your_id@email.com` 은 기본적으로 메일이 발송될 때 보낸 사람의 주소가 됩니다.

이제 app/mailers/user_mailer.rb 파일로 가서 아래와 같이 입력합니다. default from 을 사용해 위에서 설정한 보낸 사람의 주소를 변경할 수도 있습니다.

```ruby
class UserMailer < ApplicationMailer
  default from: 'welcome@myworld.com'

  def welcome_email
    @user = params[:user]
    mail(to: @user.email, subject: '회원가입을 축하합니다.')
  end
end
```

UserMailer 라는 클래스에 welcome_email 이라는 메소드를 만들었으니 이 메소드를 사용해보겠습니다. app/controllers/users_controller.rb 파일로 가서 아래와 같이 입력합니다.

```ruby
class UsersController < ApplicationController
  before_action :user_params, only: [:create]

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    
    if @user.save
      UserMailer.with(user: @user).welcome_email.deliver_later
      redirect_to root_path
    else
      redirect_to new_user_path
    end
  end

  private
  def user_params
    params.require(:user).permit(:email, :password, :password_confirmation)
  end
end
```

아래 부분이 추가가 된 것입니다.

```ruby
UserMailer.with(user: @user).welcome_email.deliver_later
      redirect_to root_path
```

이제 새로 가입한 유저의 정보를 @user에 담아서 UserMailer 클래스의 welcome_email 메소드에 전달해주어 welcome_email을 실행하는 것입니다. 이제 그럼 메일 내용을 작성해보겠습니다.

app/views/user_mailer 폴더에 welcome_email.html.erb 파일을 새로 만듭니다. 그 다음 파일에 아래 코드를 입력합니다.

```
<!--DOCTYPE html-->
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <h1>회원가입을 축하합니다 !, <%= @user.email %> 님</h1>
    <p>
      앞으로 많은 이용 부탁드립니다. 감사합니다.
    </p>
  </body>
</html>
```

또 같은 위치에 welcome_email.text.erb 파일도 새로 만들어주고 아래 코드를 입력합니다. html형식으로 메일을 보낼 때는 위의 내용이, text 형식으로 메일을 보낼 때는 아래 내용을 보냅니다. 사실 text 형식의 파일이 필수는 아니지만 권장사항임으로 함께 작성합니다.

```
회원가입을 축하합니다 !, <%= @user.email %> 님
===============================================
앞으로 많은 이용 부탁드립니다. 감사합니다.
```

작성한 메일 내용이 어떻게 보여지는지 확인해볼까요? test/mailers/previews/user_mailer_preview.rb 파일에 가서 아래 코드를 입력합니다.

```ruby
class UserMailerPreview < ActionMailer::Preview
    def welcome_email
        test_user = User.new(email: "amugae@gmail.com")
        
        UserMailer.with(user: test_user).welcome_email
    end
end
```

그 다음 `rails s` 를 콘솔창에 입력하고 웹브라우저에 `localhost:3000/rails/mailers/user_mailer` 주소를 입력하고 들어가면

---

User mailer 

* welcome_email 

---

과 같은 형태의  페이지를 볼 수 있습니다. welcome_email을 클릭합니다. 그러면 html 에서 어떤 식으로 보여지는지, text 에서 어떻게 보여지는지 확인할 수 있습니다.

이제 실제로 이메일이 발송되도록 환경설정을 하겠습니다.

enviroment/development.rb 파일에 가서 아래 내용을 입력해줍니다.

```ruby
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.default_url_options = { :host => 'localhost:3000', protocol: 'http' }
  config.action_mailer.smtp_settings = {
    :address              => "smtp.gmail.com",
    :port                 => 587,
    :user_name            => "구글 이메일",
    :password             => "구글 비밀번호",
    :authentication       => "plain",
    :enable_starttls_auto => true
  }
```

이제 서버를 종료했다가 다시 서버를 키고 localhost:3000 에 들어가 회원가입을 하면 회원가입한 이메일 주소로 회원가입 메일이 도착할 것입니다. 메일을 들어가보면 아래와 같이 메일 내용을 확인해볼 수 있습니다.

<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWngYQtQvKYWbz4hetvAeTajgI8f_TKiZ47Eqc7YrDZtuakC-t-55IbO9ykCOi0prMDdY_EMdzfrjEfUMseKIk4vL3hjbFGuSVSQh7xcz8j7s5XSGpeT4C_Yg_u90xhPf7OkrlRlexgScN/s1600/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA+2020-05-04+%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE+9.26.13.png" imageanchor="1" ><img border="0" data-original-height="380" data-original-width="1130" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWngYQtQvKYWbz4hetvAeTajgI8f_TKiZ47Eqc7YrDZtuakC-t-55IbO9ykCOi0prMDdY_EMdzfrjEfUMseKIk4vL3hjbFGuSVSQh7xcz8j7s5XSGpeT4C_Yg_u90xhPf7OkrlRlexgScN/s1600/%25E1%2584%2589%25E1%2585%25B3%25E1%2584%258F%25E1%2585%25B3%25E1%2584%2585%25E1%2585%25B5%25E1%2586%25AB%25E1%2584%2589%25E1%2585%25A3%25E1%2586%25BA+2020-05-04+%25E1%2584%258B%25E1%2585%25A9%25E1%2584%2592%25E1%2585%25AE+9.26.13.png" /></a>

이상으로 메일 기능 구현에 대한 포스트를 마칩니다.


댓글

이 블로그의 인기 게시물

부트스트랩 사용 시 버튼 오른쪽 정렬하는 방법 (How to use float-right for right align in bootstrap)

맥(Mac)에서 MySql 사용 시 Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 오류가 발생하는 경우 해결 방법

HTML, CSS - footer fixed (foot 하단 고정 시키기)