在ZF2中发送带有附件的电子邮件


send email with attached files in ZF2

如何发送电子邮件与文本/纯,文本/html和附件在zf2 ?我使用以下代码通过smtp发送电子邮件:

$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' => 'user@myserver.com',
        '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('user@myserver.com');
$message->addTo('receiver@myserver.com');
$message->setSubject('subject');
$message->setEncoding("UTF-8");
$message->setBody($body);
$message->getHeaders()->get('content-type')->setType($type);
$smtp->send($message);

如果我附加文件,它会发送文件和内容,但它会在接收者收件箱中同时显示纯文本和html文本:

<p>some html</p>
some text

当我没有附加任何文件时,它会单独显示html文本:

some html

帮忙吗?

目前,在ZF2(2.2)中没有简单的方法将多部分/替代正文(html和文本替代,用于不能/不想使用html的客户端)与附件结合起来。如果你在整个邮件中添加了'multipart/alternative'内容类型的标题,在一些电子邮件客户端中,附件(链接)将不会显示。

解决方案是将消息分成两部分,正文(文本和html)和附件:

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

一个例子:

        $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('mywife@home.com')
        ->addFrom('myself@office.com')
        ->setSubject('will be late')
        ->setBody($body);
        $transport = new SmtpTransport();
        $options   = new SmtpOptions($transportConfig),
        ));
        $transport->setOptions($options);
        $transport->send($message);
对于上述情况,您需要以下使用语句:

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在Zend_Mail_Transport_Abstract中有一个自动执行此操作的_buildBody()方法

我已经找到了一个更好的解决方案,所以我正在写它。

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('noreply@example.com', '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);
    }
}

设置字体:

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

:

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

您还需要确认,如果您使用的是SMTP服务,它们是否允许通过协议发送附件。

电子邮件附件

$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);

如果您希望对为该附件生成的MIME部分有更多的控制,您可以使用createAttachment()的返回值来修改其属性。createAttachment()方法返回一个Zend'Mime'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();

另一种方法是创建一个Zend'Mime'Part的实例,并使用addatattachment ():

$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();

Reference1Reference2Reference3