2013-06-12 28 views
6

Jak wysłać wiadomość e-mail z tekstem/zwykłym tekstem/html i dołączyć do zf2? używam tego kodu, aby wysłać e-mail z SMTP:wyślij wiadomość e-mail z załączonymi plikami w ZF2

$files = $this->params()->fromFiles(); 
$smtp = new \Zend\Mail\Transport\Smtp(); 
$smtp->setAutoDisconnect(true); 
$optn = new \Zend\Mail\Transport\SmtpOptions(array(
    'host'    => 'mail.myserver.com', 
    'connection_class' => 'login', 
    'connection_config' => array(
     'username' => '[email protected]', 
     'password' => 'mypassword', 
    ), 
)); 
$smtp->setOptions($optn); 


$htmlPart = new \Zend\Mime\Part('<p>some html</p>'); 
$htmlPart->type = Mime::TYPE_HTML; 

$textPart = new \Zend\Mime\Part('some text'); 
$textPart->type = Mime::TYPE_TEXT; 

$i=0; 
$attaches = array(); 
foreach($files as $file){ 
    if ($file['error']) 
     continue; 
    $attaches[$i] = new \Zend\Mime\Part(file_get_contents($file['tmp_name'])); 
    $attaches[$i]->type = $file['type'].'; name="'.$file['name'].'"'; 
    $attaches[$i]->encoding = 'base64'; 
    $attaches[$i]->disposition = 'attachment'; 
    $attaches[$i]->filename = $file['name']; 
    $i++; 
} 

$parts = array(); 
if (count($attaches)>0) { 
    $parts = array_merge(array($textPart,$htmlPart),$attaches); 
    $type = Mime::MULTIPART_MIXED; 
} 
else{ 
    $parts = array($textPart, $htmlPart); 
    $type = Mime::MULTIPART_ALTERNATIVE ; 
} 
$body = new \Zend\Mime\Message(); 
$body->setParts($parts); 

$message = new \Zend\Mail\Message(); 
$message->setFrom('[email protected]'); 
$message->addTo('[email protected]'); 
$message->setSubject('subject'); 
$message->setEncoding("UTF-8"); 
$message->setBody($body); 
$message->getHeaders()->get('content-type')->setType($type); 

$smtp->send($message); 

Gdybym dołączać pliki, wysyła pliki i zawartość, ale to pokazuje zwykły i HTML tekst razem odbiornik skrzynki:

<p>some html</p> 
some text 

kiedy don nie załącza żadnych plików, wyświetla tekst w html pojedynczo:

some html 

Każda pomoc?

Odpowiedz

12

Obecnie nie ma łatwego sposobu na ZF2 (2.2) do łączenia wieloczęściowy/alternatywnej ciało (HTML z tekstu alternatywa dla klientów, którzy nie mogą/nie-do-w ant-to use html) z załącznikami. Po dodaniu nagłówka treści typu "wieloczęściowy/alternatywny" do całej wiadomości, w niektórych klientach poczty e-mail załącznik (łącze) nie będzie wyświetlany.

Rozwiązaniem jest podzielona wiadomość na dwie części, ciało (tekst i html) i przywiązanie:

http://jw-dev.blogspot.com.es/2013/01/zf2-zend-mail-multipartalternative-and.html

przykład:

 $content = new MimeMessage(); 
     $htmlPart = new MimePart("<html><body><p>Sorry,</p><p>I'm going to be late today!</p></body></html>"); 
     $htmlPart->type = 'text/html'; 
     $textPart = new MimePart("Sorry, I'm going to be late today!"); 
     $textPart->type = 'text/plain'; 
     $content->setParts(array($textPart, $htmlPart)); 

     $contentPart = new MimePart($content->generateMessage());   
     $contentPart->type = 'multipart/alternative;' . PHP_EOL . ' boundary="' . $content->getMime()->boundary() . '"'; 

     $attachment = new MimePart(fopen('/path/to/test.pdf', 'r')); 
     $attachment->type = 'application/pdf'; 
     $attachment->encoding = Mime::ENCODING_BASE64; 
     $attachment->disposition = Mime::DISPOSITION_ATTACHMENT; 

     $body = new MimeMessage(); 
     $body->setParts(array($contentPart, $attachment)); 

     $message = new Message(); 
     $message->setEncoding('utf-8') 
     ->addTo('[email protected]') 
     ->addFrom('[email protected]') 
     ->setSubject('will be late') 
     ->setBody($body); 

     $transport = new SmtpTransport(); 
     $options = new SmtpOptions($transportConfig), 
     )); 

     $transport->setOptions($options); 
     $transport->send($message); 

Dla powyższego ciebie musiałyby następujące oświadczenia użycia:

use Zend\Mail\Message; 
use Zend\Mail\Transport\Smtp as SmtpTransport; 
use Zend\Mail\Transport\SmtpOptions; 
use Zend\Mime\Mime; 
use Zend\Mime\Part as MimePart; 
use Zend\Mime\Message as MimeMessage; 

ZF1 miał _buildBody() metoda w Zend_Mail_Transport_Abstract, która zrobiła to automatycznie.

