2009-09-29 32 views
14

Plugin thư nhanh chóng của tôi vừa mới phát sinh lỗi vì địa chỉ email mà nó cố gắng gửi không tuân thủ. Vấn đề là - email hợp lệ.lỗi gửi thư nhanh 'Swift_RfcComplianceException' trên một email thực sự hoạt động?

Về cơ bản, tôi không muốn người gửi thư nhanh chóng kiểm tra xem email có hợp lệ hay không mà tôi muốn gửi bất kể. Điều đó có thể không?

đây là mã trong đó có chức năng hiển thị lỗi nhưng tôi không biết nếu những gì tôi sẽ cần phải thay đổi là ở đây hay không (kinda một hack lập trình: |)

//@require 'Swift/Mime/Headers/AbstractHeader.php'; 
//@require 'Swift/Mime/HeaderEncoder.php'; 

/** 
* A Mailbox Address MIME Header for something like From or Sender. 
* @package Swift 
* @subpackage Mime 
* @author Chris Corbyn 
*/ 
class Swift_Mime_Headers_MailboxHeader extends Swift_Mime_Headers_AbstractHeader 
{ 

    /** 
    * The mailboxes used in this Header. 
    * @var string[] 
    * @access private 
    */ 
    private $_mailboxes = array(); 

    /** 
    * Creates a new MailboxHeader with $name. 
    * @param string $name of Header 
    * @param Swift_Mime_HeaderEncoder $encoder 
    */ 
    public function __construct($name, Swift_Mime_HeaderEncoder $encoder) 
    { 
    $this->setFieldName($name); 
    $this->setEncoder($encoder); 
    $this->initializeGrammar(); 
    } 

    /** 
    * Get the type of Header that this instance represents. 
    * @return int 
    * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX 
    * @see TYPE_DATE, TYPE_ID, TYPE_PATH 
    */ 
    public function getFieldType() 
    { 
    return self::TYPE_MAILBOX; 
    } 

    /** 
    * Set the model for the field body. 
    * This method takes a string, or an array of addresses. 
    * @param mixed $model 
    * @throws Swift_RfcComplianceException 
    */ 
    public function setFieldBodyModel($model) 
    { 
    $this->setNameAddresses($model); 
    } 

    /** 
    * Get the model for the field body. 
    * This method returns an associative array like {@link getNameAddresses()} 
    * @return array 
    * @throws Swift_RfcComplianceException 
    */ 
    public function getFieldBodyModel() 
    { 
    return $this->getNameAddresses(); 
    } 

    /** 
    * Set a list of mailboxes to be shown in this Header. 
    * The mailboxes can be a simple array of addresses, or an array of 
    * key=>value pairs where (email => personalName). 
    * Example: 
    * <code> 
    * <?php 
    * //Sets two mailboxes in the Header, one with a personal name 
    * $header->setNameAddresses(array(
    * '[email protected]' => 'Chris Corbyn', 
    * '[email protected]' //No associated personal name 
    * )); 
    * ?> 
    * </code> 
    * @param string|string[] $mailboxes 
    * @throws Swift_RfcComplianceException 
    * @see __construct() 
    * @see setAddresses() 
    * @see setValue() 
    */ 
    public function setNameAddresses($mailboxes) 
    { 
    $this->_mailboxes = $this->normalizeMailboxes((array) $mailboxes); 
    $this->setCachedValue(null); //Clear any cached value 
    } 

    /** 
    * Get the full mailbox list of this Header as an array of valid RFC 2822 strings. 
    * Example: 
    * <code> 
    * <?php 
    * $header = new Swift_Mime_Headers_MailboxHeader('From', 
    * array('[email protected]' => 'Chris Corbyn', 
    * '[email protected]' => 'Mark Corbyn') 
    * ); 
    * print_r($header->getNameAddressStrings()); 
    * // array (
    * // 0 => Chris Corbyn <[email protected]>, 
    * // 1 => Mark Corbyn <[email protected]> 
    * //) 
    * ?> 
    * </code> 
    * @return string[] 
    * @throws Swift_RfcComplianceException 
    * @see getNameAddresses() 
    * @see toString() 
    */ 
    public function getNameAddressStrings() 
    { 
    return $this->_createNameAddressStrings($this->getNameAddresses()); 
    } 

