রেলগুলি অ্যাকশনমেলার - ফর্ম্যাট প্রেরক এবং প্রাপকের নাম / ইমেল ঠিকানা


112

অ্যাকশনমেলারটি ব্যবহার করার সময় প্রেরক এবং প্রাপক তথ্যের জন্য ইমেল এবং নাম নির্দিষ্ট করার কোনও উপায় আছে কি?

সাধারণত আপনি করতে চান:

@recipients   = "#{user.email}"
@from         = "info@mycompany.com"
@subject      = "Hi"
@content_type = "text/html"

কিন্তু, আমি well-- যেমন নাম উল্লেখ করতে চাই MyCompany <info@mycompany.com>,John Doe <john.doe@mycompany>

এটা করার কোন উপায় আছে?


: পাগল গাইড কিভাবে করতে হবে এই একটি উদাহরণ রয়েছে guides.rubyonrails.org/... এই প্রশ্নে অন্য উত্তর দেখুন stackoverflow.com/a/8106387/879854
BF4

উত্তর:


237

আপনি যদি নাম এবং ইমেলের জন্য ব্যবহারকারীর ইনপুট নিচ্ছেন, তবে আপনি যদি খুব সাবধানতার সাথে নাম এবং ইমেলটিকে বৈধতা না দিয়ে বাঁচাতে না পারেন তবে আপনি কেবল অবৈধ ফর্ম থেকে শিরোনাম দিয়ে স্ট্রিং দিয়ে শেষ করতে পারেন। এখানে একটি নিরাপদ উপায়:

require 'mail'
address = Mail::Address.new email # ex: "john@example.com"
address.display_name = name.dup   # ex: "John Doe"
# Set the From or Reply-To header to the following:
address.format # returns "John Doe <john@example.com>"

1
তোমাকে অনেক ধন্যবাদ! আমি অনুভব করেছি যে স্ট্রিং কনক্যাট এর চেয়ে ভাল উপায় ছিল, তবে Mail::Addressআমি যে ডকুমেন্টেশন পড়েছি তা ব্যবহার স্পষ্ট নয়।
টিম মরগান

10
address.display_nameকিছু ক্ষেত্রে স্ট্রিং এনকোডিংকে রূপান্তরিত করার জন্য প্রদর্শিত হয়, সুতরাং আপনি যদি nameপরে ব্যবহারের পরিকল্পনা করেন, যেমন রেল মেলর দর্শনগুলিতে, করুনaddress.display_name = name.dup
Eero

7
দেখে মনে হচ্ছে মেল রত্নটি এখন স্ট্রিংটি dুকে পড়েছে, তাই name.dupআর প্রয়োজন মনে হয় না। উত্স লেখা আছে:@display_name = str.nil? ? nil : str.dup
philoye

এটি config.mailer_sender = Proc.new { address = Mail::Address.new... }
ডিভাইস

97
@recipients   = "\"#{user.name}\" <#{user.email}>"
@from         = "\"MyCompany\" <info@mycompany.com>"

2
আমি তাই মনে করি না. এটিতে কোনওর জন্য কোনও ASCII অক্ষর থাকতে পারে না, এটিতে উদ্ধৃতি অক্ষরটি নিজেই ধারণ করতে পারে না এবং এমন কিছু ASCII অক্ষর রয়েছে যা অনুমোদিত নয় / যেমন শিরোনামেও প্রস্তাবিত নয়। আমি দেখতে পেয়েছি যে আরএফসি2047 এই জাতীয় মানগুলিকে বেস 64 এনকোডিংয়ের জন্য একটি ব্যবস্থা সরবরাহ করে।
উইলিয়াম ডেনিস

11
এটি করার একটি উপায়ের জন্য আমার উত্তর দেখুন যা সঠিকভাবে স্ট্রিংগুলি এনকোড করে।
জেমস ম্যাককিনি

8
এটি সহায়ক ছিল! এফওয়াইআই, আপনি যদি এটি পরীক্ষা করে দেখার চেষ্টা করছেন তবে আপনাকে @ ইমেল.হ্যাডার ['থেকে']। টো_স, @ ইমেল.ফর্মের থেকে দেখতে হবে। পরবর্তীটিতে কেবল ইমেল ঠিকানা থাকে না নামটিও।
সিবলন

