2009-09-29 11 views
14

Il mio plugin di mailing rapido ha appena generato un errore perché un indirizzo email che ha provato a inviare non è conforme. Il problema è che l'e-mail è valida.errore di mailing veloce 'Swift_RfcComplianceException' su un'email che funziona davvero?

Fondamentalmente, non voglio che il mailer veloce controlli se l'e-mail sia valida. Mi piacerebbe inviarlo a prescindere. È possibile?

ecco il codice che ha la funzione che visualizza l'errore, ma non so se quello che avrei bisogno di cambiare è qui o no (kinda un programmatore mod: |)

//@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.' 
     ); 
    } 
    } 

} 

Qualsiasi suggerimenti?

nota: swiftmailer funziona per la maggior parte degli indirizzi e-mail.

risposta

17

Ignorando il quadro generale della sua domanda, per spegnere l'errore RFC in questo cambiamento di codice _assertValidAddress() in questo modo:

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

dio che era semplice. – willdanceforfun

4

Inoltre, proprio per farvi sapere, nella versione ultima, fare lo stesso ma è necessario dichiarare getDefinition. Questa è l'ultima versione del codice:

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.' 
    // ); 
    } 
} 

Inoltre, non è possibile rimuovere l'ultima chiamata se inviare l'e-mail. Vedere la parte inferiore del mio codice, la chiamata if in realtà invia l'e-mail, rimuovere i commenti o commentarli se si desidera includere questo all'interno di un altro file PHP.

<?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); 
} 
Problemi correlati