class ApplicationMailer < ActionMailer::Base default Rails.application.config.action_mailer.default_options layout 'mailer' private def send_mail @template ||= "#{self.class.name.underscore}/#{caller[0][/`([^']*)'/, 1]}" headers['Message-ID'] = message_id if @user.pgp_pubkey.present? mail(to: @user.email, subject: "...", content_type: pgp_content_type) do |format| format.text { render plain: pgp_content } end else mail(to: @user.email, subject: @subject) do |format| format.text { render @template } end end end def from_address self.class.default[:from] end def from_domain Mail::Address.new(from_address).domain end def message_id @message_id ||= "#{SecureRandom.uuid}@#{from_domain}" end def boundary @boundary ||= SecureRandom.hex(8) end def pgp_content_type "multipart/encrypted; protocol=\"application/pgp-encrypted\"; boundary=\"------------#{boundary}\"" end def pgp_nested_content message_content = render_to_string(template: @template) message_content_base64 = Base64.encode64(message_content) nested_boundary = SecureRandom.hex(8) <<~NESTED_CONTENT Content-Type: multipart/mixed; boundary="------------#{nested_boundary}"; protected-headers="v1" Subject: #{@subject} From: <#{from_address}> To: #{@user.display_name || @user.cn} <#{@user.email}> Message-ID: <#{message_id}> --------------#{nested_boundary} Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: base64 #{message_content_base64} --------------#{nested_boundary}-- NESTED_CONTENT end def pgp_content encrypted_content = UserManager::PgpEncrypt.call(user: @user, text: pgp_nested_content) encrypted_base64 = Base64.encode64(encrypted_content.to_s) <<~EMAIL_CONTENT This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156) --------------#{boundary} Content-Type: application/pgp-encrypted Content-Description: PGP/MIME version identification Version: 1 --------------#{boundary} Content-Type: application/octet-stream; name="encrypted.asc" Content-Description: OpenPGP encrypted message Content-Disposition: inline; filename="encrypted.asc" -----BEGIN PGP MESSAGE----- #{encrypted_base64} -----END PGP MESSAGE----- --------------#{boundary}-- EMAIL_CONTENT end end