    /** 
    * Get all mailboxes in this Header as key=>value pairs. 
    * The key is the address and the value is the name (or null if none set). 
    * Example: 
    * <code> 
    * <?php 
    * $header = new Swift_Mime_Headers_MailboxHeader('From', 
    * array('[email protected]' => 'Chris Corbyn', 
    * '[email protected]' => 'Mark Corbyn') 
    * ); 
    * print_r($header->getNameAddresses()); 
    * // array (
    * // [email protected] => Chris Corbyn, 
    * // [email protected] => Mark Corbyn 
    * //) 
    * ?> 
    * </code> 
    * @return string[] 
    * @see getAddresses() 
    * @see getNameAddressStrings() 
    */ 
    public function getNameAddresses() 
    { 
    return $this->_mailboxes; 
    } 

    /** 
    * Makes this Header represent a list of plain email addresses with no names. 
    * Example: 
    * <code> 
    * <?php 
    * //Sets three email addresses as the Header data 
    * $header->setAddresses(
    * array('[email protected]', '[email protected]', '[email protected]') 
    * ); 
    * ?> 
    * </code> 
    * @param string[] $addresses 
    * @throws Swift_RfcComplianceException 
    * @see setNameAddresses() 
    * @see setValue() 
    */ 
    public function setAddresses($addresses) 
    { 
    return $this->setNameAddresses(array_values((array) $addresses)); 
    } 

    /** 
    * Get all email addresses in this Header. 
    * @return string[] 
    * @see getNameAddresses() 
    */ 
    public function getAddresses() 
    { 
    return array_keys($this->_mailboxes); 
    } 

    /** 
    * Remove one or more addresses from this Header. 
    * @param string|string[] $addresses 
    */ 
    public function removeAddresses($addresses) 
    { 
    $this->setCachedValue(null); 
    foreach ((array) $addresses as $address) 
    { 
     unset($this->_mailboxes[$address]); 
    } 
    } 

    /** 
    * Get the string value of the body in this Header. 
    * This is not necessarily RFC 2822 compliant since folding white space will 
    * not be added at this stage (see {@link toString()} for that). 
    * @return string 
    * @throws Swift_RfcComplianceException 
    * @see toString() 
    */ 
    public function getFieldBody() 
    { 
    //Compute the string value of the header only if needed 
    if (is_null($this->getCachedValue())) 
    { 
     $this->setCachedValue($this->createMailboxListString($this->_mailboxes)); 
    } 
    return $this->getCachedValue(); 
    } 

    // -- Points of extension 

    /** 
    * Normalizes a user-input list of mailboxes into consistent key=>value pairs. 
    * @param string[] $mailboxes 
    * @return string[] 
    * @access protected 
    */ 
    protected function normalizeMailboxes(array $mailboxes) 
    { 
    $actualMailboxes = array(); 

    foreach ($mailboxes as $key => $value) 
    { 
     if (is_string($key)) //key is email addr 
     { 
     $address = $key; 
     $name = $value; 
     } 
     else 
     { 
     $address = $value; 
     $name = null; 
     } 
     $this->_assertValidAddress($address); 
     $actualMailboxes[$address] = $name; 
    } 

    return $actualMailboxes; 
    } 

    /** 
    * Produces a compliant, formatted display-name based on the string given. 
    * @param string $displayName as displayed 
    * @param boolean $shorten the first line to make remove for header name 
    * @return string 
    * @access protected 
    */ 
    protected function createDisplayNameString($displayName, $shorten = false) 
    { 
    return $this->createPhrase($this, $displayName, 
     $this->getCharset(), $this->getEncoder(), $shorten 
    ); 
    } 

    /** 
    * Creates a string form of all the mailboxes in the passed array. 
    * @param string[] $mailboxes 
    * @return string 
    * @throws Swift_RfcComplianceException 
    * @access protected 
    */ 
    protected function createMailboxListString(array $mailboxes) 
    { 
    return implode(', ', $this->_createNameAddressStrings($mailboxes)); 
    } 

    // -- Private methods 

