如何生成确认电子邮件(替换模板中的值,制作html和txt版本并确认)?

时间:2013-12-23 16:28:13

标签: php codeigniter email templates

编辑 在盯着文档再过一小时后,我想我终于意识到我需要调整的内容以及如何调整。我明天会更新这个问题( * EDIT2 * 25日,今天必须照顾我的家人。但我已经完成了大部分功能;),很有可能完全解决了我的问题。问题;)

我知道我要求很多,但我认为把所有东西放在一个地方而不是开始多个问题会更好。我正在尝试将此tutorial实施到我的CI项目中。在邮件确认部分之前一切都很好。在教程中他们使用Swift Mailer,但我想坚持使用CI的邮件助手。

问题在于代码有点复杂,因为使用了模板和确认链接本身。我的代码的当前状态如下,以及每个部分的简短摘要。我不是要求你立即回答所有问题,只是给我一些指示,我会慢慢实施它们,并希望在本周末我们能够开始工作。

HTML模板 * mamp / htdocs / assets / templates / signup_template.html *

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body style="margin: 0; padding: 0;">
    <table border="0" cellpadding="0" cellspacing="0" width="100%"> 
        <tr>
            <td>
                Hello {USERNAME}, please click on the link below to finish the registration process
            </td>
        </tr>
            <td>
                Link: {SITEPATH}{KEY}
            </td>
        <tr>
            <td>
            </td>
        </tr>

    </table>
</body>
</html>

我认为HTML模板应该是这样的?我认为站点路径应该是这样的base_url('controller/method/'),以便密钥作为参数发送到我的函数,完成注册。

TXT模板 * mamp / htdocs / assets / templates / signup_template.txt *

//I have 0 clue how this file should look like

但是当接收者的电子邮件客户端不支持HTML电子邮件时,将使用ts。

控制器

$info = array(
    'name' => $name,
    'email' => $email,
    'confkey' => $confkey
);
if ($this->User_m->sendMail($info) == 'error') {
    //error reporting               
    $data['msg'] = "Something wen't wrong";
    $this->load->view('registration_v',$data);
} else {
    $this->load->view('success_v');
}

我明白了。 :D $info包含名称&amp;来自我的表单的电子邮件输入,$confkey保存我用于验证的唯一密钥。然后发送电子邮件,如果有错误报告,或者我加载了success_v视图。

模型

private function format_email($info, $format){

    //set the root
    $root = base_url() . 'assets/templates/;  //Modified for CI

    //I am not sure if I can just keep this code or should also modify it
    //grab the template content
    $template = file_get_contents($root.'/signup_template.'.$format);

    //replace all the tags
    $template = ereg_replace('{USERNAME}', $info['name'], $template);
    $template = ereg_replace('{KEY}', $info['confkey'], $template);
    $template = ereg_replace('{SITEPATH}','http://site-path.com', $template);

    //return the html of the template
    return $template;

}

sendMail函数中调用此函数,以生成实际电子邮件的两个实体。该函数查找模板并将{}内的值替换为参数中提供的值。问题是我不知道替换部分是否适用于CI。

 public function sendMail($info){
    //loading the CI's mail helper
    $ci = get_instance();
$ci->load->helper('mail');  
    //format each email
    $body = this->format_email($info,'html'); //Modified for CI
    $body_plain_txt = this->format_email($info,'txt'); //Modified for CI

    //setup the mailer
    //This is what I need to rewrite for CI's mail helper
    $transport = Swift_MailTransport::newInstance();
    $mailer = Swift_Mailer::newInstance($transport);
    $message = Swift_Message::newInstance();
    $message ->setSubject('Welcome to Site Name');
    $message ->setFrom(array('noreply@sitename.com<script type="text/javascript">
/* <![CDATA[ */
(function(){try{var s,a,i,j,r,c,l,b=document.getElementsByTagName("script");l=b[b.length-1].previousSibling;a=l.getAttribute('data-cfemail');if(a){s='';r=parseInt(a.substr(0,2),16);for(j=2;a.length-j;j+=2){c=parseInt(a.substr(j,2),16)^r;s+=String.fromCharCode(c);}s=document.createTextNode(s);l.parentNode.replaceChild(s,l);}}catch(e){}})();
/* ]]> */
</script>' => 'Site Name'));
    $message ->setTo(array($info['email'] => $info['username']));

    $message ->setBody($body_plain_txt);
    $message ->addPart($body, 'text/html');

    $result = $mailer->send($message);

    return $result;

}

最后实际发送电子邮件的功能。我试图将我认为理解的内容重写为CI的语法,但实际的电子邮件创建没有受到影响。如果你能告诉我如何将这个函数重写为CI的邮件助手语法,那就太棒了。

感谢大家阅读和回复。如果您需要任何其他信息,请直接询问。还有,圣诞快乐!

1 个答案:

答案 0 :(得分:0)

休息一下,开始阅读此页面:http://ellislab.com/codeigniter/user-guide/libraries/email.html

使用codeigniter发送电子邮件非常简单,您的控制器可能看起来像这样

public function sendEmail() {
$this->load->library('email');

$this->email->from('your@example.com', 'Your Name');
$this->email->to('someone@example.com'); 
$this->email->cc('another@another-example.com'); 
$this->email->bcc('them@their-example.com'); 

$this->email->subject('Email Test');
$this->email->message('Testing the email class.');  

$this->email->send();
}

然后,如果您想要替换视图上的值,请使用$ data将数据解析为视图,如您在此处所做的那样:

$data['msg'] = "Something wen't wrong";
    $this->load->view('registration_v',$data);

在这个例子中,只需在registration_v上回显$ msg - 您可以将其输入电子邮件地址或其他值。

希望这会对你有帮助。