7
এইভাবে করবেন না। পরিবর্তে @ জেমসএমসিকি্নির উত্তর দেখুন।
ম্যাথু রাতজলফ

5
আবার এটি ব্যবহার করুন না কারণ এটি অনিরাপদ। পরিবর্তে @ জেমসএমসিকি্নির উত্তর দেখুন।
জ্যাক পেট্রোলস

43

রেল 3 এ আমি প্রতিটি পরিবেশে নিম্নলিখিতটি রাখি। ie product.rb

ActionMailer::Base.default :from => "Company Name <no-reply@production-server.ca>"

কোম্পানির নামের চারপাশে উদ্ধৃতিগুলি রইল 3 এ আমার পক্ষে কার্যকর হয়নি।


আপনার :from => "Company Name <no-reply@email.com>"যদি পরিবেশের সীমাবদ্ধতা না থাকে তবে আপনি এটি সরাসরি আপনার মাইলারআরবি ফাইলে রাখতে পারেন ।
পুস

8

রেলগুলির মধ্যে ২.৩.৩ অ্যাকশনমেলারটির মধ্যে একটি বাগ প্রবর্তিত হয়েছিল। আপনি এখানে টিকিট দেখতে পাচ্ছেন # 2340 টিকিট । এটি 2-3-স্থিতিশীল এবং মাস্টারগুলিতে সমাধান হয়েছে সুতরাং এটি 3.x এবং 2.3.6 এ স্থির হবে।

২.৩-এর মধ্যে সমস্যার সমাধানের জন্য। * আপনি টিকিটের মন্তব্যে প্রদত্ত কোডটি ব্যবহার করতে পারেন:

module ActionMailer
  class Base
    def perform_delivery_smtp(mail)
      destinations = mail.destinations
      mail.ready_to_send
      sender = (mail['return-path'] && mail['return-path'].spec) || Array(mail.from).first

      smtp = Net::SMTP.new(smtp_settings[:address], smtp_settings[:port])
      smtp.enable_starttls_auto if smtp_settings[:enable_starttls_auto] && smtp.respond_to?(:enable_starttls_auto)
      smtp.start(smtp_settings[:domain], smtp_settings[:user_name], smtp_settings[:password],
                 smtp_settings[:authentication]) do |smtp|
        smtp.sendmail(mail.encoded, sender, destinations)
      end
    end
  end
end

2
যার কাছে আমার প্রশ্ন আছে, "আমি এই কোডটি কোথায় রাখি?" উত্তরটি হ'ল এটি আপনার [রেল অ্যাপ রুট] / কনফিগারেশন / আরম্ভকারী ডিরেক্টরিতে একটি .rb ফাইল হিসাবে সংরক্ষণ করা।
জেলিকেলকিট

6

আমি এর যে সংস্করণটি ব্যবহার করতে চাই তা হ'ল

%`"#{account.full_name}" <#{account.email}>`

`<< ব্যাকটিক্স।

হালনাগাদ

আপনি এটিতেও পরিবর্তন করতে পারেন

%|"#{account.full_name}" <#{account.email}>|
%\"#{account.full_name}" <#{account.email}>\
%^"#{account.full_name}" <#{account.email}>^
%["#{account.full_name}" <#{account.email}>]

স্ট্রিং আক্ষরিক সম্পর্কে আরও পড়ুন।


1

কমপক্ষে নতুন এআর ফর্ম্যাট সহ আরও একটি জ্বালাময়ী দিকটি মনে রাখতে হবে যে 'ডিফল্ট' শ্রেণীর স্তরে ডাকা হয়েছিল। উল্লেখযোগ্য রুটিনগুলি যা কেবলমাত্র উদাহরণস্বরূপ এটি এটিকে নিঃশব্দে ব্যর্থ করে দেয় এবং আপনি যখন এটি ব্যবহার করার চেষ্টা করেন তখন দেয়:

 NoMethodError: undefined method `new_post' for Notifier:Class

এখানে আমি যা ব্যবহার করে শেষ করেছি:

def self.named_email(name,email) "\"#{name}\" <#{email}>" end
default :from => named_email(user.name, user.email)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.