## Description When an inbox name or business name contains parentheses — e.g. `Giro Crédito - Soporte (Email` — the resulting From header becomes unparseable by SMTP servers. The `(` is interpreted as an RFC 5322 comment start, swallowing the actual email address and causing a `553 Invalid email address` rejection. Closes [CW-6323](https://linear.app/chatwoot/issue/CW-6323) ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) ## How to reproduce? 1. Set an inbox's name or business name to include a parenthesis, e.g. `Support (Email` 2. Send an outgoing email reply from that inbox 3. Observe `Net::SMTPFatalError: 553 ... Invalid email address` ## Checklist: - [ ] My code follows the style guidelines of this project - [ ] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
53 lines
1.1 KiB
Ruby
53 lines
1.1 KiB
Ruby
class Email::BaseBuilder
|
|
include EmailAddressParseable
|
|
|
|
pattr_initialize [:inbox!]
|
|
|
|
private
|
|
|
|
def channel
|
|
@channel ||= inbox.channel
|
|
end
|
|
|
|
def account
|
|
@account ||= inbox.account
|
|
end
|
|
|
|
def conversation
|
|
@conversation ||= message.conversation
|
|
end
|
|
|
|
def custom_sender_name
|
|
message&.sender&.available_name || I18n.t('conversations.reply.email.header.notifications')
|
|
end
|
|
|
|
def sender_name(sender_email)
|
|
# Friendly: <agent_name> from <business_name>
|
|
# Professional: <business_name>
|
|
if inbox.friendly?
|
|
I18n.t(
|
|
'conversations.reply.email.header.friendly_name',
|
|
sender_name: custom_sender_name,
|
|
business_name: business_name,
|
|
from_email: sender_email
|
|
)
|
|
else
|
|
I18n.t(
|
|
'conversations.reply.email.header.professional_name',
|
|
business_name: business_name,
|
|
from_email: sender_email
|
|
)
|
|
end
|
|
end
|
|
|
|
def business_name
|
|
inbox.sanitized_business_name
|
|
end
|
|
|
|
def account_support_email
|
|
# Parse the email to ensure it's in the correct format, the user
|
|
# can save it in the format "Name <email@domain.com>"
|
|
parse_email(account.support_email)
|
|
end
|
|
end
|