+0

dzięki. ale kiedy wysyłam wiadomość e-mail na adres gmail z tym kodem, gmail wyświetla tekst/zwykły tekst na stronie e-mail. –

+0

Tak, też to zauważyłem. W jakiś sposób preferowana alternatywa powinna być ostatnia w tablicy. Edytowałem odpowiedź. – tihe

+0

@ Czy mógłbyś podać metodę wysyłania wielu załączników? – GBRocks

0

Ustaw typ od:

$attaches[$i]->type = $file['type'].'; name="'.$file['name'].'"'; 

Do:

$attaches[$i]->type = \Zend\Mime\Mime::TYPE_OCTETSTREAM; 

Będziesz także chcą, aby potwierdzić, że w przypadku korzystania z usługi SMTP, że pozwalają one załączniki poprzez protokół.

-3

E-mail z załącznikami

$mail = new Zend\Mail\Message(); 
// build message... 
$mail->createAttachment($someBinaryString); 
$mail->createAttachment($myImage, 
         'image/gif', 
         Zend\Mime\Mime::DISPOSITION_INLINE, 
         Zend\Mime\Mime::ENCODING_BASE64); 

Jeśli chcesz mieć większą kontrolę nad częścią MIME wygenerowaną dla tego załącznika możesz użyć wartości zwracanej createAttachment(), aby zmodyfikować jego atrybuty. Sposób createAttachment() zwraca się obiekt Zend \ mim \ Part:

$mail = new Zend\Mail\Message(); 

$at = $mail->createAttachment($myImage); 
$at->type  = 'image/gif'; 
$at->disposition = Zend\Mime\Mime::DISPOSITION_INLINE; 
$at->encoding = Zend\Mime\Mime::ENCODING_BASE64; 
$at->filename = 'test.gif'; 

$mail->send(); 

Alternatywą jest stworzenie wystąpienie Zend \ Pantomimy \ części i dodać go addAttachment():

$mail = new Zend\Mail\Message(); 

$at = new Zend\Mime\Part($myImage); 
$at->type  = 'image/gif'; 
$at->disposition = Zend\Mime\Mime::DISPOSITION_INLINE; 
$at->encoding = Zend\Mime\Mime::ENCODING_BASE64; 
$at->filename = 'test.gif'; 

$mail->addAttachment($at); 

$mail->send(); 

Reference1 Reference2 Reference3

+1

metoda createAttachment nie istnieje. –

+0

http://framework.zend.com/manual/2.0/en/modules/zend.mail.attachments.html – Developer

+0

@MohamadMehdiHabibi musisz spojrzeć na powyższy link. Nie zostawiaj negatywnej opinii na nic. – Developer

1

Znalazłem to lepsze rozwiązanie, więc piszę to.

Namespace YourNamesapace; 

use Zend\Mail\Message as ZendMessage; 
use Zend\Mime\Part as MimePart; 
use Zend\Mime\Message as MimeMessage; 
use Zend\Mail\Transport\Sendmail; 
class Testmail 
{ 
    public static function sendMailWithAttachment($to, $subject, $htmlMsg, $dir, $fileName) 
    { 
     $fileFullPath = $dir . '/' . $fileName; 
     // Render content from template 
     $htmlContent = $htmlMsg; 
     // Create HTML part 
     $htmlPart = new MimePart($htmlContent); 
     $htmlPart->type = "text/html"; 
     // Create plain text part 
     $stripTagsFilter = new \Zend\Filter\StripTags(); 
     $textContent = str_ireplace(array("<br />", "<br>"), "\r\n", $htmlContent); 
     $textContent = $stripTagsFilter->filter($textContent); 
     $textPart = new MimePart($textContent); 
     $textPart->type = "text/plain"; 

     // Create separate alternative parts object 
     $alternatives = new MimeMessage(); 
     $alternatives->setParts(array($textPart, $htmlPart)); 
     $alternativesPart = new MimePart($alternatives->generateMessage()); 
     $alternativesPart->type = "multipart/alternative;\n boundary=\"".$alternatives->getMime()->boundary()."\""; 

     $body = new MimeMessage(); 
     $body->addPart($alternativesPart); 


     $attachment = new MimePart(file_get_contents($fileFullPath)); 
     $attachment->type = \Zend\Mime\Mime::TYPE_OCTETSTREAM; 
     $attachment->filename = basename($fileName); 
     $attachment->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT; 
     $attachment->encoding = \Zend\Mime\Mime::ENCODING_BASE64; 
     $body->addPart($attachment); 
     // Create mail message 
     $mailMessage = new ZendMessage(); 
     $mailMessage->setFrom('[email protected]', 'from Name'); 
     $mailMessage->setTo($to); 
     $mailMessage->setSubject($subject); 
     $mailMessage->setBody($body); 
     $mailMessage->setEncoding("UTF-8"); 
     $mailMessage->getHeaders()->get('content-type')->setType('multipart/mixed'); 
     $transport = new Sendmail(); 
     $transport->send($mailMessage); 
    } 
} 

referencyjny: http://resoftsol.com/sending-e-mail-with-alternative-parts-plus-attachments/