且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

菜鸟学编程:给TeamToy添加一键发送周报至领导邮箱的功能

更新时间:2022-06-15 02:23:37

在偷懒了一个多月之后,俺终于开始正式做TeamToy的邮件提醒系统啦! 

最初的想法是,做一个自动脚本,让其每个周五下班的时候将“本周报告”发送到自己的和领导的邮箱当中;不过在研究了半天之后,发现比预想的要复杂,决定先从手动版开始。在各种搜索资料、偷懒、询问Easy大和求助不乖师父之后,终于实现了最初设想“自动发送报告为邮件”的“发送报告为邮件”功能了!(当然言下之意就是“自动”的部分还没实现……这个再说吧)

目的:在“报告”页面中添加一个按钮,点击之后,自动将当前显示的报告(div#report_list)部分内容发送到指定邮箱。

Hacking步骤:

1、先自行读一遍SAE中的邮件函数,SAEmail相关的文档:

http://apidoc.sinaapp.com/sae/SaeMail.html 

2、发送邮件属于基础功能,在TeamToy当中都写在 /code/function/core.function.php 当中。从hacking的思路而言,总是要先看看有没有现成发送邮件的函数,所以先在core.function.php当中搜索 SAEmail 字段(当然你也可以在全部文档中搜索),找到了一个 send_notice 函数。

读了一下这个函数,发现跟咱要的功能相差太多,所以决定新加一个函数。

在下面新起一个:

function just_send_email( $to, $subject, $content )
{
    $to = $to;
     $subject = $subject;
     $content = $content;

     if( c('smtp') )
     {
          $m = new SaeMail();
          $m->quickSend( $to , $subject , strip_tags($content) , c('smtp_user') , c('smtp_password') );

          if ($m === false)
        var_dump($mail->errno(), $mail->errmsg());
     }
    
}

3、进入 /code/mod/report.class.php ,在下面添加一个函数:

     function mailreport()
     {
          /*这些变量可以先随便填几个string做测试,逐渐再把功能加入*/
          $to = 'some@mail.com';
          $subject = z(t(v('subject')));
          $content = t(v('content'));
          just_send_email( $to, $subject, $content );
          return render( $content , 'mail' );
     }

上面最后return的内容是方便让人做测试的。render的定义通过搜索 function render 可以定位到core.function.php,是给输出的内容套套子用的,TeamToy默认只提供了default和ajax两种模板,对邮件内容而言都太臃肿了,所以咱新建一个mail模板:

在 /code/view/layout/ 下面新建一个文件夹 mail ,在 mail下建一个文件 index.tpl.html ,里面的内容写这个就行:

<?=$data?>

回头可以再加点css,现在先这么放着就行。

4、进入 /code/view/layout/default/main/report/index.tpl.html ,加入触发函数的入口。

研究这部分花了我很多时间,总算是七零八碎拼出来了一个解决办法。

首先自然是在页面里加一个入口,我写在了原页面“打印”功能的右边:

<a href="javascript:do_print('report_list')">打印</a> | <a href="?m=report&a=mailreport">发送邮件</a>

之后的问题,就是如何将这个页面里div#report_list的内容传递到发送邮件的php函数当中去的问题。

(写到这里,发现左边的javascript:do_print('report_list')已经是现成的内容抓取实现,如果能设法用类似的功能传值,或者用JavaScript直接发送邮件出去,就不用我下面的这个实现了。)

从js传值到php需要动用ajax的方式。TeamToy采用的js库是mootools,与传值有关的文档可在这里查看:

http://mootools.net/docs/core/Request/Request

当然,我这种菜鸟看了一遍文档之后还是没看懂,所以搜了一个demo出来:

http://www.knowledgesutra.com/forums/topic/64355-mootools-12-ajax-request/

简单来说,最后的实现就是:

先在页首添加一段js:

<script language="javascript">
     window.addEvent('domready', function() {
 
          $('runAjax').addEvent('click', function(event) {
                  event.stop();
                  var req = new Request({
                          method: 'post',
                          url: $('runAjax').get('href'),
                          data: { 'content' : $('report_list').get('html'), 'subject' : $('report_subject').get('html') },
                          onRequest: function() {  },
                          onComplete: function(response) { alert('mail sent:' + response); }
                  }).send();
$('runAjax').removeEvent('click');
          });
  });
</script>

然后在刚才写的那个“发送邮件”功能上,修改成这样:

<a id='runAjax' href="?m=report&a=mailreport">发送邮件</a>

再就是report_subject这个id原本是没有的,咱给它加上:

<h4 id="report_subject">    
<?php
$uid = intval(v('uid'));
if( $uid < 1): ?>
<?=c('team_name')?>     
……

 

ok,commit上去试试看吧!

最后就是一些css的调整,以及收信人的设置,这个就不用我多写啦。

通过Ajax的方式来发送邮件的问题就在于——无法自动发送-。-

所以自动发送要如何弄,俺还要再多想想……


     本文转自shenleigang 51CTO博客,原文链接:http://blog.51cto.com/lazycai/795793,如需转载请自行联系原作者