Beispiel #1
0
	/**
	 * @see	wcf\system\mail\MailSender::sendMail()
	 */
	public function sendMail(Mail $mail) {
		$this->recipients = array();
		if (count($mail->getTo()) > 0) $this->recipients = $mail->getTo();
		if (count($mail->getCC()) > 0) $this->recipients = array_merge($this->recipients, $mail->getCC());
		if (count($mail->getBCC())> 0) $this->recipients = array_merge($this->recipients, $mail->getBCC());
		
		// apply connection
		if ($this->connection === null) {
			$this->connect();
		}
		
		// send mail
		$this->write('MAIL FROM:<'.$mail->getFrom().'>');
		$this->getSMTPStatus();
		if ($this->statusCode != 250) {
			throw new SystemException($this->formatError("wrong from format '".$mail->getFrom()."'"));
		}
		
		// recipients
		$recipientCounter = 0;
		foreach ($this->recipients as $recipient) {
			$this->write('RCPT TO:<'.$recipient.'>');
			$this->getSMTPStatus();
			if ($this->statusCode != 250 && $this->statusCode != 251) {
				if ($this->statusCode < 550) {
					throw new SystemException($this->formatError("wrong recipient format '".$recipient."'"));
				}
				continue;
			}
			$recipientCounter++;
		}
		if (!$recipientCounter) {
			$this->write("RSET");
			return;
		}
		
		// data
		$this->write("DATA");
		$this->getSMTPStatus();
		if ($this->statusCode != 354 && $this->statusCode != 250) {
			throw new SystemException($this->formatError("smtp error"));
		}
		
		$header =
			"Date: ".gmdate('r').Mail::$crlf
			."To: ".$mail->getToString().Mail::$crlf
			."Message-ID: <".md5(uniqid())."@".$_SERVER['SERVER_NAME'].">".Mail::$crlf
			."Subject: ".Mail::encodeMIMEHeader($mail->getSubject()).Mail::$crlf
			.$mail->getHeader();
		
		$this->write($header);
		$this->write("");
		$this->write($mail->getBody());
		$this->write(".");
		
		$this->getSMTPStatus();
		if ($this->statusCode != 250) {
			throw new SystemException($this->formatError("message sending failed"));
		}
	}
 /**
  * @see	\wcf\system\mail\MailSender::sendMail()
  */
 public function sendMail(Mail $mail)
 {
     $this->recipients = array();
     if (count($mail->getTo()) > 0) {
         $this->recipients = $mail->getTo();
     }
     if (count($mail->getCC()) > 0) {
         $this->recipients = array_merge($this->recipients, $mail->getCC());
     }
     if (count($mail->getBCC()) > 0) {
         $this->recipients = array_merge($this->recipients, $mail->getBCC());
     }
     // apply connection
     if ($this->connection === null) {
         $this->connect();
     }
     // send mail
     $this->write('MAIL FROM:<' . $mail->getFrom() . '>');
     $this->getSMTPStatus();
     if ($this->statusCode != 250) {
         $this->abort();
         throw new SystemException($this->formatError("wrong from format '" . $mail->getFrom() . "'"));
     }
     // recipients
     $recipientCounter = 0;
     foreach ($this->recipients as $recipient) {
         $this->write('RCPT TO:<' . $recipient . '>');
         $this->getSMTPStatus();
         if ($this->statusCode != 250 && $this->statusCode != 251) {
             if ($this->statusCode < 550) {
                 $this->abort();
                 throw new SystemException($this->formatError("wrong recipient format '" . $recipient . "'"));
             }
             continue;
         }
         $recipientCounter++;
     }
     if (!$recipientCounter) {
         $this->abort();
         return;
     }
     // data
     $this->write("DATA");
     $this->getSMTPStatus();
     if ($this->statusCode != 354 && $this->statusCode != 250) {
         $this->abort();
         throw new SystemException($this->formatError("smtp error"));
     }
     $serverName = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
     if (empty($serverName)) {
         $serverName = gethostname();
         if ($serverName === false) {
             $serverName = 'localhost';
         }
     }
     $header = "Date: " . gmdate('r') . Mail::$lineEnding . "To: " . $mail->getToString() . Mail::$lineEnding . "Message-ID: <" . md5(uniqid()) . "@" . $serverName . ">" . Mail::$lineEnding . "Subject: " . Mail::encodeMIMEHeader($mail->getSubject()) . Mail::$lineEnding . $mail->getHeader();
     $this->write($header);
     $this->write("");
     $lines = explode(Mail::$lineEnding, $mail->getBody());
     foreach ($lines as $line) {
         // 4.5.2 Transparency
         // o  Before sending a line of mail text, the SMTP client checks the
         //    first character of the line.  If it is a period, one additional
         //    period is inserted at the beginning of the line.
         if (StringUtil::startsWith($line, '.')) {
             $line = '.' . $line;
         }
         $this->write($line);
     }
     $this->write(".");
     $this->getSMTPStatus();
     if ($this->statusCode != 250) {
         $this->abort();
         throw new SystemException($this->formatError("message sending failed"));
     }
 }