use mailparse
darcs-hash:20080719142058-84dde-60908b20612ee8965015b96d7e279de28cd9b112.gz
This commit is contained in:
		@@ -42,26 +42,47 @@ class MailerDaemon {
 | 
				
			|||||||
			$this->error(NULL, _t('Could not parse message.'));
 | 
								$this->error(NULL, _t('Could not parse message.'));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
 | 
							common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
 | 
				
			||||||
		$user = User::staticGet('email', common_canonical_email($from));
 | 
							$user = $this->user_from($from);
 | 
				
			||||||
		if (!$user) {
 | 
							if (!$user) {
 | 
				
			||||||
			$this->error($from, _('Not a registered user.'));
 | 
								$this->error($from, _('Not a registered user.'));
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if ($user->incomingemail != common_canonical_email($to)) {
 | 
							if (!$this->user_match_to($user, $to)) {
 | 
				
			||||||
			$this->error($from, _('Sorry, that is not your incoming email address.'));
 | 
								$this->error($from, _('Sorry, that is not your incoming email address.'));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		$response = $this->handle_command($user, $msg);
 | 
							$response = $this->handle_command($user, $msg);
 | 
				
			||||||
		if ($response) {
 | 
							if ($response) {
 | 
				
			||||||
			$this->respond($from, $to, $response);
 | 
								$this->respond($from, $to, $response);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							$msg = $this->cleanup_msg($msg);
 | 
				
			||||||
		$this->add_notice($user, $msg);
 | 
							$this->add_notice($user, $msg);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function error($from, $msg) {
 | 
						function error($from, $msg) {
 | 
				
			||||||
		file_put_contents("php://stderr", $msg);
 | 
							file_put_contents("php://stderr", $msg . "\n");
 | 
				
			||||||
		exit(1);
 | 
							exit(1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function user_from($from_hdr) {
 | 
				
			||||||
 | 
							$froms = mailparse_rfc822_parse_addresses($from_hdr);
 | 
				
			||||||
 | 
							if (!$froms) {
 | 
				
			||||||
 | 
								return NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							$from = $froms[0];
 | 
				
			||||||
 | 
							return User::staticGet('email', common_canonical_email($from['address']));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function user_match_to($user, $to_hdr) {
 | 
				
			||||||
 | 
							$incoming = $user->incomingemail;
 | 
				
			||||||
 | 
							$tos = mailparse_rfc822_parse_addresses($to_hdr);
 | 
				
			||||||
 | 
							foreach ($tos as $to) {
 | 
				
			||||||
 | 
								if (strcasecmp($incoming, $to['address']) == 0) {
 | 
				
			||||||
 | 
									return true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	function handle_command($user, $msg) {
 | 
						function handle_command($user, $msg) {
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -122,7 +143,9 @@ class MailerDaemon {
 | 
				
			|||||||
		if (!$parsed) {
 | 
							if (!$parsed) {
 | 
				
			||||||
			return NULL;
 | 
								return NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		$from = $parsed->headers['from'];
 | 
							$from = $parsed->headers['from'];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
		$to = $parsed->headers['to'];
 | 
							$to = $parsed->headers['to'];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		$type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
 | 
							$type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
 | 
				
			||||||
@@ -147,6 +170,13 @@ class MailerDaemon {
 | 
				
			|||||||
	function unsupported_type($type) {
 | 
						function unsupported_type($type) {
 | 
				
			||||||
		$this->error(NULL, "Unsupported message type: " . $type);
 | 
							$this->error(NULL, "Unsupported message type: " . $type);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						function cleanup_msg($msg) {
 | 
				
			||||||
 | 
							# XXX: signatures
 | 
				
			||||||
 | 
							# XXX: quoting 
 | 
				
			||||||
 | 
							preg_replace('/\s+/', ' ', $msg);
 | 
				
			||||||
 | 
							return $msg;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$md = new MailerDaemon();
 | 
					$md = new MailerDaemon();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user