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,134 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mail::UnstructuredField do
|
5
|
+
|
6
|
+
describe "initialization" do
|
7
|
+
|
8
|
+
it "should be instantiated" do
|
9
|
+
doing {Mail::UnstructuredField.new("Name", "Value")}.should_not raise_error
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "manipulation" do
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
@field = Mail::UnstructuredField.new("Subject", "Hello Frank")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should allow us to set a text value at initialization" do
|
21
|
+
doing{Mail::UnstructuredField.new("Subject", "Value")}.should_not raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should provide access to the text of the field once set" do
|
25
|
+
@field.value.should == "Hello Frank"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should provide a means to change the value" do
|
29
|
+
@field.value = "Goodbye Frank"
|
30
|
+
@field.value.should == "Goodbye Frank"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "displaying encoded field and decoded value" do
|
35
|
+
|
36
|
+
before(:each) do
|
37
|
+
@field = Mail::UnstructuredField.new("Subject", "Hello Frank")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should provide a to_s function that returns the field name and value" do
|
41
|
+
@field.value.should == "Hello Frank"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return '' on to_s if there is no value" do
|
45
|
+
@field.value = nil
|
46
|
+
@field.encoded.should == ''
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should give an encoded value ready to insert into an email" do
|
50
|
+
@field.encoded.should == "Subject: Hello Frank\r\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should return nil on encoded if it has no value" do
|
54
|
+
@field.value = nil
|
55
|
+
@field.encoded.should == ''
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should give an decoded value ready to insert into an email" do
|
59
|
+
@field.decoded.should == "Hello Frank"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should return a nil on decoded if it has no value" do
|
63
|
+
@field.value = nil
|
64
|
+
@field.decoded.should == nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should just add the CRLF at the end of the line" do
|
68
|
+
@field = Mail::SubjectField.new("Subject: =?utf-8?Q?testing_testing_=D6=A4?=")
|
69
|
+
result = "Subject: testing testing =?UTF8?Q?_=D6=A4=?=\r\n"
|
70
|
+
@field.encoded.gsub("UTF-8", "UTF8").should == result
|
71
|
+
@field.decoded.should == "testing testing \326\244"
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "folding" do
|
77
|
+
|
78
|
+
it "should not fold itself if it is 78 chracters long" do
|
79
|
+
@field = Mail::UnstructuredField.new("Subject", "This is a subject header message that is _exactly_ 78 characters....")
|
80
|
+
@field.encoded.should == "Subject: This is a subject header message that is _exactly_ 78 characters....\r\n"
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should fold itself if it is 79 chracters long" do
|
84
|
+
@field = Mail::UnstructuredField.new("Subject", "This is a subject header message that is _exactly_ 79 characters long")
|
85
|
+
result = "Subject: This is a subject header message that is _exactly_ 79 characters\r\n\tlong\r\n"
|
86
|
+
@field.encoded.should == result
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should fold itself if it is 997 chracters long" do
|
90
|
+
@field = Mail::UnstructuredField.new("Subject", "This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. This is a subject header message that is going to be 997 characters long. And this makes it 997....")
|
91
|
+
lines = @field.encoded.split("\r\n\t")
|
92
|
+
lines.each { |line| line.length.should < 78 }
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should fold itself if it is 998 characters long" do
|
96
|
+
value = "This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. This is a subject header message that is going to be 998 characters long. And this makes it 998 long"
|
97
|
+
@field = Mail::UnstructuredField.new("Subject", value)
|
98
|
+
lines = @field.encoded.split("\r\n\t")
|
99
|
+
lines.each { |line| line.length.should < 78 }
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should fold itself if it is 999 characters long" do
|
103
|
+
value = "This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. This is a subject header message that is going to be 999 characters long. And this makes it 999 long."
|
104
|
+
@field = Mail::UnstructuredField.new("Subject", value)
|
105
|
+
lines = @field.encoded.split("\r\n\t")
|
106
|
+
lines.each { |line| line.length.should < 78 }
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should fold itself if it is non us-ascii" do
|
110
|
+
@original = $KCODE if RUBY_VERSION < '1.9'
|
111
|
+
string = "This is あ really long string This is あ really long string This is あ really long string This is あ really long string This is あ really long string"
|
112
|
+
@field = Mail::UnstructuredField.new("Subject", string)
|
113
|
+
if string.respond_to?(:force_encoding)
|
114
|
+
string = string.force_encoding('UTF-8')
|
115
|
+
else
|
116
|
+
$KCODE = 'u'
|
117
|
+
end
|
118
|
+
result = "Subject: This =?UTF8?Q?is_=E3=81=82=?= really long string\r\n\t=?UTF8?Q?This_is_=E3=81=82=?= really long string\r\n\t=?UTF8?Q?This_is_=E3=81=82=?= really long string\r\n\t=?UTF8?Q?This_is_=E3=81=82=?= really long string\r\n\t=?UTF8?Q?This_is_=E3=81=82=?= really long string\r\n"
|
119
|
+
@field.encoded.gsub("UTF-8", "UTF8").should == result
|
120
|
+
@field.decoded.should == string
|
121
|
+
$KCODE = @original if RUBY_VERSION < '1.9'
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "encoding non QP safe chars" do
|
127
|
+
it "should encode an ascii string that has carriage returns if asked to" do
|
128
|
+
result = "Subject: =0Aasdf=0A\r\n"
|
129
|
+
@field = Mail::UnstructuredField.new("Subject", "\nasdf\n")
|
130
|
+
@field.encoded.should == "Subject: =0Aasdf=0A\r\n"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
@@ -0,0 +1,578 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe Mail::Header do
|
5
|
+
|
6
|
+
describe "initialization" do
|
7
|
+
|
8
|
+
it "should instantiate empty" do
|
9
|
+
doing { Mail::Header.new }.should_not raise_error
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should instantiate with a string passed in" do
|
13
|
+
doing { Mail::Header.new("To: Mikel\r\nFrom: bob\r\n") }.should_not raise_error
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "instance methods" do
|
19
|
+
|
20
|
+
it "should save away the raw source of the header that it is passed" do
|
21
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
22
|
+
header.raw_source.should == "To: Mikel\r\nFrom: bob\r\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should say if it has a message_id field defined" do
|
26
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
27
|
+
header.should_not be_has_message_id
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should say if it has a message_id field defined" do
|
31
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\nMessage-ID: 1234")
|
32
|
+
header.should be_has_message_id
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should say if it has a content_id field defined" do
|
36
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
37
|
+
header.should_not be_has_content_id
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should say if it has a content_id field defined" do
|
41
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\nContent-ID: <1234@me.com>")
|
42
|
+
header.should be_has_content_id
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should know it's own charset" do
|
46
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\nContent-ID: <1234@me.com>")
|
47
|
+
header.charset.should == nil
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should know it's own charset if set" do
|
51
|
+
header = Mail::Header.new
|
52
|
+
header['content-type'] = 'text/plain; charset=utf-8'
|
53
|
+
header.charset.should == 'utf-8'
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "creating fields" do
|
59
|
+
it "should recognise a bcc field" do
|
60
|
+
header = Mail::Header.new
|
61
|
+
header['bcc'] = 'mikel@test.lindsaar.net'
|
62
|
+
header['bcc'].field.class.should == Mail::BccField
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should recognise a cc field" do
|
66
|
+
header = Mail::Header.new
|
67
|
+
header['cc'] = 'mikel@test.lindsaar.net'
|
68
|
+
header['cc'].field.class.should == Mail::CcField
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should recognise a content-description field" do
|
72
|
+
header = Mail::Header.new
|
73
|
+
header['content-description'] = 'Text'
|
74
|
+
header['content-description'].field.class.should == Mail::ContentDescriptionField
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should recognise a content-disposition field" do
|
78
|
+
header = Mail::Header.new
|
79
|
+
header['content-disposition'] = 'attachment; filename=File'
|
80
|
+
header['content-disposition'].field.class.should == Mail::ContentDispositionField
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should recognise a content-id field" do
|
84
|
+
header = Mail::Header.new
|
85
|
+
header['content-id'] = '<1234@test.lindsaar.net>'
|
86
|
+
header['content-id'].field.class.should == Mail::ContentIdField
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should recognise a content-transfer-encoding field" do
|
90
|
+
header = Mail::Header.new
|
91
|
+
header['content-transfer-encoding'] = '7bit'
|
92
|
+
header['content-transfer-encoding'].field.class.should == Mail::ContentTransferEncodingField
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should recognise a content-type field" do
|
96
|
+
header = Mail::Header.new
|
97
|
+
header['content-type'] = 'text/plain'
|
98
|
+
header['content-type'].field.class.should == Mail::ContentTypeField
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should recognise a date field" do
|
102
|
+
header = Mail::Header.new
|
103
|
+
header['date'] = 'Fri, 21 Nov 1997 09:55:06 -0600'
|
104
|
+
header['date'].field.class.should == Mail::DateField
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should recognise a from field" do
|
108
|
+
header = Mail::Header.new
|
109
|
+
header['from'] = 'mikel@test.lindsaar.net'
|
110
|
+
header['from'].field.class.should == Mail::FromField
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should recognise a in-reply-to field" do
|
114
|
+
header = Mail::Header.new
|
115
|
+
header['in-reply-to'] = '<1234@test.lindsaar.net>'
|
116
|
+
header['in-reply-to'].field.class.should == Mail::InReplyToField
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should recognise a keywords field" do
|
120
|
+
header = Mail::Header.new
|
121
|
+
header['keywords'] = 'mikel test lindsaar net'
|
122
|
+
header['keywords'].field.class.should == Mail::KeywordsField
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should recognise a message-id field" do
|
126
|
+
header = Mail::Header.new
|
127
|
+
header['message-id'] = '<1234@test.lindsaar.net>'
|
128
|
+
header['message-id'].field.class.should == Mail::MessageIdField
|
129
|
+
end
|
130
|
+
|
131
|
+
it "should recognise a mime-version field" do
|
132
|
+
header = Mail::Header.new
|
133
|
+
header['mime-version'] = '1.0'
|
134
|
+
header['mime-version'].field.class.should == Mail::MimeVersionField
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should recognise a received field" do
|
138
|
+
header = Mail::Header.new
|
139
|
+
header['received'] = 'from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id C1B953B4CB6 for <xxxxx@Exxx.xxxx.xxx>; Tue, 10 May 2005 15:27:05 -0500'
|
140
|
+
header['received'].field.class.should == Mail::ReceivedField
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should recognise a references field" do
|
144
|
+
header = Mail::Header.new
|
145
|
+
header['references'] = '<1234@test.lindsaar.net>'
|
146
|
+
header['references'].field.class.should == Mail::ReferencesField
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should recognise a reply-to field" do
|
150
|
+
header = Mail::Header.new
|
151
|
+
header['reply-to'] = 'mikel@test.lindsaar.net'
|
152
|
+
header['reply-to'].field.class.should == Mail::ReplyToField
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should recognise a resent-bcc field" do
|
156
|
+
header = Mail::Header.new
|
157
|
+
header['resent-bcc'] = 'mikel@test.lindsaar.net'
|
158
|
+
header['resent-bcc'].field.class.should == Mail::ResentBccField
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should recognise a resent-cc field" do
|
162
|
+
header = Mail::Header.new
|
163
|
+
header['resent-cc'] = 'mikel@test.lindsaar.net'
|
164
|
+
header['resent-cc'].field.class.should == Mail::ResentCcField
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should recognise a resent-date field" do
|
168
|
+
header = Mail::Header.new
|
169
|
+
header['resent-date'] = 'Fri, 21 Nov 1997 09:55:06 -0600'
|
170
|
+
header['resent-date'].field.class.should == Mail::ResentDateField
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should recognise a resent-from field" do
|
174
|
+
header = Mail::Header.new
|
175
|
+
header['resent-from'] = 'mikel@test.lindsaar.net'
|
176
|
+
header['resent-from'].field.class.should == Mail::ResentFromField
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should recognise a resent-message-id field" do
|
180
|
+
header = Mail::Header.new
|
181
|
+
header['resent-message-id'] = '<1234@mail.baci.local>'
|
182
|
+
header['resent-message-id'].field.class.should == Mail::ResentMessageIdField
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should recognise a resent-sender field" do
|
186
|
+
header = Mail::Header.new
|
187
|
+
header['resent-sender'] = 'mikel@test.lindsaar.net'
|
188
|
+
header['resent-sender'].field.class.should == Mail::ResentSenderField
|
189
|
+
end
|
190
|
+
|
191
|
+
it "should recognise a resent-to field" do
|
192
|
+
header = Mail::Header.new
|
193
|
+
header['resent-to'] = 'mikel@test.lindsaar.net'
|
194
|
+
header['resent-to'].field.class.should == Mail::ResentToField
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should recognise a return-path field" do
|
198
|
+
header = Mail::Header.new
|
199
|
+
header['return-path'] = '<mikel@me.com>'
|
200
|
+
header['return-path'].field.class.should == Mail::ReturnPathField
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should recognise a sender field" do
|
204
|
+
header = Mail::Header.new
|
205
|
+
header['sender'] = 'mikel@test.lindsaar.net'
|
206
|
+
header['sender'].field.class.should == Mail::SenderField
|
207
|
+
end
|
208
|
+
|
209
|
+
it "should recognise a to field" do
|
210
|
+
header = Mail::Header.new
|
211
|
+
header['to'] = 'mikel@test.lindsaar.net'
|
212
|
+
header['to'].field.class.should == Mail::ToField
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should maintain header case" do
|
216
|
+
header = Mail::Header.new
|
217
|
+
header['User-Agent'] = 'My funky mailer'
|
218
|
+
header.encoded.should match(/^User-Agent: /)
|
219
|
+
header.encoded.should_not match(/^user-agent: /)
|
220
|
+
end
|
221
|
+
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
describe "parsing" do
|
226
|
+
|
227
|
+
it "should split the header into separate fields" do
|
228
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
229
|
+
header.fields.length.should == 2
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should not split a wrapped header in two" do
|
233
|
+
header = Mail::Header.new("To: mikel lindsaar\r\n\t<mikel@lindsaar>\r\nFrom: bob\r\nSubject: This is\r\n a long\r\n\t \t \t \t badly formatted \r\n \t\t \t field")
|
234
|
+
header.fields.length.should == 3
|
235
|
+
end
|
236
|
+
|
237
|
+
# Header fields are lines composed of a field name, followed by a colon
|
238
|
+
# (":"), followed by a field body, and terminated by CRLF. A field
|
239
|
+
# name MUST be composed of printable US-ASCII characters (i.e.,
|
240
|
+
# characters that have values between 33 and 126, inclusive), except
|
241
|
+
# colon.
|
242
|
+
it "should accept any valid header field name" do
|
243
|
+
test_name = ascii.reject { |c| c == ':' }.join
|
244
|
+
doing { Mail::Header.new("#{test_name}: This is a crazy name") }.should_not raise_error
|
245
|
+
end
|
246
|
+
|
247
|
+
# A field body may be composed of any US-ASCII characters,
|
248
|
+
# except for CR and LF. However, a field body may contain CRLF when
|
249
|
+
# used in header "folding" and "unfolding" as described in section
|
250
|
+
# 2.2.3.
|
251
|
+
it "should accept any valid header field value" do
|
252
|
+
test_value = ascii.reject { |c| c == ':' }
|
253
|
+
test_value << ' '
|
254
|
+
test_value << '\r\n'
|
255
|
+
doing {Mail::Header.new("header: #{test_value}")}.should_not raise_error
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should split each field into an name and value" do
|
259
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
260
|
+
header.fields[0].name.should == "From"
|
261
|
+
header.fields[0].value.should == "bob"
|
262
|
+
header.fields[1].name.should == "To"
|
263
|
+
header.fields[1].value.should == "Mikel"
|
264
|
+
end
|
265
|
+
|
266
|
+
it "should split each field into an name and value - even if whitespace is missing" do
|
267
|
+
header = Mail::Header.new("To: Mikel\r\nFrom:bob\r\n")
|
268
|
+
header.fields[0].name.should == "From"
|
269
|
+
header.fields[0].value.should == "bob"
|
270
|
+
header.fields[1].name.should == "To"
|
271
|
+
header.fields[1].value.should == "Mikel"
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should preserve the order of the fields it is given" do
|
275
|
+
header = Mail::Header.new
|
276
|
+
header.fields = ['From: mikel@me.com', 'To: bob@you.com', 'Subject: This is a badly formed email']
|
277
|
+
header.fields[0].name.should == 'From'
|
278
|
+
header.fields[1].name.should == 'To'
|
279
|
+
header.fields[2].name.should == 'Subject'
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should allow you to reference each field and value by literal string name" do
|
283
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
284
|
+
header['To'].value.should == "Mikel"
|
285
|
+
header['From'].value.should == "bob"
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should return an array of fields if there is more than one match" do
|
289
|
+
header = Mail::Header.new
|
290
|
+
header.fields = ['From: mikel@me.com', 'X-Mail-SPAM: 15', 'X-Mail-SPAM: 23']
|
291
|
+
header['X-Mail-SPAM'].map { |x| x.value }.should == ['15', '23']
|
292
|
+
end
|
293
|
+
|
294
|
+
it "should return nil if no value in the header" do
|
295
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
296
|
+
header['Subject'].should be_nil
|
297
|
+
end
|
298
|
+
|
299
|
+
it "should add a new field if the field does not exist" do
|
300
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
301
|
+
header['Subject'] = "G'Day!"
|
302
|
+
header['Subject'].value.should == "G'Day!"
|
303
|
+
end
|
304
|
+
|
305
|
+
it "should allow you to pass in an array of raw fields" do
|
306
|
+
header = Mail::Header.new
|
307
|
+
header.fields = ['From: mikel@test.lindsaar.net', 'To: bob@you.com']
|
308
|
+
header['To'].value.should == 'bob@you.com'
|
309
|
+
header['From'].value.should == 'mikel@test.lindsaar.net'
|
310
|
+
end
|
311
|
+
|
312
|
+
it "should reset the value of a single-only field if it already exists" do
|
313
|
+
header = Mail::Header.new("To: Mikel\r\nFrom: bob\r\n")
|
314
|
+
header['To'] = 'George'
|
315
|
+
header['To'].value.should == "George"
|
316
|
+
end
|
317
|
+
|
318
|
+
it "should allow you to delete a field by setting it to nil" do
|
319
|
+
header = Mail::Header.new
|
320
|
+
header.fields = ['To: bob@you.com']
|
321
|
+
header.fields.length.should == 1
|
322
|
+
header['To'] = nil
|
323
|
+
header.fields.length.should == 0
|
324
|
+
end
|
325
|
+
|
326
|
+
it "should delete all matching fields found if there are multiple options" do
|
327
|
+
header = Mail::Header.new
|
328
|
+
header.fields = ['X-SPAM: 1000', 'X-SPAM: 20']
|
329
|
+
header['X-SPAM'] = nil
|
330
|
+
header.fields.length.should == 0
|
331
|
+
end
|
332
|
+
|
333
|
+
# Handle empty X-Optional header from Microsoft Exchange
|
334
|
+
it "should handle an empty X-* header value" do
|
335
|
+
header = Mail::Header.new("X-MS-TNEF-Correlator:\r\n")
|
336
|
+
header.fields.length.should == 1
|
337
|
+
header['X-MS-TNEF-Correlator'].decoded.should == nil
|
338
|
+
header['X-MS-TNEF-Correlator'].encoded.should == "X-MS-TNEF-Correlator: \r\n"
|
339
|
+
end
|
340
|
+
|
341
|
+
it "should accept X- option fields from MS-Exchange" do
|
342
|
+
header = Mail::Header.new("X-Ms-Has-Attach:\r\nX-MS-TNEF-Correlator: \r\n")
|
343
|
+
header.fields.length.should == 2
|
344
|
+
header['X-Ms-Has-Attach'].decoded.should == nil
|
345
|
+
header['X-Ms-Has-Attach'].encoded.should == "X-Ms-Has-Attach: \r\n"
|
346
|
+
header['X-MS-TNEF-Correlator'].decoded.should == nil
|
347
|
+
header['X-MS-TNEF-Correlator'].encoded.should == "X-MS-TNEF-Correlator: \r\n"
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should return nil if asked for the value of a non existent field" do
|
351
|
+
header = Mail::Header.new
|
352
|
+
header['Bobs-Field'].should == nil
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should allow you to replace a from field" do
|
356
|
+
header = Mail::Header.new
|
357
|
+
header['From'].should == nil
|
358
|
+
header['From'] = 'mikel@test.lindsaar.net'
|
359
|
+
header['From'].decoded.should == 'mikel@test.lindsaar.net'
|
360
|
+
header['From'] = 'bob@test.lindsaar.net'
|
361
|
+
header['From'].decoded.should == 'bob@test.lindsaar.net'
|
362
|
+
end
|
363
|
+
|
364
|
+
it "should maintain the class of the field" do
|
365
|
+
header = Mail::Header.new
|
366
|
+
header['From'] = 'mikel@test.lindsaar.net'
|
367
|
+
header['From'].field.class.should == Mail::FromField
|
368
|
+
header['From'] = 'bob@test.lindsaar.net'
|
369
|
+
header['From'].field.class.should == Mail::FromField
|
370
|
+
end
|
371
|
+
|
372
|
+
end
|
373
|
+
|
374
|
+
describe "folding and unfolding" do
|
375
|
+
|
376
|
+
it "should unfold a header" do
|
377
|
+
header = Mail::Header.new("To: Mikel,\r\n Lindsaar, Bob")
|
378
|
+
header['To'].value.should == 'Mikel, Lindsaar, Bob'
|
379
|
+
end
|
380
|
+
|
381
|
+
it "should remove multiple spaces during unfolding a header" do
|
382
|
+
header = Mail::Header.new("To: Mikel,\r\n Lindsaar, Bob")
|
383
|
+
header['To'].value.should == 'Mikel, Lindsaar, Bob'
|
384
|
+
end
|
385
|
+
|
386
|
+
it "should handle a crazy long folded header" do
|
387
|
+
header_text =<<HERE
|
388
|
+
Received: from [127.0.220.158] (helo=fg-out-1718.google.com)
|
389
|
+
by smtp.totallyrandom.com with esmtp (Exim 4.68)
|
390
|
+
(envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>)
|
391
|
+
id 1K4JeQ-0005Nd-Ij
|
392
|
+
for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700
|
393
|
+
HERE
|
394
|
+
header = Mail::Header.new(header_text.gsub(/\n/, "\r\n"))
|
395
|
+
header['Received'].value.should == 'from [127.0.220.158] (helo=fg-out-1718.google.com) by smtp.totallyrandom.com with esmtp (Exim 4.68) (envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>) id 1K4JeQ-0005Nd-Ij for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700'
|
396
|
+
end
|
397
|
+
|
398
|
+
it "should convert all lonesome LFs to CRLF" do
|
399
|
+
header_text =<<HERE
|
400
|
+
Received: from [127.0.220.158] (helo=fg-out-1718.google.com)
|
401
|
+
by smtp.totallyrandom.com with esmtp (Exim 4.68)
|
402
|
+
(envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>)
|
403
|
+
id 1K4JeQ-0005Nd-Ij
|
404
|
+
for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700
|
405
|
+
HERE
|
406
|
+
header = Mail::Header.new(header_text.gsub(/\n/, "\n"))
|
407
|
+
header['Received'].value.should == 'from [127.0.220.158] (helo=fg-out-1718.google.com) by smtp.totallyrandom.com with esmtp (Exim 4.68) (envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>) id 1K4JeQ-0005Nd-Ij for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700'
|
408
|
+
end
|
409
|
+
|
410
|
+
it "should convert all lonesome CRs to CRLF" do
|
411
|
+
header_text =<<HERE
|
412
|
+
Received: from [127.0.220.158] (helo=fg-out-1718.google.com)
|
413
|
+
by smtp.totallyrandom.com with esmtp (Exim 4.68)
|
414
|
+
(envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>)
|
415
|
+
id 1K4JeQ-0005Nd-Ij
|
416
|
+
for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700
|
417
|
+
HERE
|
418
|
+
header = Mail::Header.new(header_text.gsub(/\n/, "\r"))
|
419
|
+
header['Received'].value.should == 'from [127.0.220.158] (helo=fg-out-1718.google.com) by smtp.totallyrandom.com with esmtp (Exim 4.68) (envelope-from <stuff+caf_=support=aaa.somewhere.com@gmail.com>) id 1K4JeQ-0005Nd-Ij for support@aaa.somewhere.com; Thu, 05 Jun 2008 10:53:29 -0700'
|
420
|
+
end
|
421
|
+
|
422
|
+
end
|
423
|
+
|
424
|
+
describe "error handling" do
|
425
|
+
it "should collect up any of its fields' errors" do
|
426
|
+
header = Mail::Header.new("Content-Transfer-Encoding: vlad\r\nReply-To: a b b")
|
427
|
+
header.errors.should_not be_blank
|
428
|
+
header.errors.size.should == 2
|
429
|
+
header.errors[0][0].should == 'Content-Transfer-Encoding'
|
430
|
+
header.errors[0][1].should == 'vlad'
|
431
|
+
header.errors[1][0].should == 'Reply-To'
|
432
|
+
header.errors[1][1].should == 'a b b'
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
describe "handling date fields with multiple values" do
|
437
|
+
it "should know which fields can only appear once" do
|
438
|
+
%w[ date ].each do |field|
|
439
|
+
header = Mail::Header.new
|
440
|
+
header[field] = "Thu, 05 Jun 2008 10:53:29 -0700"
|
441
|
+
header[field] = "Mon, 15 Nov 2010 11:05:29 -1100"
|
442
|
+
header[field].value.should == "Mon, 15 Nov 2010 11:05:29 -1100"
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
it "should know which fields can only appear once" do
|
447
|
+
%w[ from sender reply-to to cc bcc ].each do |field|
|
448
|
+
header = Mail::Header.new
|
449
|
+
header[field] = "mikel@test.lindsaar.net"
|
450
|
+
header[field] = "ada@test.lindsaar.net"
|
451
|
+
header[field].value.should == "ada@test.lindsaar.net"
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
it "should enforce appear-once rule even with mass assigned header" do
|
456
|
+
header = Mail::Header.new(
|
457
|
+
"Content-Type: multipart/alternative\nContent-Type: text/plain\n"
|
458
|
+
)
|
459
|
+
header['content-type'].should_not be_kind_of(Array)
|
460
|
+
end
|
461
|
+
|
462
|
+
it "should add additional fields that can appear more than once" do
|
463
|
+
%w[ comments keywords x-spam].each do |field|
|
464
|
+
header = Mail::Header.new
|
465
|
+
header[field] = "1234"
|
466
|
+
header[field] = "5678"
|
467
|
+
header[field].map { |x| x.value }.should == ["1234", "5678"]
|
468
|
+
end
|
469
|
+
end
|
470
|
+
|
471
|
+
it "should delete all references to a field" do
|
472
|
+
header = Mail::Header.new
|
473
|
+
header.fields = ['X-Mail-SPAM: 15', 'X-Mail-SPAM: 20']
|
474
|
+
header['X-Mail-SPAM'] = '10000'
|
475
|
+
header['X-Mail-SPAM'].map { |x| x.value }.should == ['15', '20', '10000']
|
476
|
+
header['X-Mail-SPAM'] = nil
|
477
|
+
header['X-Mail-SPAM'].should == nil
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
describe "handling trace fields" do
|
482
|
+
|
483
|
+
before(:each) do
|
484
|
+
trace_header =<<TRACEHEADER
|
485
|
+
Return-Path: <xxx@xxxx.xxxtest>
|
486
|
+
Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id 6AAEE3B4D23 for <xxx@xxxx.xxx>; Sun, 8 May 2005 12:30:23 -0500
|
487
|
+
Received: from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id j48HUC213279 for <xxx@xxxx.xxx>; Sun, 8 May 2005 12:30:13 -0500
|
488
|
+
Received: from conversion-xxx.xxxx.xxx.net by xxx.xxxx.xxx id <0IG600901LQ64I@xxx.xxxx.xxx> for <xxx@xxxx.xxx>; Sun, 8 May 2005 12:30:12 -0500
|
489
|
+
Received: from agw1 by xxx.xxxx.xxx with ESMTP id <0IG600JFYLYCAxxx@xxxx.xxx> for <xxx@xxxx.xxx>; Sun, 8 May 2005 12:30:12 -0500
|
490
|
+
TRACEHEADER
|
491
|
+
@traced_header = Mail::Header.new(trace_header)
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should instantiate one trace field object per header" do
|
495
|
+
@traced_header.fields.length.should == 5
|
496
|
+
end
|
497
|
+
|
498
|
+
it "should add a new received header after the other received headers if they exist" do
|
499
|
+
@traced_header['To'] = "Mikel"
|
500
|
+
@traced_header['Received'] = "from agw2 by xxx.xxxx.xxx; Sun, 8 May 2005 12:30:13 -0500"
|
501
|
+
@traced_header.fields[0].addresses.should == ['xxx@xxxx.xxxtest']
|
502
|
+
@traced_header.fields[1].info.should == 'from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id 6AAEE3B4D23 for <xxx@xxxx.xxx>'
|
503
|
+
@traced_header.fields[2].info.should == 'from xxx.xxxx.xxx by xxx.xxxx.xxx with ESMTP id j48HUC213279 for <xxx@xxxx.xxx>'
|
504
|
+
@traced_header.fields[3].info.should == 'from conversion-xxx.xxxx.xxx.net by xxx.xxxx.xxx id <0IG600901LQ64I@xxx.xxxx.xxx> for <xxx@xxxx.xxx>'
|
505
|
+
@traced_header.fields[5].info.should == "from agw2 by xxx.xxxx.xxx"
|
506
|
+
@traced_header.fields[6].field.class.should == Mail::ToField
|
507
|
+
end
|
508
|
+
|
509
|
+
end
|
510
|
+
|
511
|
+
describe "encoding" do
|
512
|
+
it "should output a parsed version of itself to US-ASCII on encoded and tidy up and sort correctly" do
|
513
|
+
header = Mail::Header.new("To: Mikel\r\n\tLindsaar <mikel@test.lindsaar.net>\r\nFrom: bob\r\n\t<bob@test.lindsaar.net>\r\nSubject: This is\r\n a long\r\n\t \t \t \t badly formatted \r\n \t\t \t field")
|
514
|
+
result = "From: bob <bob@test.lindsaar.net>\r\nTo: Mikel Lindsaar <mikel@test.lindsaar.net>\r\nSubject: This is a long badly formatted field\r\n"
|
515
|
+
header.encoded.should == result
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
describe "detecting required fields" do
|
520
|
+
it "should not say it has a message id if it doesn't" do
|
521
|
+
Mail::Header.new.should_not be_has_message_id
|
522
|
+
end
|
523
|
+
|
524
|
+
it "should say it has a message id if it does" do
|
525
|
+
Mail::Header.new('Message-ID: 1234').should be_has_message_id
|
526
|
+
end
|
527
|
+
|
528
|
+
it "should not say it has a date if it doesn't" do
|
529
|
+
Mail::Header.new.should_not be_has_date
|
530
|
+
end
|
531
|
+
|
532
|
+
it "should say it has a date id if it does" do
|
533
|
+
Mail::Header.new('Date: Mon, 24 Nov 1997 14:22:01 -0800').should be_has_date
|
534
|
+
end
|
535
|
+
|
536
|
+
it "should not say it has a mime-version if it doesn't" do
|
537
|
+
Mail::Header.new.should_not be_has_mime_version
|
538
|
+
end
|
539
|
+
|
540
|
+
it "should say it has a date id if it does" do
|
541
|
+
Mail::Header.new('Mime-Version: 1.0').should be_has_mime_version
|
542
|
+
end
|
543
|
+
end
|
544
|
+
|
545
|
+
describe "mime version handling" do
|
546
|
+
it "should return the mime version of the email" do
|
547
|
+
header = Mail::Header.new("Mime-Version: 1.0")
|
548
|
+
header['mime-version'].value.should == '1.0'
|
549
|
+
end
|
550
|
+
|
551
|
+
it "should return nil if no mime-version header field" do
|
552
|
+
header = Mail::Header.new('To: bob')
|
553
|
+
header['mime_version'].should == nil
|
554
|
+
end
|
555
|
+
|
556
|
+
it "should return the transfer-encoding of the email" do
|
557
|
+
header = Mail::Header.new("Content-Transfer-Encoding: Base64")
|
558
|
+
header['content-transfer-encoding'].value.should == 'Base64'
|
559
|
+
end
|
560
|
+
|
561
|
+
it "should return nil if no transfer-encoding header field" do
|
562
|
+
header = Mail::Header.new
|
563
|
+
header['content-transfer-encoding'].should == nil
|
564
|
+
end
|
565
|
+
|
566
|
+
it "should return the content-description of the email" do
|
567
|
+
header = Mail::Header.new("Content-Description: This is a description")
|
568
|
+
header['Content-Description'].value.should == 'This is a description'
|
569
|
+
end
|
570
|
+
|
571
|
+
it "should return nil if no content-description header field" do
|
572
|
+
header = Mail::Header.new
|
573
|
+
header['Content-Description'].should == nil
|
574
|
+
end
|
575
|
+
|
576
|
+
end
|
577
|
+
|
578
|
+
end
|