    /** 
    * Return an array of strings conforming the the name-addr spec of RFC 2822. 
    * @param string[] $mailboxes 
    * @return string[] 
    * @access private 
    */ 
    private function _createNameAddressStrings(array $mailboxes) 
    { 
    $strings = array(); 

    foreach ($mailboxes as $email => $name) 
    { 
     $mailboxStr = $email; 
     if (!is_null($name)) 
     { 
     $nameStr = $this->createDisplayNameString($name, empty($strings)); 
     $mailboxStr = $nameStr . ' <' . $mailboxStr . '>'; 
     } 
     $strings[] = $mailboxStr; 
    } 

    return $strings; 
    } 

    /** 
    * Throws an Exception if the address passed does not comply with RFC 2822. 
    * @param string $address 
    * @throws Exception If invalid. 
    * @access protected 
    */ 
    private function _assertValidAddress($address) 
    { 
    if (!preg_match('/^' . $this->getGrammar('addr-spec') . '$/D', 
     $address)) 
    { 
     throw new Swift_RfcComplianceException(
     'Address in mailbox given [' . $address . 
     '] does not comply with RFC 2822, 3.6.2.' 
     ); 
    } 
    } 

} 

Bất kỳ đề xuất?

lưu ý: swiftmailer đang hoạt động với hầu hết các địa chỉ email.

Trả lời

17

Bỏ qua các bức tranh tổng thể của câu hỏi của bạn, để tắt các lỗi RFC trong này _assertValidAddress thay đổi mã() như thế này:

private function _assertValidAddress($address) 
{ 
    if (!preg_match('/^' . $this->getGrammar('addr-spec') . '$/D', 
    $address)) 
    { 
    //throw new Swift_RfcComplianceException(
    // 'Address in mailbox given [' . $address . 
    // '] does not comply with RFC 2822, 3.6.2.' 
    // ); 
    } 
} 
+5

thần đơn giản. – willdanceforfun

4

Ngoài ra, chỉ để cho bạn biết, trong phiên bản mới nhất, làm tương tự nhưng bạn cần khai báo getDefinition. Đây là phiên bản mới nhất của mã:

private function _assertValidAddress($address){ 
    if (!preg_match('/^' . $this->getGrammar()->getDefinition('addr-spec') . '$/D', 
    $address)) 
    { 
    //throw new Swift_RfcComplianceException(
    // 'Address in mailbox given [' . $address . 
    // '] does not comply with RFC 2822, 3.6.2.' 
    // ); 
    } 
} 

Bạn cũng không thể xóa cuộc gọi cuối cùng nếu gửi email. Xem phần dưới cùng của mã của tôi, nếu cuộc gọi thực sự gửi email, hãy xóa nhận xét hoặc nhận xét chúng nếu bạn muốn bao gồm điều này trong một tệp PHP khác.

<?php 
// Explosiveentertainment.co.uk //halal.cc 
include_once "lib/swift_required.php"; 

/* 
* Create the body of the message (a plain-text and an HTML version). 
* $text is your plain-text email 
* $html is your html version of the email 
* If the reciever is able to view html emails then only the html 
* email will be displayed 
*/ 
$text = "Hi!\nHow are you?\n"; 
$html = <<<EOM 
<html> 
    <head></head> 
    <body> 
    <p>Hi!<br> 
     How are you?<br> 
    </p> 
    </body> 
</html> 
EOM; 


// This is your From email address 
$from = array('[email protected]' => 'Name To Appear'); 
// Email recipients 
$to = array(
    '[email protected]'=>'Destination 1 Name', 
    '[email protected]'=>'Destination 2 Name' 
); 
// Email subject 
$subject = 'Example PHP Email'; 

// Login credentials 
$username = 'yoursendgridusername'; 
$password = 'yourpassword'; 

// Setup Swift mailer parameters 
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587); 
$transport->setUsername($username); 
$transport->setPassword($password); 
$swift = Swift_Mailer::newInstance($transport); 

// Create a message (subject) 
$message = new Swift_Message($subject); 

// attach the body of the email 
$message->setFrom($from); 
$message->setBody($html, 'text/html'); 
$message->setTo($to); 
$message->addPart($text, 'text/plain'); 

// send message 
if ($recipients = $swift->send($message, $failures)) 
{ 
    // This will let us know how many users received this message 
    echo 'Message sent out to '.$recipients.' users'; 
} 
// something went wrong =(
else 
{ 
    echo "Something went wrong - "; 
    print_r($failures); 
} 
Các vấn đề liên quan