rack-mail_exception 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.rdoc +38 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/lib/rack/mail_exception.rb +103 -0
- data/test/helper.rb +13 -0
- data/test/test_rack_mail_exception.rb +93 -0
- data/vendor/mail/.bundle/config +2 -0
- data/vendor/mail/CHANGELOG.rdoc +370 -0
- data/vendor/mail/Dependencies.txt +3 -0
- data/vendor/mail/Gemfile +17 -0
- data/vendor/mail/README.rdoc +572 -0
- data/vendor/mail/ROADMAP +92 -0
- data/vendor/mail/Rakefile +41 -0
- data/vendor/mail/TODO.rdoc +9 -0
- data/vendor/mail/lib/mail.rb +76 -0
- data/vendor/mail/lib/mail/attachments_list.rb +99 -0
- data/vendor/mail/lib/mail/body.rb +287 -0
- data/vendor/mail/lib/mail/configuration.rb +67 -0
- data/vendor/mail/lib/mail/core_extensions/blank.rb +26 -0
- data/vendor/mail/lib/mail/core_extensions/nil.rb +11 -0
- data/vendor/mail/lib/mail/core_extensions/string.rb +27 -0
- data/vendor/mail/lib/mail/elements.rb +14 -0
- data/vendor/mail/lib/mail/elements/address.rb +306 -0
- data/vendor/mail/lib/mail/elements/address_list.rb +74 -0
- data/vendor/mail/lib/mail/elements/content_disposition_element.rb +30 -0
- data/vendor/mail/lib/mail/elements/content_location_element.rb +25 -0
- data/vendor/mail/lib/mail/elements/content_transfer_encoding_element.rb +24 -0
- data/vendor/mail/lib/mail/elements/content_type_element.rb +35 -0
- data/vendor/mail/lib/mail/elements/date_time_element.rb +26 -0
- data/vendor/mail/lib/mail/elements/envelope_from_element.rb +34 -0
- data/vendor/mail/lib/mail/elements/message_ids_element.rb +29 -0
- data/vendor/mail/lib/mail/elements/mime_version_element.rb +26 -0
- data/vendor/mail/lib/mail/elements/phrase_list.rb +21 -0
- data/vendor/mail/lib/mail/elements/received_element.rb +30 -0
- data/vendor/mail/lib/mail/encodings.rb +258 -0
- data/vendor/mail/lib/mail/encodings/7bit.rb +31 -0
- data/vendor/mail/lib/mail/encodings/8bit.rb +31 -0
- data/vendor/mail/lib/mail/encodings/base64.rb +33 -0
- data/vendor/mail/lib/mail/encodings/binary.rb +31 -0
- data/vendor/mail/lib/mail/encodings/quoted_printable.rb +38 -0
- data/vendor/mail/lib/mail/encodings/transfer_encoding.rb +58 -0
- data/vendor/mail/lib/mail/envelope.rb +35 -0
- data/vendor/mail/lib/mail/field.rb +223 -0
- data/vendor/mail/lib/mail/field_list.rb +33 -0
- data/vendor/mail/lib/mail/fields.rb +35 -0
- data/vendor/mail/lib/mail/fields/bcc_field.rb +56 -0
- data/vendor/mail/lib/mail/fields/cc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/comments_field.rb +41 -0
- data/vendor/mail/lib/mail/fields/common/address_container.rb +16 -0
- data/vendor/mail/lib/mail/fields/common/common_address.rb +125 -0
- data/vendor/mail/lib/mail/fields/common/common_date.rb +42 -0
- data/vendor/mail/lib/mail/fields/common/common_field.rb +50 -0
- data/vendor/mail/lib/mail/fields/common/common_message_id.rb +43 -0
- data/vendor/mail/lib/mail/fields/common/parameter_hash.rb +52 -0
- data/vendor/mail/lib/mail/fields/content_description_field.rb +19 -0
- data/vendor/mail/lib/mail/fields/content_disposition_field.rb +69 -0
- data/vendor/mail/lib/mail/fields/content_id_field.rb +63 -0
- data/vendor/mail/lib/mail/fields/content_location_field.rb +42 -0
- data/vendor/mail/lib/mail/fields/content_transfer_encoding_field.rb +50 -0
- data/vendor/mail/lib/mail/fields/content_type_field.rb +185 -0
- data/vendor/mail/lib/mail/fields/date_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/from_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/in_reply_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/keywords_field.rb +44 -0
- data/vendor/mail/lib/mail/fields/message_id_field.rb +83 -0
- data/vendor/mail/lib/mail/fields/mime_version_field.rb +53 -0
- data/vendor/mail/lib/mail/fields/optional_field.rb +13 -0
- data/vendor/mail/lib/mail/fields/received_field.rb +67 -0
- data/vendor/mail/lib/mail/fields/references_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/reply_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_bcc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_cc_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_date_field.rb +35 -0
- data/vendor/mail/lib/mail/fields/resent_from_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/resent_message_id_field.rb +34 -0
- data/vendor/mail/lib/mail/fields/resent_sender_field.rb +62 -0
- data/vendor/mail/lib/mail/fields/resent_to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/return_path_field.rb +64 -0
- data/vendor/mail/lib/mail/fields/sender_field.rb +67 -0
- data/vendor/mail/lib/mail/fields/structured_field.rb +51 -0
- data/vendor/mail/lib/mail/fields/subject_field.rb +16 -0
- data/vendor/mail/lib/mail/fields/to_field.rb +55 -0
- data/vendor/mail/lib/mail/fields/unstructured_field.rb +166 -0
- data/vendor/mail/lib/mail/header.rb +262 -0
- data/vendor/mail/lib/mail/mail.rb +234 -0
- data/vendor/mail/lib/mail/message.rb +1867 -0
- data/vendor/mail/lib/mail/network.rb +9 -0
- data/vendor/mail/lib/mail/network/delivery_methods/file_delivery.rb +40 -0
- data/vendor/mail/lib/mail/network/delivery_methods/sendmail.rb +62 -0
- data/vendor/mail/lib/mail/network/delivery_methods/smtp.rb +110 -0
- data/vendor/mail/lib/mail/network/delivery_methods/test_mailer.rb +40 -0
- data/vendor/mail/lib/mail/network/retriever_methods/imap.rb +18 -0
- data/vendor/mail/lib/mail/network/retriever_methods/pop3.rb +149 -0
- data/vendor/mail/lib/mail/parsers/address_lists.rb +64 -0
- data/vendor/mail/lib/mail/parsers/address_lists.treetop +19 -0
- data/vendor/mail/lib/mail/parsers/content_disposition.rb +387 -0
- data/vendor/mail/lib/mail/parsers/content_disposition.treetop +46 -0
- data/vendor/mail/lib/mail/parsers/content_location.rb +139 -0
- data/vendor/mail/lib/mail/parsers/content_location.treetop +20 -0
- data/vendor/mail/lib/mail/parsers/content_transfer_encoding.rb +162 -0
- data/vendor/mail/lib/mail/parsers/content_transfer_encoding.treetop +20 -0
- data/vendor/mail/lib/mail/parsers/content_type.rb +539 -0
- data/vendor/mail/lib/mail/parsers/content_type.treetop +58 -0
- data/vendor/mail/lib/mail/parsers/date_time.rb +114 -0
- data/vendor/mail/lib/mail/parsers/date_time.treetop +11 -0
- data/vendor/mail/lib/mail/parsers/envelope_from.rb +194 -0
- data/vendor/mail/lib/mail/parsers/envelope_from.treetop +32 -0
- data/vendor/mail/lib/mail/parsers/message_ids.rb +45 -0
- data/vendor/mail/lib/mail/parsers/message_ids.treetop +15 -0
- data/vendor/mail/lib/mail/parsers/mime_version.rb +144 -0
- data/vendor/mail/lib/mail/parsers/mime_version.treetop +19 -0
- data/vendor/mail/lib/mail/parsers/phrase_lists.rb +45 -0
- data/vendor/mail/lib/mail/parsers/phrase_lists.treetop +15 -0
- data/vendor/mail/lib/mail/parsers/received.rb +71 -0
- data/vendor/mail/lib/mail/parsers/received.treetop +11 -0
- data/vendor/mail/lib/mail/parsers/rfc2045.rb +464 -0
- data/vendor/mail/lib/mail/parsers/rfc2045.treetop +36 -0
- data/vendor/mail/lib/mail/parsers/rfc2822.rb +5318 -0
- data/vendor/mail/lib/mail/parsers/rfc2822.treetop +410 -0
- data/vendor/mail/lib/mail/parsers/rfc2822_obsolete.rb +3757 -0
- data/vendor/mail/lib/mail/parsers/rfc2822_obsolete.treetop +241 -0
- data/vendor/mail/lib/mail/part.rb +102 -0
- data/vendor/mail/lib/mail/parts_list.rb +34 -0
- data/vendor/mail/lib/mail/patterns.rb +30 -0
- data/vendor/mail/lib/mail/utilities.rb +181 -0
- data/vendor/mail/lib/mail/version.rb +10 -0
- data/vendor/mail/lib/mail/version_specific/ruby_1_8.rb +97 -0
- data/vendor/mail/lib/mail/version_specific/ruby_1_9.rb +87 -0
- data/vendor/mail/lib/tasks/corpus.rake +125 -0
- data/vendor/mail/lib/tasks/treetop.rake +10 -0
- data/vendor/mail/mail.gemspec +20 -0
- data/vendor/mail/reference/US ASCII Table.txt +130 -0
- data/vendor/mail/reference/rfc1035 Domain Implementation and Specification.txt +3083 -0
- data/vendor/mail/reference/rfc1049 Content-Type Header Field for Internet Messages.txt +451 -0
- data/vendor/mail/reference/rfc1344 Implications of MIME for Internet Mail Gateways.txt +586 -0
- data/vendor/mail/reference/rfc1345 Character Mnemonics & Character Sets.txt +5761 -0
- data/vendor/mail/reference/rfc1524 A User Agent Configuration Mechanism For Multimedia Mail Format Information.txt +675 -0
- data/vendor/mail/reference/rfc1652 SMTP Service Extension for 8bit-MIMEtransport.txt +339 -0
- data/vendor/mail/reference/rfc1892 Multipart Report .txt +227 -0
- data/vendor/mail/reference/rfc1893 Mail System Status Codes.txt +843 -0
- data/vendor/mail/reference/rfc2045 Multipurpose Internet Mail Extensions (1).txt +1739 -0
- data/vendor/mail/reference/rfc2046 Multipurpose Internet Mail Extensions (2).txt +2467 -0
- data/vendor/mail/reference/rfc2047 Multipurpose Internet Mail Extensions (3).txt +843 -0
- data/vendor/mail/reference/rfc2048 Multipurpose Internet Mail Extensions (4).txt +1180 -0
- data/vendor/mail/reference/rfc2049 Multipurpose Internet Mail Extensions (5).txt +1347 -0
- data/vendor/mail/reference/rfc2111 Content-ID and Message-ID URLs.txt +283 -0
- data/vendor/mail/reference/rfc2183 Content-Disposition Header Field.txt +675 -0
- data/vendor/mail/reference/rfc2231 MIME Parameter Value and Encoded Word Extensions.txt +563 -0
- data/vendor/mail/reference/rfc2387 MIME Multipart-Related Content-type.txt +563 -0
- data/vendor/mail/reference/rfc2821 Simple Mail Transfer Protocol.txt +3711 -0
- data/vendor/mail/reference/rfc2822 Internet Message Format.txt +2859 -0
- data/vendor/mail/reference/rfc3462 Reporting of Mail System Administrative Messages.txt +396 -0
- data/vendor/mail/reference/rfc3696 Checking and Transformation of Names.txt +898 -0
- data/vendor/mail/reference/rfc4155 The application-mbox Media Type.txt +502 -0
- data/vendor/mail/reference/rfc4234 Augmented BNF for Syntax Specifications: ABNF.txt +899 -0
- data/vendor/mail/reference/rfc822 Standard for the Format of ARPA Internet Text Messages.txt +2900 -0
- data/vendor/mail/spec/environment.rb +15 -0
- data/vendor/mail/spec/features/making_a_new_message.feature +14 -0
- data/vendor/mail/spec/features/steps/env.rb +6 -0
- data/vendor/mail/spec/features/steps/making_a_new_message_steps.rb +11 -0
- data/vendor/mail/spec/fixtures/attachments/basic_email.eml +31 -0
- data/vendor/mail/spec/fixtures/attachments/test.gif +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.jpg +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.pdf +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.png +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.tiff +0 -0
- data/vendor/mail/spec/fixtures/attachments/test.zip +0 -0
- data/vendor/mail/spec/fixtures/attachments//343/201/246/343/201/231/343/201/250.txt +2 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_content_disposition.eml +29 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_content_location.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_message_rfc822.eml +92 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_only_email.eml +17 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_pdf.eml +70 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_with_encoded_name.eml +47 -0
- data/vendor/mail/spec/fixtures/emails/attachment_emails/attachment_with_quoted_filename.eml +60 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/cant_parse_from.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_7-bit.eml +231 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_empty.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_plain.eml +148 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_qp_with_space.eml +53 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_spam.eml +44 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_text-html.eml +50 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_with_8bits.eml +770 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_with_semi_colon.eml +269 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/content_transfer_encoding_x_uuencode.eml +79 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/empty_group_lists.eml +162 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/header_fields_with_empty_values.eml +33 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/missing_body.eml +16 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/missing_content_disposition.eml +43 -0
- data/vendor/mail/spec/fixtures/emails/error_emails/multiple_content_types.eml +25 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email11.eml +34 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email12.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email2.eml +114 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email4.eml +59 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email7.eml +66 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_encoded_stack_level_too_deep.eml +53 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_illegal_boundary.eml +58 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_mimepart_without_content_type.eml +94 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_multipart_mixed_quoted_boundary.eml +50 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_nested_attachment.eml +100 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/raw_email_with_quoted_illegal_boundary.eml +58 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/sig_only_email.eml +29 -0
- data/vendor/mail/spec/fixtures/emails/mime_emails/two_from_in_message.eml +42 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese_attachment.eml +27 -0
- data/vendor/mail/spec/fixtures/emails/multi_charset/japanese_attachment_long_name.eml +44 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/multi_address_bounce1.eml +179 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/multi_address_bounce2.eml +179 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/report_422.eml +98 -0
- data/vendor/mail/spec/fixtures/emails/multipart_report_emails/report_530.eml +97 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/basic_email.eml +31 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email10.eml +20 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email5.eml +19 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email6.eml +20 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email8.eml +47 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_bad_time.eml +62 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_double_at_in_header.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_incorrect_header.eml +28 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_multiple_from.eml +30 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_quoted_with_0d0a.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_reply.eml +32 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_simple.eml +11 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_string_in_date_field.eml +17 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_trailing_dot.eml +21 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_with_bad_date.eml +48 -0
- data/vendor/mail/spec/fixtures/emails/plain_emails/raw_email_with_partially_quoted_subject.eml +14 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example01.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example02.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example03.eml +7 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example04.eml +7 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example05.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example06.eml +10 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example07.eml +9 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example08.eml +12 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example09.eml +15 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example10.eml +15 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example11.eml +6 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example12.eml +8 -0
- data/vendor/mail/spec/fixtures/emails/rfc2822/example13.eml +10 -0
- data/vendor/mail/spec/fixtures/emails/sample_output_multipart +0 -0
- data/vendor/mail/spec/mail/attachments_list_spec.rb +214 -0
- data/vendor/mail/spec/mail/body_spec.rb +385 -0
- data/vendor/mail/spec/mail/configuration_spec.rb +19 -0
- data/vendor/mail/spec/mail/core_extensions/string_spec.rb +62 -0
- data/vendor/mail/spec/mail/core_extensions_spec.rb +99 -0
- data/vendor/mail/spec/mail/elements/address_list_spec.rb +109 -0
- data/vendor/mail/spec/mail/elements/address_spec.rb +609 -0
- data/vendor/mail/spec/mail/elements/date_time_element_spec.rb +20 -0
- data/vendor/mail/spec/mail/elements/envelope_from_element_spec.rb +31 -0
- data/vendor/mail/spec/mail/elements/message_ids_element_spec.rb +43 -0
- data/vendor/mail/spec/mail/elements/phrase_list_spec.rb +22 -0
- data/vendor/mail/spec/mail/elements/received_element_spec.rb +34 -0
- data/vendor/mail/spec/mail/encoding_spec.rb +189 -0
- data/vendor/mail/spec/mail/encodings/base64_spec.rb +25 -0
- data/vendor/mail/spec/mail/encodings/quoted_printable_spec.rb +25 -0
- data/vendor/mail/spec/mail/encodings_spec.rb +664 -0
- data/vendor/mail/spec/mail/example_emails_spec.rb +303 -0
- data/vendor/mail/spec/mail/field_list_spec.rb +33 -0
- data/vendor/mail/spec/mail/field_spec.rb +198 -0
- data/vendor/mail/spec/mail/fields/bcc_field_spec.rb +89 -0
- data/vendor/mail/spec/mail/fields/cc_field_spec.rb +79 -0
- data/vendor/mail/spec/mail/fields/comments_field_spec.rb +25 -0
- data/vendor/mail/spec/mail/fields/common/address_container_spec.rb +18 -0
- data/vendor/mail/spec/mail/fields/common/common_address_spec.rb +132 -0
- data/vendor/mail/spec/mail/fields/common/common_date_spec.rb +25 -0
- data/vendor/mail/spec/mail/fields/common/common_field_spec.rb +69 -0
- data/vendor/mail/spec/mail/fields/common/common_message_id_spec.rb +30 -0
- data/vendor/mail/spec/mail/fields/common/parameter_hash_spec.rb +56 -0
- data/vendor/mail/spec/mail/fields/content_description_field_spec.rb +39 -0
- data/vendor/mail/spec/mail/fields/content_disposition_field_spec.rb +55 -0
- data/vendor/mail/spec/mail/fields/content_id_field_spec.rb +117 -0
- data/vendor/mail/spec/mail/fields/content_location_field_spec.rb +46 -0
- data/vendor/mail/spec/mail/fields/content_transfer_encoding_field_spec.rb +113 -0
- data/vendor/mail/spec/mail/fields/content_type_field_spec.rb +678 -0
- data/vendor/mail/spec/mail/fields/date_field_spec.rb +73 -0
- data/vendor/mail/spec/mail/fields/envelope_spec.rb +48 -0
- data/vendor/mail/spec/mail/fields/from_field_spec.rb +89 -0
- data/vendor/mail/spec/mail/fields/in_reply_to_field_spec.rb +62 -0
- data/vendor/mail/spec/mail/fields/keywords_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/message_id_field_spec.rb +147 -0
- data/vendor/mail/spec/mail/fields/mime_version_field_spec.rb +166 -0
- data/vendor/mail/spec/mail/fields/received_field_spec.rb +44 -0
- data/vendor/mail/spec/mail/fields/references_field_spec.rb +35 -0
- data/vendor/mail/spec/mail/fields/reply_to_field_spec.rb +67 -0
- data/vendor/mail/spec/mail/fields/resent_bcc_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_cc_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_date_field_spec.rb +39 -0
- data/vendor/mail/spec/mail/fields/resent_from_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/resent_message_id_field_spec.rb +24 -0
- data/vendor/mail/spec/mail/fields/resent_sender_field_spec.rb +58 -0
- data/vendor/mail/spec/mail/fields/resent_to_field_spec.rb +66 -0
- data/vendor/mail/spec/mail/fields/return_path_field_spec.rb +52 -0
- data/vendor/mail/spec/mail/fields/sender_field_spec.rb +58 -0
- data/vendor/mail/spec/mail/fields/structured_field_spec.rb +72 -0
- data/vendor/mail/spec/mail/fields/to_field_spec.rb +92 -0
- data/vendor/mail/spec/mail/fields/unstructured_field_spec.rb +134 -0
- data/vendor/mail/spec/mail/header_spec.rb +578 -0
- data/vendor/mail/spec/mail/mail_spec.rb +34 -0
- data/vendor/mail/spec/mail/message_spec.rb +1409 -0
- data/vendor/mail/spec/mail/mime_messages_spec.rb +435 -0
- data/vendor/mail/spec/mail/multipart_report_spec.rb +112 -0
- data/vendor/mail/spec/mail/network/delivery_methods/file_delivery_spec.rb +79 -0
- data/vendor/mail/spec/mail/network/delivery_methods/sendmail_spec.rb +125 -0
- data/vendor/mail/spec/mail/network/delivery_methods/smtp_spec.rb +133 -0
- data/vendor/mail/spec/mail/network/delivery_methods/test_mailer_spec.rb +57 -0
- data/vendor/mail/spec/mail/network/retriever_methods/pop3_spec.rb +180 -0
- data/vendor/mail/spec/mail/network_spec.rb +359 -0
- data/vendor/mail/spec/mail/parsers/address_lists_parser_spec.rb +15 -0
- data/vendor/mail/spec/mail/parsers/content_transfer_encoding_parser_spec.rb +72 -0
- data/vendor/mail/spec/mail/part_spec.rb +129 -0
- data/vendor/mail/spec/mail/parts_list_spec.rb +12 -0
- data/vendor/mail/spec/mail/round_tripping_spec.rb +44 -0
- data/vendor/mail/spec/mail/utilities_spec.rb +327 -0
- data/vendor/mail/spec/mail/version_specific/escape_paren_1_8_spec.rb +32 -0
- data/vendor/mail/spec/matchers/break_down_to.rb +35 -0
- data/vendor/mail/spec/spec_helper.rb +163 -0
- metadata +442 -0
@@ -0,0 +1,74 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class AddressList # :nodoc:
|
4
|
+
|
5
|
+
# Mail::AddressList is the class that parses To, From and other address fields from
|
6
|
+
# emails passed into Mail.
|
7
|
+
#
|
8
|
+
# AddressList provides a way to query the groups and mailbox lists of the passed in
|
9
|
+
# string.
|
10
|
+
#
|
11
|
+
# It can supply all addresses in an array, or return each address as an address object.
|
12
|
+
#
|
13
|
+
# Mail::AddressList requires a correctly formatted group or mailbox list per RFC2822 or
|
14
|
+
# RFC822. It also handles all obsolete versions in those RFCs.
|
15
|
+
#
|
16
|
+
# list = 'ada@test.lindsaar.net, My Group: mikel@test.lindsaar.net, Bob <bob@test.lindsaar.net>;'
|
17
|
+
# a = AddressList.new(list)
|
18
|
+
# a.addresses #=> [#<Mail::Address:14943130 Address: |ada@test.lindsaar.net...
|
19
|
+
# a.group_names #=> ["My Group"]
|
20
|
+
def initialize(string)
|
21
|
+
if string.blank?
|
22
|
+
@address_nodes = []
|
23
|
+
return self
|
24
|
+
end
|
25
|
+
parser = Mail::AddressListsParser.new
|
26
|
+
if tree = parser.parse(string)
|
27
|
+
@address_nodes = tree.addresses
|
28
|
+
else
|
29
|
+
raise Mail::Field::ParseError, "AddressListsParser can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns a list of address objects from the parsed line
|
34
|
+
def addresses
|
35
|
+
@addresses ||= get_addresses.map do |address_tree|
|
36
|
+
Mail::Address.new(address_tree)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns a list of all recipient syntax trees that are not part of a group
|
41
|
+
def individual_recipients # :nodoc:
|
42
|
+
@individual_recipients ||= @address_nodes - group_recipients
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns a list of all recipient syntax trees that are part of a group
|
46
|
+
def group_recipients # :nodoc:
|
47
|
+
@group_recipients ||= @address_nodes.select { |an| an.respond_to?(:group_name) }
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the names as an array of strings of all groups
|
51
|
+
def group_names # :nodoc:
|
52
|
+
group_recipients.map { |g| g.group_name.text_value }
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns a list of address syntax trees
|
56
|
+
def address_nodes # :nodoc:
|
57
|
+
@address_nodes
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def get_addresses
|
63
|
+
(individual_recipients + group_recipients.map { |g| get_group_addresses(g) }).flatten
|
64
|
+
end
|
65
|
+
|
66
|
+
def get_group_addresses(g)
|
67
|
+
if g.group_list.respond_to?(:addresses)
|
68
|
+
g.group_list.addresses
|
69
|
+
else
|
70
|
+
[]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class ContentDispositionElement # :nodoc:
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::ContentDispositionParser.new
|
9
|
+
if tree = parser.parse(cleaned(string))
|
10
|
+
@disposition_type = tree.disposition_type.text_value
|
11
|
+
@parameters = tree.parameters
|
12
|
+
else
|
13
|
+
raise Mail::Field::ParseError, "ContentDispositionElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def disposition_type
|
18
|
+
@disposition_type
|
19
|
+
end
|
20
|
+
|
21
|
+
def parameters
|
22
|
+
@parameters
|
23
|
+
end
|
24
|
+
|
25
|
+
def cleaned(string)
|
26
|
+
string =~ /(.+);\s*$/ ? $1 : string
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class ContentLocationElement # :nodoc:
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::ContentLocationParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@location = tree.location.text_value
|
11
|
+
else
|
12
|
+
raise Mail::Field::ParseError, "ContentLocationElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def location
|
17
|
+
@location
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s(*args)
|
21
|
+
location.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class ContentTransferEncodingElement
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::ContentTransferEncodingParser.new
|
9
|
+
case
|
10
|
+
when string.blank?
|
11
|
+
@encoding = ''
|
12
|
+
when tree = parser.parse(string.to_s.downcase)
|
13
|
+
@encoding = tree.encoding.text_value
|
14
|
+
else
|
15
|
+
raise Mail::Field::ParseError, "ContentTransferEncodingElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def encoding
|
20
|
+
@encoding
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class ContentTypeElement # :nodoc:
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::ContentTypeParser.new
|
9
|
+
if tree = parser.parse(cleaned(string))
|
10
|
+
@main_type = tree.main_type.text_value
|
11
|
+
@sub_type = tree.sub_type.text_value
|
12
|
+
@parameters = tree.parameters
|
13
|
+
else
|
14
|
+
raise Mail::Field::ParseError, "ContentTypeElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def main_type
|
19
|
+
@main_type
|
20
|
+
end
|
21
|
+
|
22
|
+
def sub_type
|
23
|
+
@sub_type
|
24
|
+
end
|
25
|
+
|
26
|
+
def parameters
|
27
|
+
@parameters
|
28
|
+
end
|
29
|
+
|
30
|
+
def cleaned(string)
|
31
|
+
string =~ /(.+);\s*$/ ? $1 : string
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class DateTimeElement # :nodoc:
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::DateTimeParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@date_string = tree.date.text_value
|
11
|
+
@time_string = tree.time.text_value
|
12
|
+
else
|
13
|
+
raise Mail::Field::ParseError, "DateTimeElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def date_string
|
18
|
+
@date_string
|
19
|
+
end
|
20
|
+
|
21
|
+
def time_string
|
22
|
+
@time_string
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class EnvelopeFromElement
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::EnvelopeFromParser.new
|
9
|
+
if @tree = parser.parse(string)
|
10
|
+
@address = tree.addr_spec.text_value.strip
|
11
|
+
@date_time = ::DateTime.parse("#{tree.ctime_date.text_value}")
|
12
|
+
else
|
13
|
+
raise Mail::Field::ParseError, "EnvelopeFromElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def tree
|
18
|
+
@tree
|
19
|
+
end
|
20
|
+
|
21
|
+
def date_time
|
22
|
+
@date_time
|
23
|
+
end
|
24
|
+
|
25
|
+
def address
|
26
|
+
@address
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s(*args)
|
30
|
+
"#{@info}; #{@date_time.to_s(*args)}"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class MessageIdsElement
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize(string)
|
8
|
+
parser = Mail::MessageIdsParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@message_ids = tree.message_ids.map { |msg_id| clean_msg_id(msg_id.text_value) }
|
11
|
+
else
|
12
|
+
raise Mail::Field::ParseError, "MessageIdsElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def message_ids
|
17
|
+
@message_ids
|
18
|
+
end
|
19
|
+
|
20
|
+
def message_id
|
21
|
+
@message_ids.first
|
22
|
+
end
|
23
|
+
|
24
|
+
def clean_msg_id( val )
|
25
|
+
val =~ /.*<(.*)>.*/ ; $1
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class MimeVersionElement
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::MimeVersionParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@major = tree.major.text_value
|
11
|
+
@minor = tree.minor.text_value
|
12
|
+
else
|
13
|
+
raise Mail::Field::ParseError, "MimeVersionElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def major
|
18
|
+
@major
|
19
|
+
end
|
20
|
+
|
21
|
+
def minor
|
22
|
+
@minor
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class PhraseList
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize(string)
|
8
|
+
parser = Mail::PhraseListsParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@phrases = tree.phrases
|
11
|
+
else
|
12
|
+
raise Mail::Field::ParseError, "PhraseList can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def phrases
|
17
|
+
@phrases.map { |p| unquote(p.text_value) }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mail
|
3
|
+
class ReceivedElement
|
4
|
+
|
5
|
+
include Mail::Utilities
|
6
|
+
|
7
|
+
def initialize( string )
|
8
|
+
parser = Mail::ReceivedParser.new
|
9
|
+
if tree = parser.parse(string)
|
10
|
+
@date_time = ::DateTime.parse("#{tree.date_time.date.text_value} #{tree.date_time.time.text_value}")
|
11
|
+
@info = tree.name_val_list.text_value
|
12
|
+
else
|
13
|
+
raise Mail::Field::ParseError, "ReceivedElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def date_time
|
18
|
+
@date_time
|
19
|
+
end
|
20
|
+
|
21
|
+
def info
|
22
|
+
@info
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s(*args)
|
26
|
+
"#{@info}; #{@date_time.to_s(*args)}"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,258 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Mail
|
4
|
+
# Raised when attempting to decode an unknown encoding type
|
5
|
+
class UnknownEncodingType < StandardError #:nodoc:
|
6
|
+
end
|
7
|
+
|
8
|
+
module Encodings
|
9
|
+
|
10
|
+
include Mail::Patterns
|
11
|
+
extend Mail::Utilities
|
12
|
+
|
13
|
+
@transfer_encodings = {}
|
14
|
+
|
15
|
+
# Register transfer encoding
|
16
|
+
#
|
17
|
+
# Example
|
18
|
+
#
|
19
|
+
# Encodings.register "base64", Mail::Encodings::Base64
|
20
|
+
def Encodings.register(name, cls)
|
21
|
+
@transfer_encodings[get_name(name)] = cls
|
22
|
+
end
|
23
|
+
|
24
|
+
# Is the encoding we want defined?
|
25
|
+
#
|
26
|
+
# Example:
|
27
|
+
#
|
28
|
+
# Encodings.defined?(:base64) #=> true
|
29
|
+
def Encodings.defined?( str )
|
30
|
+
@transfer_encodings.include? get_name(str)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Gets a defined encoding type, QuotedPrintable or Base64 for now.
|
34
|
+
#
|
35
|
+
# Each encoding needs to be defined as a Mail::Encodings::ClassName for
|
36
|
+
# this to work, allows us to add other encodings in the future.
|
37
|
+
#
|
38
|
+
# Example:
|
39
|
+
#
|
40
|
+
# Encodings.get_encoding(:base64) #=> Mail::Encodings::Base64
|
41
|
+
def Encodings.get_encoding( str )
|
42
|
+
@transfer_encodings[get_name(str)]
|
43
|
+
end
|
44
|
+
|
45
|
+
def Encodings.get_all
|
46
|
+
@transfer_encodings.values
|
47
|
+
end
|
48
|
+
|
49
|
+
def Encodings.get_name(enc)
|
50
|
+
enc = enc.to_s.gsub("-", "_").downcase
|
51
|
+
end
|
52
|
+
|
53
|
+
# Encodes a parameter value using URI Escaping, note the language field 'en' can
|
54
|
+
# be set using Mail::Configuration, like so:
|
55
|
+
#
|
56
|
+
# Mail.defaults.do
|
57
|
+
# param_encode_language 'jp'
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# The character set used for encoding will either be the value of $KCODE for
|
61
|
+
# Ruby < 1.9 or the encoding on the string passed in.
|
62
|
+
#
|
63
|
+
# Example:
|
64
|
+
#
|
65
|
+
# Mail::Encodings.param_encode("This is fun") #=> "us-ascii'en'This%20is%20fun"
|
66
|
+
def Encodings.param_encode(str)
|
67
|
+
case
|
68
|
+
when str.ascii_only? && str =~ TOKEN_UNSAFE
|
69
|
+
%Q{"#{str}"}
|
70
|
+
when str.ascii_only?
|
71
|
+
str
|
72
|
+
else
|
73
|
+
RubyVer.param_encode(str)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Decodes a parameter value using URI Escaping.
|
78
|
+
#
|
79
|
+
# Example:
|
80
|
+
#
|
81
|
+
# Mail::Encodings.param_decode("This%20is%20fun", 'us-ascii') #=> "This is fun"
|
82
|
+
#
|
83
|
+
# str = Mail::Encodings.param_decode("This%20is%20fun", 'iso-8559-1')
|
84
|
+
# str.encoding #=> 'ISO-8859-1' ## Only on Ruby 1.9
|
85
|
+
# str #=> "This is fun"
|
86
|
+
def Encodings.param_decode(str, encoding)
|
87
|
+
RubyVer.param_decode(str, encoding)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Decodes or encodes a string as needed for either Base64 or QP encoding types in
|
91
|
+
# the =?<encoding>?[QB]?<string>?=" format.
|
92
|
+
#
|
93
|
+
# The output type needs to be :decode to decode the input string or :encode to
|
94
|
+
# encode the input string. The character set used for encoding will either be
|
95
|
+
# the value of $KCODE for Ruby < 1.9 or the encoding on the string passed in.
|
96
|
+
#
|
97
|
+
# On encoding, will only send out Base64 encoded strings.
|
98
|
+
def Encodings.decode_encode(str, output_type)
|
99
|
+
case
|
100
|
+
when output_type == :decode
|
101
|
+
Encodings.value_decode(str)
|
102
|
+
else
|
103
|
+
if str.ascii_only?
|
104
|
+
str
|
105
|
+
else
|
106
|
+
Encodings.b_value_encode(str, find_encoding(str))
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Decodes a given string as Base64 or Quoted Printable, depending on what
|
112
|
+
# type it is.
|
113
|
+
#
|
114
|
+
# String has to be of the format =?<encoding>?[QB]?<string>?=
|
115
|
+
def Encodings.value_decode(str)
|
116
|
+
str = str.gsub(/\?=(\s*)=\?/, '?==?') # Remove whitespaces between 'encoded-word's
|
117
|
+
|
118
|
+
# Join QP encoded-words that are adjacent to avoid decoding partial chars
|
119
|
+
str.gsub!( /=\?==\?.+?\?[Qq]\?/m, '' ) if str =~ /\?==\?/
|
120
|
+
|
121
|
+
str.gsub(/(.*?)(=\?.*?\?.\?.*?\?=)|$/m) do # Grab the insides of each encoded-word
|
122
|
+
before = $1.to_s
|
123
|
+
text = $2.to_s
|
124
|
+
|
125
|
+
case
|
126
|
+
when text.to_str =~ /=\?.+\?[Bb]\?/m
|
127
|
+
before + b_value_decode(text)
|
128
|
+
when text.to_str =~ /=\?.+\?[Qq]\?/m
|
129
|
+
before + q_value_decode(text)
|
130
|
+
else
|
131
|
+
before + text
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Takes an encoded string of the format =?<encoding>?[QB]?<string>?=
|
137
|
+
def Encodings.unquote_and_convert_to(str, to_encoding)
|
138
|
+
original_encoding, string = split_encoding_from_string( str )
|
139
|
+
|
140
|
+
output = value_decode( str ).to_s
|
141
|
+
|
142
|
+
if original_encoding.to_s.downcase.gsub("-", "") == to_encoding.to_s.downcase.gsub("-", "")
|
143
|
+
output
|
144
|
+
elsif original_encoding && to_encoding
|
145
|
+
begin
|
146
|
+
require 'iconv'
|
147
|
+
Iconv.iconv(to_encoding, original_encoding, output).first
|
148
|
+
rescue Iconv::IllegalSequence, Iconv::InvalidEncoding, Errno::EINVAL
|
149
|
+
# the 'from' parameter specifies a charset other than what the text
|
150
|
+
# actually is...not much we can do in this case but just return the
|
151
|
+
# unconverted text.
|
152
|
+
#
|
153
|
+
# Ditto if either parameter represents an unknown charset, like
|
154
|
+
# X-UNKNOWN.
|
155
|
+
output
|
156
|
+
end
|
157
|
+
else
|
158
|
+
output
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def Encodings.address_encode(address, charset = 'utf-8')
|
163
|
+
if address.is_a?(Array)
|
164
|
+
# loop back through for each element
|
165
|
+
address.map { |a| Encodings.address_encode(a, charset) }.join(", ")
|
166
|
+
else
|
167
|
+
# find any word boundary that is not ascii and encode it
|
168
|
+
encode_non_usascii(address, charset)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def Encodings.encode_non_usascii(address, charset)
|
173
|
+
return address if address.ascii_only?
|
174
|
+
us_ascii = %Q{\x00-\x7f}
|
175
|
+
# Encode any non usascii strings embedded inside of quotes
|
176
|
+
address.gsub!(/(".*?[^#{us_ascii}].+?")/) { |s| Encodings.b_value_encode(unquote(s), charset) }
|
177
|
+
# Then loop through all remaining items and encode as needed
|
178
|
+
tokens = address.split(/\s/)
|
179
|
+
tokens.each_with_index.map do |word, i|
|
180
|
+
if word.ascii_only?
|
181
|
+
word
|
182
|
+
else
|
183
|
+
previous_non_ascii = tokens[i-1] && !tokens[i-1].ascii_only?
|
184
|
+
if previous_non_ascii
|
185
|
+
word = " #{word}"
|
186
|
+
end
|
187
|
+
Encodings.b_value_encode(word, charset)
|
188
|
+
end
|
189
|
+
end.join(' ')
|
190
|
+
end
|
191
|
+
|
192
|
+
# Encode a string with Base64 Encoding and returns it ready to be inserted
|
193
|
+
# as a value for a field, that is, in the =?<charset>?B?<string>?= format
|
194
|
+
#
|
195
|
+
# Example:
|
196
|
+
#
|
197
|
+
# Encodings.b_value_encode('This is あ string', 'UTF-8')
|
198
|
+
# #=> "=?UTF-8?B?VGhpcyBpcyDjgYIgc3RyaW5n?="
|
199
|
+
def Encodings.b_value_encode(str, encoding = nil)
|
200
|
+
return str if str.to_s.ascii_only?
|
201
|
+
string, encoding = RubyVer.b_value_encode(str, encoding)
|
202
|
+
string.each_line.map do |str|
|
203
|
+
"=?#{encoding}?B?#{str.chomp}?="
|
204
|
+
end.join(" ")
|
205
|
+
end
|
206
|
+
|
207
|
+
# Encode a string with Quoted-Printable Encoding and returns it ready to be inserted
|
208
|
+
# as a value for a field, that is, in the =?<charset>?Q?<string>?= format
|
209
|
+
#
|
210
|
+
# Example:
|
211
|
+
#
|
212
|
+
# Encodings.q_value_encode('This is あ string', 'UTF-8')
|
213
|
+
# #=> "=?UTF-8?Q?This_is_=E3=81=82_string?="
|
214
|
+
def Encodings.q_value_encode(str, encoding = nil)
|
215
|
+
return str if str.to_s.ascii_only?
|
216
|
+
string, encoding = RubyVer.q_value_encode(str, encoding)
|
217
|
+
string.gsub!("=\r\n=", '=') # We already have limited the string to the length we want
|
218
|
+
string.each_line.map do |str|
|
219
|
+
"=?#{encoding}?Q?#{str.chomp.gsub(/ /, '_')}?="
|
220
|
+
end.join(" ")
|
221
|
+
end
|
222
|
+
|
223
|
+
private
|
224
|
+
|
225
|
+
# Decodes a Base64 string from the "=?UTF-8?B?VGhpcyBpcyDjgYIgc3RyaW5n?=" format
|
226
|
+
#
|
227
|
+
# Example:
|
228
|
+
#
|
229
|
+
# Encodings.b_value_encode("=?UTF-8?B?VGhpcyBpcyDjgYIgc3RyaW5n?=")
|
230
|
+
# #=> 'This is あ string'
|
231
|
+
def Encodings.b_value_decode(str)
|
232
|
+
RubyVer.b_value_decode(str)
|
233
|
+
end
|
234
|
+
|
235
|
+
# Decodes a Quoted-Printable string from the "=?UTF-8?Q?This_is_=E3=81=82_string?=" format
|
236
|
+
#
|
237
|
+
# Example:
|
238
|
+
#
|
239
|
+
# Encodings.b_value_encode("=?UTF-8?Q?This_is_=E3=81=82_string?=")
|
240
|
+
# #=> 'This is あ string'
|
241
|
+
def Encodings.q_value_decode(str)
|
242
|
+
RubyVer.q_value_decode(str).gsub(/_/, ' ')
|
243
|
+
end
|
244
|
+
|
245
|
+
def Encodings.split_encoding_from_string( str )
|
246
|
+
match = str.match(/\=\?([^?]+)?\?[QB]\?(.+)?\?\=/mi)
|
247
|
+
if match
|
248
|
+
[match[1], match[2]]
|
249
|
+
else
|
250
|
+
nil
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def Encodings.find_encoding(str)
|
255
|
+
RUBY_VERSION >= '1.9' ? str.encoding : $KCODE
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|