gpt4 book ai didi

ruby - 名称中的拼写错误导致 to 字段中的 SMTP 语法错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:12:29 25 4
gpt4 key购买 nike

我们有一个可以向人们发送电子邮件的 Rails 应用程序。我们正在使用邮件 gem (v2.7.1)

有些用户拼错了他们的名字,而不是他们的电子邮件地址,这导致我们在尝试发送电子邮件时出现语法错误。

这里有一些示例,一个工作正常,两个不同的失败示例 - 名称已更改,但拼写错误保持不变

工作:

to = "\"Joe Bloggs\" <joe.bloggs@example.com>"
m = Mail.new
m.to = to
#<Mail::Message:92412660, Multipart: false, Headers: <To: "Joe Bloggs" <joe.bloggs@example.com>>>

失败一:

to = "\"Joe B\"log-gs\" <joe.bloggs@example.com>"
m = Mail.new
m.to = to
#<Mail::Message:92412660, Multipart: false, Headers: <To: "Joe B"log-gs" <joe.bloggs@example.com>>>

故障2:

to = "\"JOE BLOGGS\\\" <joe.bloggs@example.com>"
m = Mail.new
m.to = to
#<Mail::Message:92412660, Multipart: false, Headers: <To: "JOE BLOGGS\" <joe.bloggs@example.com>>>

当我们尝试发送失败时,我们得到错误:

Net::SMTPSyntaxError: 501 Syntax error in parameters
/app/vendor/ruby-2.4.4/lib/ruby/2.4.0/net/smtp.rb:969 in check_response
/app/vendor/ruby-2.4.4/lib/ruby/2.4.0/net/smtp.rb:937 in getok
/app/vendor/ruby-2.4.4/lib/ruby/2.4.0/net/smtp.rb:837 in mailfrom
/app/vendor/ruby-2.4.4/lib/ruby/2.4.0/net/smtp.rb:658 in send_message
/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp_connection.rb:54 in deliver!
/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb:101 in block in deliver!
/app/vendor/ruby-2.4.4/lib/ruby/2.4.0/net/smtp.rb:519 in start
/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb:109 in start_smtp_session
/gems/mail-2.7.1/lib/mail/network/delivery_methods/smtp.rb:100 in deliver!
/gems/mail-2.7.1/lib/mail/message.rb:276 in deliver!

我试图找出 to 中允许的字符是什么,但一直找不到。

我想知道我们是否可以做一些事情来转义字符,我尝试了 CGI.escape 但它似乎没有我想要的效果

"%22JOE+BLOGGS%5C%22+%3Cjoe.bloggs%40example.com%3E"
#<Mail::Message:92412660, Multipart: false, Headers: <To: %22JOE+BLOGGS%5C%22+%3Cjoe.bloggs%40example.com%3E>>

最佳答案

电子邮件地址“收件人”标准由 IETF 在 RFC 822 中定义它创作于 1982 年 (!!),通读起来有点吃力。这里有一些 condensed details explaining the email address format更清楚一点。

我的建议是创建您自己的“电子邮件地址格式化程序”辅助方法,以去除客户输入的任何非法字符。关于在 Ruby 中格式化电子邮件地址本身(没有名字)的最佳正则表达式有很多意见 - 一个测试想法的好地方是 Rubular.com .

对于您的应用程序,开始的地方可能类似于:

def format_email(str)
email = str.match(/<(.*?)>/)[0]
name = str.remove(email).gsub(/[^a-z0-9\s]/i, '').strip

"#{name} #{email}"
end

此方法首先拉取 email通过捕获两个尖括号之间的任何东西来脱离字符串 <..> .然后找到 name通过从字符串中删除匹配的电子邮件,然后删除任何非字母数字字符,最后删除末尾留下的任何空格。

使用您提供的示例,此方法将生成:

format_email "\"Joe Bloggs\" <joe.bloggs@example.com>"
=> "Joe Bloggs <joe.bloggs@example.com>"

format_email "\"Joe B\"log-gs\" <joe.bloggs@example.com>"
=> "Joe Bloggs <joe.bloggs@example.com>"

format_email "\"JOE BLOGGS\\\" <joe.bloggs@example.com>"
=> "JOE BLOGGS <joe.bloggs@example.com>"

您可能希望通过实际检查电子邮件地址本身的格式来使这个小方法更加冗长,确保我们没有从名称中删除任何重要内容等。这只是一个快速简单的示例让富有创意的电子邮件格式源源不断地流淌:-)

关于ruby - 名称中的拼写错误导致 to 字段中的 SMTP 语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58660640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com