Catatan Tercecer, Mengirim Email Pakai Gmail di Rails

Posted: December 20, 2007 in ノート, Rails, Technology

Seperti biasa ketika saya membaca Google Reader saya melirik ada bahasan soal mengirim email pakai gmail tapi kok kurang sreg ya.

Semua-semua tentang mengirim email pakai gmail sudah dibahas oleh adit pakai plugin action_mailer_tls. Yang menjadi penekanan saya disini adalah:

  1. Jangan pernah lupakan penggunaan kata depan deliver_ ketika memanggil metode yang kita bikin di class turunan ActionMailer.
  2. Jangan taroh settingan config langsung di file config/environtment.rb tetapi tarohlah di development dan production aja, sementara untuk testing yang diperlukan di spec’ing adalah bagaimana (pikirkan bagaimana) aplikasi seharusnya berjalan (bukan dikirim atau tidak dikirimnya email, karena urusan ini sudah dites oleh plugin sampai ke urusan orang-orang rails-core).
  3. Untuk sintaks dalam metode di class turunan action mailer itu jangan pakai akeong (@) melulu’, tapi pakai aja cara yang diberikan di dokumentasi rails biasa. Contoh:
      def retrieve_password(user, secret_url)
        subject    "Click this RailsApp Link to get your password back"
        recipients user.email
        sent_on    Time.now
        body       :secret_url => secret_url, :user => user
      end
    

    yang mana simbol secret_url dan simbol user itu menjadi @user di file view/nama_class_turunan_action_mailer/retrieve_password.html.erb. Kalau tidak ada yang ingin di pass di view , yang berarti view bersifat statis aja, maka baris kode body beserta pengikutnya itu dihapus aja semua karena memang tidak diperlukan.

  4. Usahakan coding yang bersih, itu peraturan pertama, bila aturan pertama gagal dikarenakan beberapa kendala (seperti memang keterbatasan kemampuan, ataupun karena terlalu dikejar-kejar oleh tikus-tikus berdasi yang tak tau diri) maka tulislah dokumentasi berupa komen di sekitar codes yang dirasa perlu, lebih baik mengotori sedikit daripada nanti malah lupa cara kerja baris anu itu gimana ya. Ini poin yangpertama. Yang sebetulnya berhubungan dengan poin kedua selanjutnya, yaitu usahakan manfaatkan fasilitas callback yang disediakan active record, jadi tidak akan banyak mengotori/membuat controller semakin melorot dengan codes, tapi cukup sudah otomatis ketika melakukan perubahan di database lewat model yang bersangkutan (contoh codes menyusul).
  5. Sebetulnya ini adalah masih di poin sebelumnya, tapi kok saya liat terlalu panjang jadi khawatir buat saya sendiri nanti rada sulit bin ribet dibaca dan diikuti, jadi ketika sebelum coding, seperti biasa, yaitu di spec’ing dulu, jadi di controller spec nya di before(:each) kasih ajalah pokoknya apa yang diminta di mock_model(User, :email => “pokoknya_kasih_aja_deh_emailnya@domain_ngaco_juga_biarin”) dengan tanpa ragu-ragu sedikitpun karena pada awalnya mungkin dirasa sangat aneh atau dirasa bertentangan dengan naluri ingin ngetes semua-semuanya, padahal ini adalah kelebihan spec’ing di ruby, dia bisa misah-misah urusan, jadi urusan spec’ing model ya model aja, gak usah campur-campurin urusan yang lain, trus di controller juga nggak usah sampai urus spec’ing model, jadi makanya dikasih “fake” alias palsunya aja tapi dia bisa jalan untuk menunjukkan bahwa code yang ditulis sesuai dengan requirement spec yang diminta (masih ingat kan latihan spec controller yang sangat gampang diikuti oleh pat maddox yang bahkan sempet bilang kalo spec’ing controller tu sih mainan anak kecil).
  6. Saya pernah mengalami error ini ketika bereksperimen dengan ini , tapi entah kenapa setelah saya benar-benar serius menjalani ajaran agama rspec yang baik walau masih kategori pemula, tau tau error ngimel ini ngilang, trus jadi sukses terus gak dapet-dapet lagi errornya. Beruntung saya sudah simpan error ini ke wiki internal kantor, berikut copy paste nya sebagai kenang-kenangan dan juga bila ada teman-teman yang mendapati error seperti ini dan tahu kenapa mendapat error seperti ini kasih khabar ya.
    Net::SMTPFatalError (555 5.5.2 Syntax error k41sm59742rvb ):
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:680:in `check_response'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:653:in `getok'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:635:in `rcptto'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:546:in `send0'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:545:in `each'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:545:in `send0'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:472:in `sendmail'
       /vendor/rails/actionmailer/lib/action_mailer/base.rb:588:in `perform_delivery_smtp'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:379:in `start'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/net/smtp.rb:316:in `start'
       /vendor/rails/actionmailer/lib/action_mailer/base.rb:586:in `perform_delivery_smtp'
       /vendor/rails/actionmailer/lib/action_mailer/base.rb:469:in `__send__'
       /vendor/rails/actionmailer/lib/action_mailer/base.rb:469:in `deliver!'
       /vendor/rails/actionmailer/lib/action_mailer/base.rb:352:in `method_missing'
       /app/controllers/contact_requests_controller.rb:52:in `update'
       /vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:124:in `each'
       /vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:124:in `send'
       /vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:124:in `method_missing'
       /vendor/rails/activerecord/lib/active_record/associations/has_many_through_association.rb:133:in `method_missing'
       /app/controllers/contact_requests_controller.rb:51:in `update'
       /vendor/rails/actionpack/lib/action_controller/base.rb:1165:in `send'
       /vendor/rails/actionpack/lib/action_controller/base.rb:1165:in `perform_action_without_filters'
       /vendor/rails/actionpack/lib/action_controller/filters.rb:697:in `call_filters'
       /vendor/rails/actionpack/lib/action_controller/filters.rb:689:in `perform_action_without_benchmark'
       /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
       /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/benchmark.rb:293:in `measure'
       /vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
       /vendor/rails/actionpack/lib/action_controller/rescue.rb:199:in `perform_action_without_caching'
       /vendor/rails/actionpack/lib/action_controller/caching.rb:669:in `perform_action'
       /vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache'
       /vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache'
       /vendor/rails/actionpack/lib/action_controller/caching.rb:668:in `perform_action'
       /vendor/rails/actionpack/lib/action_controller/base.rb:522:in `send'
       /vendor/rails/actionpack/lib/action_controller/base.rb:522:in `process_without_filters'
       /vendor/rails/actionpack/lib/action_controller/filters.rb:685:in `process_without_session_management_support'
       /vendor/rails/actionpack/lib/action_controller/session_management.rb:123:in `process'
       /vendor/rails/actionpack/lib/action_controller/base.rb:386:in `process'
       /vendor/rails/actionpack/lib/action_controller/dispatcher.rb:171:in `handle_request'
       /vendor/rails/actionpack/lib/action_controller/dispatcher.rb:115:in `dispatch'
       /vendor/rails/actionpack/lib/action_controller/dispatcher.rb:126:in `dispatch_cgi'
       /vendor/rails/actionpack/lib/action_controller/dispatcher.rb:9:in `dispatch'
       /Library/Ruby/Gems/gems/mongrel-1.1/bin/../lib/mongrel/rails.rb:76:in `process'
       /Library/Ruby/Gems/gems/mongrel-1.1/bin/../lib/mongrel/rails.rb:74:in `synchronize'
       /Library/Ruby/Gems/gems/mongrel-1.1/bin/../lib/mongrel/rails.rb:74:in `process'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:155:in `process_client'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:154:in `each'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:154:in `process_client'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:281:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:281:in `initialize'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:281:in `new'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:281:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:264:in `initialize'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:264:in `new'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel.rb:264:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel/configurator.rb:282:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel/configurator.rb:281:in `each'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel/configurator.rb:281:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/bin/mongrel_rails:126:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/lib/mongrel/command.rb:212:in `run'
       /Library/Ruby/Gems/gems/mongrel-1.1/bin/mongrel_rails:279
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:489:in `load'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:489:in `load'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:342:in `new_constants_in'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:489:in `load'
       /vendor/rails/railties/lib/commands/servers/mongrel.rb:64
       /Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
       /Library/Ruby/Site/1.8/rubygems/custom_require.rb:27:in `require'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:496:in `require'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:342:in `new_constants_in'
       /vendor/rails/activesupport/lib/active_support/dependencies.rb:496:in `require'
       /vendor/rails/railties/lib/commands/server.rb:39
       script/server:3:in `require'
       script/server:3
    
  7. Duh kok lupa sih mo ngomong apaan :( hm… duh bahkan sebelum selesai tulisan ini dipublish aja saya lupa gini apalagi nanti kalo gak ditulis nih… hm… aduh, nanti kalo inget dilanjut lagi deh catetnya di komen aja kalo ga sempet2x nanti pas sibuk.

update.

1. Link

Comments
  1. oh iya, baru ingat, untuk yang pakai domain default dari gmail cukup sertakan sama kayak yang di blog adit itu dan jangan ragu-ragu dengan port yang memang beda kalau kita nyeting nyedot atau ngirim pakai email client seperti apple mail atau thunderbird dll,

    sementara kalau pakai domain sendiri, maka jangan lupa untuk sertakan nama lengkap email beserta domain untuk username nya, kalau sampai lupa, pasti error soalnya

tinggalkan feedback konstruktif atau lebih baik diam

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s