MailAddress is a port of Mail::Address from Perl.
mail is a great gem library. But some email addresses are unparsable with it. In perl, Mail::Address is a very common library to parse email addresses. Mail::Address conviniently can parse even non-RFC-compliant email addresses such as:
# mail gem cannot parse the following addresses
Ello [Do Not Reply] <do-not-reply@ello.co> # [, ] are not permitted according to RFC5322
大阪 太郎<osaka@example.com> # no whitespace just before `<`
But Mail::Address(Perl) has some bad points (below). These are fixed in MailAddress.
- if no ending parenthesis in name part, cannot parse correctly.
- Modifications of name part are too much.
Many people copy and paste email addresses from Excel or the other spreadsheets. In this case, addresses are separated by whitespace(tab or space). To enable to parse this, also ported from a parser part of Google Closure Library.
Installation
Add this line to your application's Gemfile:
gem 'mail_address'
And then execute:
$ bundle
Or install it yourself as:
$ gem install mail_address
Usage
It's almost the same as Mail::Address(Perl).
But in this module, removed comment
property from address class in version v1.0.0. Most people don't realize comment I think.
require 'mail_address'
line = "John 'M' Doe <john@example.com> (this is a comment), 大阪 太郎 <osaka@example.jp>"
addrs = MailAddress.parse(line)
p addrs[0].format # "\"John 'M' Doe (this is a comment)\" <john@example.com>"
p addrs[0].address # "john@example.com"
p addrs[0].name # "John 'M' Doe (this is a comment)"
p addrs[0].phrase # "John 'M' Doe (this is a comment)"
p addrs[0].host # "example.com"
p addrs[0].user # "john"
p addrs[0].original # "John 'M' Doe <john@example.com> (this is a comment)"
p addrs[1].format # "\"大阪 太郎\" <osaka@example.jp>"
p addrs[1].address # "osaka@example.jp"
p addrs[1].name # "大阪 太郎"
p addrs[1].phrase # "大阪 太郎"
p addrs[1].host # "example.jp"
p addrs[1].user # "osaka"
p addrs[1].original # "大阪 太郎 <osaka@example.jp>"
address.name
and address.phrase
are almost same.
address.phrase
keeps outermost double quotes or parentheses.
if you specify single email address, you can use parse_first
.
line = "John Doe <john@example.com>"
addr = MailAddress.parse_first(line)
p addr.address # "john@example.com"
Parse addresses separated with whitespace
require 'mail_address'
line = "John Doe <john@example.com> second@example.com, third@example.com" # separated with space and comma
addrs = MailAddress.parse_simple(line)
Contributing
- Fork it ( https://github.com/[my-github-username]/mail_address/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request