I need help to create an Email template. My Email template is in HTML. This template is used to send plain text. My Email template is a HTML table tag.
$mail = new email();
$mail->setMailTemplate('emailVerification',array('email' => $email, 'password' => $password, ));
$mail->sendMail($request->getParameter('email'),sfConfig::get('app_email_verification_subject'));
How can I send a HTML email ?
This is my solution:
$instance = sfContext::getInstance();
sfProjectConfiguration::getActive()->loadHelpers( array("Partial") );
$message = $istanza->getMailer()->compose();
$message->setTo( $emailDest );
$message->setFrom($sender);
ob_start();
include_partial('templateName', array('data' => $dati, 'title' => $title, 'testo' => $testo));
$html = ob_get_contents();
ob_clean();
$message->setBody($html, 'text/html');
$instance->getMailer()->send($message);
Of course, in your global template folder, you'll have to create a file named "_templateName.php" with your email html content.
Related
What is the correct way to generate an email attachment with PhpWord?
I tried multiple ways but I get a corrupt file with size 1kb. If I trigger a download of the file instead, the file is OK.
$fileName = 'file.docx';
$fileAttachment = tempnam(sys_get_temp_dir(), 'PHPWord');
$template->saveAs($fileAttachment);
$contentType = "application/octet-stream";
$notification
->setTemplate("template", $templateParams)
->setSubject($this->_("Email subject"))
->addRecipient("to", $email, $email)
->addAttachment($fileName, $fileAttachment, $contentType);
What am I doing wrong?
Thank you!
You could try to use file_get_contents function to read the contents of the file and then pass it as the second parameter to the addAttachment() method:
$fileAttachmentContent = file_get_contents($fileAttachment);
$notification
->setTemplate("template", $templateParams)
->setSubject($this->_("Email subject"))
->addRecipient("to", $email, $email)
->addAttachment($fileName, $fileAttachmentContent, $contentType);
PHPWord is for generating Word documents, but it does not send mails.
You can combine it with any PHP mailer library. This is a sample on how to do it using SwitfMailer:
<?php
require_once '[...]/phpword/src/PhpWord/Autoloader.php';
require_once '[...]/swiftmailer/lib/swift_required.php';
// create a new document with phpWord
$phpWord = new \PhpOffice\PhpWord\PhpWord();
$section = $phpWord->addSection();
$text = $section->addText("Here your text...");
// Use Swift Mailer to create an attachment object...
$attachment = new Swift_Attachment(
$phpWord->save(),
'file.docx',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
);
// ...and send the email
$transport = Swift_SmtpTransport::newInstance('smtp.yoursmtp.com', 25);
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Here your subject')
->setFrom(['sender#sdomain.net' => 'Sender Name'])
->setTo(['receiver#rdomain.org' => 'Receiver Name'])
->setBody('Here the body message...')
->attach($attachment);
$result = $mailer->send($message);
You can use any other mail library you like. Or even use the PHP mail() function, but is more tricky to set the mail headers properly.
I am usign cakephp 2.x and using Email components to send email.
I am trying to add List-Unsubscribe at headers.
$this->Email->headers = [
'List-Unsubscribe'=>'<mailto:'.$email_from.'?subject=Remove from Mailing List>, <'.$SITEURL.'unsubscribe?em='.$email_to.'>',
'List-Unsubscribe-Post'=>'List-Unsubscribe=One-Click'
];
Now in email source its showing in X-header.
X-List-Unsubscribe: <mailto:clients#example.com?subject=Remove from Mailing List>, <http://example.com/unsubscribe?em=xyz#example.com>
X-List-Unsubscribe-Post: List-Unsubscribe=One-Click
But it's not showing Unsubscribe link with From.
I need List-Unsubscribe in message header to avoid spam email.
When i try to use $this->Email->additionalParams its not showing List-Unsubscribe in email header.
Here is code that i am using
$send_from = $email_from_name . "<" . $email_from . ">";
$this->Email->sendAs = 'both'; // text / html / both
$this->Email->from = $send_from;
$this->Email->replyTo = $email_from;
$this->Email->return = $email_from;
$this->Email->to = $email_to;
$this->Email->delivery = 'smtp';
$this->Email->smtpOptions = ['host'=>$imap_server,'port'=>587,'username'=>$email,'password'=>$password];
$this->Email->subject = $subject;
$this->Email->headers = [
'List-Unsubscribe'=>'<mailto:'.$email_from.'?subject=Remove from Mailing List>, <'.SITEURL.'unsubscribe?em='.$email_to.'>',
'List-Unsubscribe-Post'=>'List-Unsubscribe=One-Click' ];
$this->Email->textMessage = $this->_html_to_text($content);
//$this->Email->delivery = 'debug';
$this->Email->send($content);
The email component doesn't support custom non X-prefixed headers, if you need that you'll have to use CakeEmail, which by default doesn't prefix headers, and requires you to explicitly pass prefixed headers in case required.
Given that the email component is long deprecated, ever since the first release of CakePHP 2 to be specific, now is probably a good time for you to finally drop it.
Quick and dirty example:
App::uses('CakeEmail', 'Network/Email');
// The transport/connection configuration should probably better be moved into a config file
$Email = new CakeEmail(array(
'transport' => 'Smtp',
'host' => $imap_server,
'port' => 587,
'username' => $email,
'password' => $password
));
$Email
->emailFormat('both')
->template('subscribe')
->from($send_from)
->replyTo($email_from)
->returnPath($email_from)
->to($email_to)
->subject($subject)
->addHeaders(array(
'List-Unsubscribe' =>
'<mailto:' . $email_from . '?subject=Remove from Mailing List>, ' .
'<' . $SITEURL . 'unsubscribe?em=' . $email_to . '>',
'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click'
))
->send($content);
This would require two templates, one for HTML in app/View/Emails/html/subscribe.ctp:
<?php
// $content contains the data passed to the `send()` method, wrapped to max 998 chars per line
echo $content;
and one for text in app/View/Emails/text/subscribe.ctp, requiring you to move the HTML to text conversion into the template. You should probably make it a helper, the following should just illustrate the principle:
<?php
echo _html_to_text($content);
See also
Cookbook > Core Libraries > Utilities > CakeEmail > Configuration
Cookbook > Core Libraries > Utilities > CakeEmail > Sending templated emails
i just ran into a problem, when sending mails with attachments larger than about 2.5Mb from a server. Sending emails with smaller attachments work, but as soon the critical size of about 2 or 2.5Mb is reached, the mail is not send anymore.
The PDF files and merged target PDF are created without problem, no matter of the size. But only smaller PDF files are send by mail. Not even an empty mail is send, when the attachments are too large.
The process is a follows:
1) The php script creates several PDF files.
2) Those files are merged through gs
$finCmd = 'gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='.$pathDest.$pdfFilename.' input1.pdf input2.pdf input3.pdf';
// Create PDF
$execResult = exec($finCmd);
3) The email body is created
protected function setBodyHtmlpart($content, $pdfFilepath = null, $pdfFilename = null) {
$content="<p><span style='font-size:10.0pt;font-family:\"Arial\",\"sans-serif\";color:black;'>".$content.'</span></p>';
$html = new MimePart($content.$this->getSignature());
$html->type = "text/html";
$body = new MimeMessage();
if ($pdfFilename != '') {
$pdfAttach = new MimePart(file_get_contents($pdfFilepath.$pdfFilename));
$pdfAttach->type = 'application/pdf';
$pdfAttach->filename = $pdfFilename;
$pdfAttach->encoding = \Zend\Mime\Mime::ENCODING_BASE64;
$pdfAttach->disposition = \Zend\Mime\Mime::DISPOSITION_ATTACHMENT;
$body->setParts(array($html, $pdfAttach));
} else {
$body->setParts(array($html));
}
return $body;
}
4) The email is send with:
protected function send($fromAddress, $fromName, $toAddress, $toName, $subject, $bodyParts)
{
// setup SMTP options
$options = new SmtpOptions(array(
'name' => 'XServer',
'host' => 'xServer',
'port' => 25,
'connection_class' => 'plain',
'connection_config' => array(
'username' => 'Xusername',
'password' => 'Xpassword',
),
));
$mail = new Message();
$mail->setBody($bodyParts);
$mail->setFrom($fromAddress, $fromName);
$mail->setTo($toAddress, $toName);
$mail->setSubject($subject);
$transport = new SmtpTransport($options);
$transport->send($mail);
}
Any hints are welcome, as i am totaly lost.
I thought there could be race problem: exec is not finished, but script already tries to send the mail and cancels. But i than would at least receive an empty email.
Edit:
Changing then Mime\Mime::ENCODING_BASE64 delivers the mails, but PDF files are corrupted.
Have you tried using type Octetstream
$pdfAttach->type = Mime::TYPE_OCTETSTREAM;
$pdfAttach->encoding = Mime::ENCODING_BASE64;
It seems like, that the issue is the mime encoding.
All options:
Zend_Mime::ENCODING_7BIT: '7bit' --> corrupted file
Zend_Mime::ENCODING_8BIT: '8bit'; --> corrupted file
Zend_Mime::ENCODING_QUOTEDPRINTABLE: 'quoted-printable' --> corrupted
file
Zend_Mime::ENCODING_BASE64: 'base64' --> file not send
did not work.
Developed a solution with PHPMailer.
Worked out.
I have a problem with PHPMailer. It seems that i have customers that do no receive the attachment in their outlook box. Below is the code i am using. I tested it at my private gmail where the attachment is visible.
Could it be because i am using a stringAttachment instead of a real file?
$mail = new SMail();
$mail->SetFrom('administratie#domain.nl', 'Domain b.v.');
$mail->AddAddress($invoice->SAddress()->email);
$mail->Subject = 'Factuur ' . $invoice->getReferenceNumber();
$mail->AddStringAttachment($this->getAction($invoice->invoiceId, null, 'S'), $invoice->getReferenceNumber() . '.pdf', 'base64', 'application/pdf');
$this->objTemplate->assign(array(
'title' => 'Uw factuur',
'referenceNumber' => $invoice->getReferenceNumber(),
));
$mail->MsgHTML($this->objTemplate->render('mail/invoice.tpl', false, true));
The problem was the fact that outlook blocked the inline image content on which also the attachment broke somehow.
I'm creating a CSV on the fly with PHP, I then need to attach this CSV file to the the Swift Mailer Message. I have tried using file_get_content on the created file aswell as using chunk_split(base64_encode(file_get_contents()) on the created file aswell as attaching the file before writing it to disk. Without writing to disk I get Rescource #183 in the CSV, with attaching it with file_get_content I get just a string in each row of the CSV file, anyone know what I'm doing wrong?
if(!file_exists(_PS_ORDERS_DIR_.$orderDate.'/'.$file_name.'.csv'))
{
if($file = fopen (_PS_ORDERS_DIR_.$orderDate.'/'.$file_name.'.csv', 'x+'))
{
foreach ($list as $fields)
{
fputcsv($file, $fields);
}
$attachment['mime'] = 'application/vnd.ms-excel';
$attachment['content'] = file_get_contents($file);
$attachment['name'] = $order.'order';
EDIT
Mail::Send(1, 'order_conf', 'Order CSV Attachment', $success, 'test#email.com', Address, NULL, NULL, $attachment); // attach and send
}
}
Attaching a file into a swift mailer:
$swift =& new Swift(new Swift_Connection_SMTP(MAIL_SMTP_URL, MAIL_SMTP_PORT));
$message =& new Swift_Message($subject);
$recpients =& new Swift_RecipientList();
$sender =& new Swift_Address('info#example.com', 'example.com');
$recpients->addTo('info#example.com', 'www.example.com');
$message->attach(new Swift_Message_Part('this is my body'));
$message->attach(new Swift_Message_Attachment($binarycontents, $fileTitle, $mimeType));
$swift->send($message, $recpients, $sender);
in your case the attaching would be:
$message->attach(new Swift_Message_Attachment(file_get_contents($file), $order.'order.csv', 'application/vnd.ms-excel'));
just for example ofcourse :)
//to set headers of csv file(first row)
$content = "user_id,first_name,last_name,phone,gender,pan_number\r\n";
//this can be dynamic data from database or from anywhere can loop this for multiple rows
$content .= "1,test_fn,test_ln,8888999900,M,ASDD3333\r\n";
//include swiftmailer library in order to run the below code
Yii::$app->mailer->compose()
->setFrom(array('test#test.com'=>'test'))
->setTo('testto#testto.com')
->setSubject('your subject' )
->setHtmlBody('<table><tr><td>your email body message here</td></tr> </table>')
->attachContent($content, ['fileName' => 'user.csv', 'contentType' => 'application/vnd.ms-excel'])->send();