web端发邮件通常是怎么做的?独立线程?Cron Job?

22 views
Skip to first unread message

realfun

unread,
Aug 31, 2008, 3:00:52 AM8/31/08
to pyth...@googlegroups.com
我发现发邮件过程比较慢,有时候用户添加一个评论,需要发邮件到被评论者邮箱和订阅者邮箱,很占时间。
实际上除了注册、密码找回等等操作,这些
是在收到request以后开一个独立线程呢,还是用Cron Job好?

我正在试Cron Job,shared host上面搞这个很麻烦。

BTW:
发邮件的函数本地怎么测呢?同样的代码本地发邮件不会成功的。
我现在每次都辛苦的上传到server上再试,开发效率太低。

--
代码发芽网: http://www.fayaa.com/code/ (无需插件支持blog代码高亮,100+种语言,30+种高亮主题)
我的Blog: 半瓶墨水(http://www.2maomao.com/blog)

realfun

unread,
Aug 31, 2008, 3:06:02 AM8/31/08
to pyth...@googlegroups.com
(日,没写完不小心就发了...)
实际上除了注册、密码找回等操作,其他时候发邮件并不需要synchronize方式,甚至邮件丢失都没有事,不用异步反而会导致反应速度降低,甚至因为邮件服务器的错误而显示出错信息。
比如,本来用户只是添加了一条评论,他(她)并不在乎是否有邮件发出,所以评论成功,就可以返回了。至于发邮件成没成功,跟评论成功应该无关,只跟"邮件通知被评论者和订阅者"这个功能有关。而这个功能对成功与否的要求不是那么严格。

2008/8/31 realfun <rea...@gmail.com>

@@

unread,
Aug 31, 2008, 3:12:52 AM8/31/08
to pyth...@googlegroups.com
没觉得发邮件会很慢啊?

怕出错catch 一下好了

2008/8/31 realfun <rea...@gmail.com>

Leo Jay

unread,
Aug 31, 2008, 3:15:46 AM8/31/08
to pyth...@googlegroups.com
2008/8/31 realfun <rea...@gmail.com>:

> 我发现发邮件过程比较慢,有时候用户添加一个评论,需要发邮件到被评论者邮箱和订阅者邮箱,很占时间。
> 实际上除了注册、密码找回等等操作,这些
> 是在收到request以后开一个独立线程呢,还是用Cron Job好?
>
> 我正在试Cron Job,shared host上面搞这个很麻烦。
>

shared host里的cron,最多只让你半个小时起来一次吧?这速度也太慢了点。
我认为应该是做一个独立的线程比较好。如果可能的话,我会做成独立的进程。这样修改代码的时候,其它的服务不会被影响。

> BTW:
> 发邮件的函数本地怎么测呢?同样的代码本地发邮件不会成功的。
> 我现在每次都辛苦的上传到server上再试,开发效率太低。
>

单元测试的话,只要你自己这一部分的出口对了就可以了。
比方说你原来是要调用一个叫sendmail的函数来发email,现在
自己做一个mock的sendmail函数,只要判断参数对了就可以了。


--
Best Regards,
Leo Jay

Jiahua Huang

unread,
Aug 31, 2008, 3:27:53 AM8/31/08
to pyth...@googlegroups.com
On 8/31/08, realfun <rea...@gmail.com> wrote:
> 我发现发邮件过程比较慢,有时候用户添加一个评论,需要发邮件到被评论者邮箱和订阅者邮箱,很占时间。

看来你时用 smtp 同步发的。

简单改用本机 sendmail ( mail transport agent )就行。
Ubuntu 的 postfix、exim4 等都提供了 sendmail

realfun

unread,
Aug 31, 2008, 3:31:27 AM8/31/08
to pyth...@googlegroups.com
怎么用本机sendmail 来发?
直接用django的send_mail 行吗?

2008/8/31 Jiahua Huang <jhuang...@gmail.com>

realfun

unread,
Aug 31, 2008, 3:33:52 AM8/31/08
to pyth...@googlegroups.com
有道理,自己做个mock还不错
这样做上线之前好像还要改改啊,能不能做到不用改就直接上线呢?
呵呵因为本地采用了代码管理工具,文件只读,每次上线都改就稍微有些麻烦

2008/8/31 Leo Jay <python...@gmail.com>

> BTW:
> 发邮件的函数本地怎么测呢?同样的代码本地发邮件不会成功的。
> 我现在每次都辛苦的上传到server上再试,开发效率太低。
>

单元测试的话,只要你自己这一部分的出口对了就可以了。
比方说你原来是要调用一个叫sendmail的函数来发email,现在
自己做一个mock的sendmail函数,只要判断参数对了就可以了。

--

realfun

unread,
Aug 31, 2008, 3:36:51 AM8/31/08
to pyth...@googlegroups.com
再多问一句,本机sendmail来发是起一个独立的进程吗?是同步调用?

2008/8/31 realfun <rea...@gmail.com>

Leo Jay

unread,
Aug 31, 2008, 3:42:12 AM8/31/08
to pyth...@googlegroups.com
2008/8/31 realfun <rea...@gmail.com>:

> 有道理,自己做个mock还不错
> 这样做上线之前好像还要改改啊,能不能做到不用改就直接上线呢?
> 呵呵因为本地采用了代码管理工具,文件只读,每次上线都改就稍微有些麻烦
>

比方说你本来的程序入口是code.py里的main函数,然后你发email是用一个叫
mailmodule模块的sendmail函数来发的。
那你可以另外创建一个文件叫localcode.py如下:
import mailmodule


def mock_sendmail(**args):
# 这个就是mock函数,把你传进来的参数记录下来(比方说写在文件里)

# 把mock给装上
mailmodule.sendmail = mock_sendmail

# 进入主程序
import code
code.main()

以后本地测试的时候,就起localcode.py,在线上跑的时候,就用code.py

realfun

unread,
Aug 31, 2008, 3:47:08 AM8/31/08
to pyth...@googlegroups.com
很巧妙的方法,先多谢了

"以后本地测试的时候,就起localcode.py,在线上跑的时候,就用code.py"
我用的是Django,urls.py里面可以配置localcode.py或是code.py。
虽然还要改一下,但是已经比较简单了。

2008/8/31 Leo Jay <python...@gmail.com>

Zoom.Quiet

unread,
Aug 31, 2008, 4:15:27 AM8/31/08
to pyth...@googlegroups.com
2008/8/31 realfun <rea...@gmail.com>:

> 很巧妙的方法,先多谢了
>
> "以后本地测试的时候,就起localcode.py,在线上跑的时候,就用code.py"
> 我用的是Django,urls.py里面可以配置localcode.py或是code.py。
> 虽然还要改一下,但是已经比较简单了。
>
> 2008/8/31 Leo Jay <python...@gmail.com>
>>
>> 2008/8/31 realfun <rea...@gmail.com>:
>> > 有道理,自己做个mock还不错
>> > 这样做上线之前好像还要改改啊,能不能做到不用改就直接上线呢?
插入探测,观察到使用 localhost 发布的 就当是本地,使用 80 端口就是正式服务,
以此区分加载不同的 邮件发送器

PS:
收录在:
http://wiki.woodpecker.org.cn/moin/MiscItems/2008-08-31

>> > 呵呵因为本地采用了代码管理工具,文件只读,每次上线都改就稍微有些麻烦
>> >
>>
>> 比方说你本来的程序入口是code.py里的main函数,然后你发email是用一个叫
>> mailmodule模块的sendmail函数来发的。
>> 那你可以另外创建一个文件叫localcode.py如下:
>> import mailmodule
>>
>>
>> def mock_sendmail(**args):
>> # 这个就是mock函数,把你传进来的参数记录下来(比方说写在文件里)
>>
>> # 把mock给装上
>> mailmodule.sendmail = mock_sendmail
>>
>> # 进入主程序
>> import code
>> code.main()
>>
>> 以后本地测试的时候,就起localcode.py,在线上跑的时候,就用code.py


--

http://zoomquiet.org'''
过程改进乃是催生可促生靠谱的人的组织!
PE keeps evolving organizations which promoting people be good!'''

realfun

unread,
Aug 31, 2008, 4:18:50 AM8/31/08
to pyth...@googlegroups.com
不错的想法,看起来很可行,我试试看

PS: 大妈真敬业

2008/8/31 Zoom. Quiet <zoom....@gmail.com>

>> 2008/8/31 realfun <rea...@gmail.com>:
>> > 有道理,自己做个mock还不错
>> > 这样做上线之前好像还要改改啊,能不能做到不用改就直接上线呢?
插入探测,观察到使用 localhost 发布的 就当是本地,使用 80 端口就是正式服务,
以此区分加载不同的 邮件发送器

PS:
收录在:
http://wiki.woodpecker.org.cn/moin/MiscItems/2008-08-31

张沈鹏

unread,
Aug 31, 2008, 11:34:41 AM8/31/08
to pyth...@googlegroups.com

http://www.cppblog.com/true/archive/2008/07/31/57579.html

自己封装一个消息队列玩?


2008/8/31 realfun <rea...@gmail.com>



--
做人要低调...
http://zsp.javaeye.com/

Lich_Ray

unread,
Aug 31, 2008, 3:49:00 PM8/31/08
to pyth...@googlegroups.com

sendmail 是守护进程,无须担心其性能和工作方式。如果你的机器顶不住这么多人用 sendmail,那么恐怕也顶不住这么多人开多线程往 smtp 服务器上发邮件。

--
Ray Stinger, nickname lichray
The best way to predict the future is to invent it.
--------------------------------------------------
let focus = 'computing' in here:
http://let-in.blogspot.com
(let (me Program!)):
http://lichray.blogspot.com

Jiahua Huang

unread,
Aug 31, 2008, 8:05:16 PM8/31/08
to pyth...@googlegroups.com
On 9/1/08, Lich_Ray <solo...@gmail.com> wrote:
> sendmail 是守护进程,无须担心其性能和工作方式。如果你的机器顶不住这么多人用 sendmail,那么恐怕也顶不住这么多人开多线程往 smtp 服务器上发邮件。
>

postfix、exim4 等的 sendmail 是有 pool 的
(而 msmtp、esmtp 等提供的 sendmail 则只是简单 relay 到 smtp)

realfun

unread,
Aug 31, 2008, 9:55:38 PM8/31/08
to pyth...@googlegroups.com
多谢Lich和Jihua,这下明白了。

2008/9/1 Jiahua Huang <jhuang...@gmail.com>

萤火虫

unread,
Sep 1, 2008, 1:52:45 AM9/1/08
to python-cn`CPyUG`华蟒用户组
写一个单独的线程来做发送的工作。当然这里不包含发送失败之后的处理。

On 9月1日, 上午9时55分, realfun <real...@gmail.com> wrote:
> 多谢Lich和Jihua,这下明白了。
>
> 2008/9/1 Jiahua Huang <jhuangjia...@gmail.com>
Reply all
Reply to author
Forward
0 new messages