610 lines
14 KiB
PHP
610 lines
14 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of SwiftMailer.
|
|
* (c) 2004-2009 Chris Corbyn
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
//@require 'Swift/Mime/Message.php';
|
|
//@require 'Swift/Mime/MimePart.php';
|
|
//@require 'Swift/Mime/MimeEntity.php';
|
|
//@require 'Swift/Mime/HeaderSet.php';
|
|
//@require 'Swift/Mime/ContentEncoder.php';
|
|
|
|
/**
|
|
* The default email message class.
|
|
* @package Swift
|
|
* @subpackage Mime
|
|
* @author Chris Corbyn
|
|
*/
|
|
class Swift_Mime_SimpleMessage extends Swift_Mime_MimePart
|
|
implements Swift_Mime_Message
|
|
{
|
|
|
|
/**
|
|
* Create a new SimpleMessage with $headers, $encoder and $cache.
|
|
* @param Swift_Mime_HeaderSet $headers
|
|
* @param Swift_Mime_ContentEncoder $encoder
|
|
* @param Swift_KeyCache $cache
|
|
* @param string $charset
|
|
*/
|
|
public function __construct(Swift_Mime_HeaderSet $headers,
|
|
Swift_Mime_ContentEncoder $encoder, Swift_KeyCache $cache, $charset = null)
|
|
{
|
|
parent::__construct($headers, $encoder, $cache, $charset);
|
|
$this->getHeaders()->defineOrdering(array(
|
|
'Return-Path',
|
|
'Sender',
|
|
'Message-ID',
|
|
'Date',
|
|
'Subject',
|
|
'From',
|
|
'Reply-To',
|
|
'To',
|
|
'Cc',
|
|
'Bcc',
|
|
'MIME-Version',
|
|
'Content-Type',
|
|
'Content-Transfer-Encoding'
|
|
));
|
|
$this->getHeaders()->setAlwaysDisplayed(
|
|
array('Date', 'Message-ID', 'From')
|
|
);
|
|
$this->getHeaders()->addTextHeader('MIME-Version', '1.0');
|
|
$this->setDate(time());
|
|
$this->setId($this->getId());
|
|
$this->getHeaders()->addMailboxHeader('From');
|
|
}
|
|
|
|
/**
|
|
* Always returns {@link LEVEL_TOP} for a message instance.
|
|
* @return int
|
|
*/
|
|
public function getNestingLevel()
|
|
{
|
|
return self::LEVEL_TOP;
|
|
}
|
|
|
|
/**
|
|
* Set the subject of this message.
|
|
* @param string $subject
|
|
*/
|
|
public function setSubject($subject)
|
|
{
|
|
if (!$this->_setHeaderFieldModel('Subject', $subject))
|
|
{
|
|
$this->getHeaders()->addTextHeader('Subject', $subject);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the subject of this message.
|
|
* @return string
|
|
*/
|
|
public function getSubject()
|
|
{
|
|
return $this->_getHeaderFieldModel('Subject');
|
|
}
|
|
|
|
/**
|
|
* Set the date at which this message was created.
|
|
* @param int $date
|
|
*/
|
|
public function setDate($date)
|
|
{
|
|
if (!$this->_setHeaderFieldModel('Date', $date))
|
|
{
|
|
$this->getHeaders()->addDateHeader('Date', $date);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the date at which this message was created.
|
|
* @return int
|
|
*/
|
|
public function getDate()
|
|
{
|
|
return $this->_getHeaderFieldModel('Date');
|
|
}
|
|
|
|
/**
|
|
* Set the return-path (the bounce address) of this message.
|
|
* @param string $address
|
|
*/
|
|
public function setReturnPath($address)
|
|
{
|
|
if (!$this->_setHeaderFieldModel('Return-Path', $address))
|
|
{
|
|
$this->getHeaders()->addPathHeader('Return-Path', $address);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the return-path (bounce address) of this message.
|
|
* @return string
|
|
*/
|
|
public function getReturnPath()
|
|
{
|
|
return $this->_getHeaderFieldModel('Return-Path');
|
|
}
|
|
|
|
/**
|
|
* Set the sender of this message.
|
|
* This does not override the From field, but it has a higher significance.
|
|
* @param string $sender
|
|
* @param string $name optional
|
|
*/
|
|
public function setSender($address, $name = null)
|
|
{
|
|
if (!is_array($address) && isset($name))
|
|
{
|
|
$address = array($address => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('Sender', (array) $address))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('Sender', (array) $address);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the sender of this message.
|
|
* @return string
|
|
*/
|
|
public function getSender()
|
|
{
|
|
return $this->_getHeaderFieldModel('Sender');
|
|
}
|
|
|
|
/**
|
|
* Add a From: address to this message.
|
|
*
|
|
* If $name is passed this name will be associated with the address.
|
|
*
|
|
* @param string $address
|
|
* @param string $name optional
|
|
*/
|
|
public function addFrom($address, $name = null)
|
|
{
|
|
$current = $this->getFrom();
|
|
$current[$address] = $name;
|
|
return $this->setFrom($current);
|
|
}
|
|
|
|
/**
|
|
* Set the from address of this message.
|
|
*
|
|
* You may pass an array of addresses if this message is from multiple people.
|
|
*
|
|
* If $name is passed and the first parameter is a string, this name will be
|
|
* associated with the address.
|
|
*
|
|
* @param string $addresses
|
|
* @param string $name optional
|
|
*/
|
|
public function setFrom($addresses, $name = null)
|
|
{
|
|
if (!is_array($addresses) && isset($name))
|
|
{
|
|
$addresses = array($addresses => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('From', (array) $addresses))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('From', (array) $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the from address of this message.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getFrom()
|
|
{
|
|
return $this->_getHeaderFieldModel('From');
|
|
}
|
|
|
|
/**
|
|
* Add a Reply-To: address to this message.
|
|
*
|
|
* If $name is passed this name will be associated with the address.
|
|
*
|
|
* @param string $address
|
|
* @param string $name optional
|
|
*/
|
|
public function addReplyTo($address, $name = null)
|
|
{
|
|
$current = $this->getReplyTo();
|
|
$current[$address] = $name;
|
|
return $this->setReplyTo($current);
|
|
}
|
|
|
|
/**
|
|
* Set the reply-to address of this message.
|
|
*
|
|
* You may pass an array of addresses if replies will go to multiple people.
|
|
*
|
|
* If $name is passed and the first parameter is a string, this name will be
|
|
* associated with the address.
|
|
*
|
|
* @param string $addresses
|
|
* @param string $name optional
|
|
*/
|
|
public function setReplyTo($addresses, $name = null)
|
|
{
|
|
if (!is_array($addresses) && isset($name))
|
|
{
|
|
$addresses = array($addresses => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('Reply-To', (array) $addresses))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('Reply-To', (array) $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the reply-to address of this message.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getReplyTo()
|
|
{
|
|
return $this->_getHeaderFieldModel('Reply-To');
|
|
}
|
|
|
|
/**
|
|
* Add a To: address to this message.
|
|
*
|
|
* If $name is passed this name will be associated with the address.
|
|
*
|
|
* @param string $address
|
|
* @param string $name optional
|
|
*/
|
|
public function addTo($address, $name = null)
|
|
{
|
|
$current = $this->getTo();
|
|
$current[$address] = $name;
|
|
return $this->setTo($current);
|
|
}
|
|
|
|
/**
|
|
* Set the to addresses of this message.
|
|
*
|
|
* If multiple recipients will receive the message and array should be used.
|
|
*
|
|
* If $name is passed and the first parameter is a string, this name will be
|
|
* associated with the address.
|
|
*
|
|
* @param array $addresses
|
|
* @param string $name optional
|
|
*/
|
|
public function setTo($addresses, $name = null)
|
|
{
|
|
if (!is_array($addresses) && isset($name))
|
|
{
|
|
$addresses = array($addresses => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('To', (array) $addresses))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('To', (array) $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the To addresses of this message.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getTo()
|
|
{
|
|
return $this->_getHeaderFieldModel('To');
|
|
}
|
|
|
|
/**
|
|
* Add a Cc: address to this message.
|
|
*
|
|
* If $name is passed this name will be associated with the address.
|
|
*
|
|
* @param string $address
|
|
* @param string $name optional
|
|
*/
|
|
public function addCc($address, $name = null)
|
|
{
|
|
$current = $this->getCc();
|
|
$current[$address] = $name;
|
|
return $this->setCc($current);
|
|
}
|
|
|
|
/**
|
|
* Set the Cc addresses of this message.
|
|
*
|
|
* If $name is passed and the first parameter is a string, this name will be
|
|
* associated with the address.
|
|
*
|
|
* @param array $addresses
|
|
* @param string $name optional
|
|
*/
|
|
public function setCc($addresses, $name = null)
|
|
{
|
|
if (!is_array($addresses) && isset($name))
|
|
{
|
|
$addresses = array($addresses => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('Cc', (array) $addresses))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('Cc', (array) $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the Cc address of this message.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getCc()
|
|
{
|
|
return $this->_getHeaderFieldModel('Cc');
|
|
}
|
|
|
|
/**
|
|
* Add a Bcc: address to this message.
|
|
*
|
|
* If $name is passed this name will be associated with the address.
|
|
*
|
|
* @param string $address
|
|
* @param string $name optional
|
|
*/
|
|
public function addBcc($address, $name = null)
|
|
{
|
|
$current = $this->getBcc();
|
|
$current[$address] = $name;
|
|
return $this->setBcc($current);
|
|
}
|
|
|
|
/**
|
|
* Set the Bcc addresses of this message.
|
|
*
|
|
* If $name is passed and the first parameter is a string, this name will be
|
|
* associated with the address.
|
|
*
|
|
* @param array $addresses
|
|
* @param string $name optional
|
|
*/
|
|
public function setBcc($addresses, $name = null)
|
|
{
|
|
if (!is_array($addresses) && isset($name))
|
|
{
|
|
$addresses = array($addresses => $name);
|
|
}
|
|
|
|
if (!$this->_setHeaderFieldModel('Bcc', (array) $addresses))
|
|
{
|
|
$this->getHeaders()->addMailboxHeader('Bcc', (array) $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the Bcc addresses of this message.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getBcc()
|
|
{
|
|
return $this->_getHeaderFieldModel('Bcc');
|
|
}
|
|
|
|
/**
|
|
* Set the priority of this message.
|
|
* The value is an integer where 1 is the highest priority and 5 is the lowest.
|
|
* @param int $priority
|
|
*/
|
|
public function setPriority($priority)
|
|
{
|
|
$priorityMap = array(
|
|
1 => 'Highest',
|
|
2 => 'High',
|
|
3 => 'Normal',
|
|
4 => 'Low',
|
|
5 => 'Lowest'
|
|
);
|
|
$pMapKeys = array_keys($priorityMap);
|
|
if ($priority > max($pMapKeys))
|
|
{
|
|
$priority = max($pMapKeys);
|
|
}
|
|
elseif ($priority < min($pMapKeys))
|
|
{
|
|
$priority = min($pMapKeys);
|
|
}
|
|
if (!$this->_setHeaderFieldModel('X-Priority',
|
|
sprintf('%d (%s)', $priority, $priorityMap[$priority])))
|
|
{
|
|
$this->getHeaders()->addTextHeader('X-Priority',
|
|
sprintf('%d (%s)', $priority, $priorityMap[$priority]));
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the priority of this message.
|
|
* The returned value is an integer where 1 is the highest priority and 5
|
|
* is the lowest.
|
|
* @return int
|
|
*/
|
|
public function getPriority()
|
|
{
|
|
list($priority) = sscanf($this->_getHeaderFieldModel('X-Priority'),
|
|
'%[1-5]'
|
|
);
|
|
return isset($priority) ? $priority : 3;
|
|
}
|
|
|
|
/**
|
|
* Ask for a delivery receipt from the recipient to be sent to $addresses
|
|
* @param array $addresses
|
|
*/
|
|
public function setReadReceiptTo($addresses)
|
|
{
|
|
if (!$this->_setHeaderFieldModel('Disposition-Notification-To', $addresses))
|
|
{
|
|
$this->getHeaders()
|
|
->addMailboxHeader('Disposition-Notification-To', $addresses);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Get the addresses to which a read-receipt will be sent.
|
|
* @return string
|
|
*/
|
|
public function getReadReceiptTo()
|
|
{
|
|
return $this->_getHeaderFieldModel('Disposition-Notification-To');
|
|
}
|
|
|
|
/**
|
|
* Attach a {@link Swift_Mime_MimeEntity} such as an Attachment or MimePart.
|
|
* @param Swift_Mime_MimeEntity $entity
|
|
*/
|
|
public function attach(Swift_Mime_MimeEntity $entity)
|
|
{
|
|
$this->setChildren(array_merge($this->getChildren(), array($entity)));
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Remove an already attached entity.
|
|
* @param Swift_Mime_MimeEntity $entity
|
|
*/
|
|
public function detach(Swift_Mime_MimeEntity $entity)
|
|
{
|
|
$newChildren = array();
|
|
foreach ($this->getChildren() as $child)
|
|
{
|
|
if ($entity !== $child)
|
|
{
|
|
$newChildren[] = $child;
|
|
}
|
|
}
|
|
$this->setChildren($newChildren);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Attach a {@link Swift_Mime_MimeEntity} and return it's CID source.
|
|
* This method should be used when embedding images or other data in a message.
|
|
* @param Swift_Mime_MimeEntity $entity
|
|
* @return string
|
|
*/
|
|
public function embed(Swift_Mime_MimeEntity $entity)
|
|
{
|
|
$this->attach($entity);
|
|
return 'cid:' . $entity->getId();
|
|
}
|
|
|
|
/**
|
|
* Get this message as a complete string.
|
|
* @return string
|
|
*/
|
|
public function toString()
|
|
{
|
|
if (count($children = $this->getChildren()) > 0 && $this->getBody() != '')
|
|
{
|
|
$this->setChildren(array_merge(array($this->_becomeMimePart()), $children));
|
|
$string = parent::toString();
|
|
$this->setChildren($children);
|
|
}
|
|
else
|
|
{
|
|
$string = parent::toString();
|
|
}
|
|
return $string;
|
|
}
|
|
|
|
/**
|
|
* Returns a string representation of this object.
|
|
*
|
|
* @return string
|
|
*
|
|
* @see toString()
|
|
*/
|
|
public function __toString()
|
|
{
|
|
return $this->toString();
|
|
}
|
|
|
|
/**
|
|
* Write this message to a {@link Swift_InputByteStream}.
|
|
* @param Swift_InputByteStream $is
|
|
*/
|
|
public function toByteStream(Swift_InputByteStream $is)
|
|
{
|
|
if (count($children = $this->getChildren()) > 0 && $this->getBody() != '')
|
|
{
|
|
$this->setChildren(array_merge(array($this->_becomeMimePart()), $children));
|
|
parent::toByteStream($is);
|
|
$this->setChildren($children);
|
|
}
|
|
else
|
|
{
|
|
parent::toByteStream($is);
|
|
}
|
|
}
|
|
|
|
// -- Protected methods
|
|
|
|
/** @see Swift_Mime_SimpleMimeEntity::_getIdField() */
|
|
protected function _getIdField()
|
|
{
|
|
return 'Message-ID';
|
|
}
|
|
|
|
// -- Private methods
|
|
|
|
/** Turn the body of this message into a child of itself if needed */
|
|
private function _becomeMimePart()
|
|
{
|
|
$part = new parent($this->getHeaders()->newInstance(), $this->getEncoder(),
|
|
$this->_getCache(), $this->_userCharset
|
|
);
|
|
$part->setContentType($this->_userContentType);
|
|
$part->setBody($this->getBody());
|
|
$part->setFormat($this->_userFormat);
|
|
$part->setDelSp($this->_userDelSp);
|
|
$part->_setNestingLevel($this->_getTopNestingLevel());
|
|
return $part;
|
|
}
|
|
|
|
/** Get the highest nesting level nested inside this message */
|
|
private function _getTopNestingLevel()
|
|
{
|
|
$highestLevel = $this->getNestingLevel();
|
|
foreach ($this->getChildren() as $child)
|
|
{
|
|
$childLevel = $child->getNestingLevel();
|
|
if ($highestLevel < $childLevel)
|
|
{
|
|
$highestLevel = $childLevel;
|
|
}
|
|
}
|
|
return $highestLevel;
|
|
}
|
|
|
|
}
|