用jinja做了个E-Letter小项目

做了一个html E-Letter项目.
邮件模板采用jinja2, html 邮件内容生成简直太爽了.
整个项目开发只用了2个小时, 调试却花了大半天时间, 生成的邮件总是发不出去.

于是, 打开 smtp 的debuglevel, 发现邮件已经mail queue了, 但就是收不到邮件. mail server是exchange. 之前用java写过类似的程序也没有问题(也是走smtp协议发送html邮件). 为什么这次用python实现却有问题?

怀疑过python smtp模块用法, 怀疑过python smtp的html写法, 怀疑过smtp subject和content不支持unicode. 最终都被排除.
最后终于定位到元凶: 邮件的subject只要包含"Please check."这13个字符, 邮件就会石沉大海. 难道是exchange server设了某种规则?

#------------------
资料:
#------------------
cnblogs 小五义的文章不错,  <<python发送各类邮件的主要方法>>,
 http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html

#------------------
代码结构
#------------------
下面简单描述一下项目的结构, 在我的脚手架项目基础上, 做了少量的裁剪, 并增加两个目录, scripts和templates, scripts目录存放E-Letter生成和发送脚本, templates目录存放E-Letter的模板.
并附上 mail_service.py, 修改了网上找的代码, 用来发送 html 邮件.

py_package
      |--scripts
               |--check1.py
               |--check2.py
      |--templates
               |--check1.html
               |--check2.html

# -*- coding: utf-8 -*-
#check1.py 
‘‘‘
Created on 2014-5-23

‘‘‘ 
          
from __future__ import absolute_import          
import jinja2 
from jinja2.loaders import FileSystemLoader
      
def get_template(file_name):
    ‘‘‘
    get template html with jinja2 format in templates folder
    ‘‘‘
    template_path=os.path.join(os.path.dirname(os.path.dirname(__file__)),‘templates‘)
    template_env = jinja2.Environment(loader=FileSystemLoader(template_path))       
    return template_env.get_template(file_name)

def check():
    template=get_template(‘check1.html‘)
    something=‘something here‘
    mail_body=template.render(something=something)
    mail_sender=HtmlMailSender() 
    mail_subject=‘Some subject here‘
    #mail_subject=‘Please check.‘  #cannot send out, why? 
    mail_to=[‘[email protected]‘,‘b.corp.com‘]
    mail_cc=[] 
    mail_sender.send_html_mail(mail_to,mail_cc,mail_subject,mail_body)

# -*- coding: utf-8 -*-
#conf.py 
‘‘‘
Created on 2014-6-23

‘‘‘
from __future__ import absolute_import
import logging

##logging
log_level=logging.INFO

#email setting 
smtp_host="10.10.10.10" 
smtp_port=25 
smtp_over_ssl=False
mail_user="[email protected]" 
mail_pwd=""    # if no auth required, set pwd as empty

# -*- coding: utf-8 -*-
#mail_service.py 
‘‘‘
Created on 2014-6-23

‘‘‘
from __future__ import absolute_import
import logging
from . import conf

class HtmlMailSender(object):
    logger=logging.getLogger(__name__)
    
    def __init__(self):
        #read mail settings from configure file
        self.smtp_host=conf.smtp_host
        self.smtp_port=conf.smtp_port
        self.smtp_over_ssl=conf.smtp_over_ssl
        self.mail_user=conf.mail_user
        self.mail_pwd=conf.mail_pwd        
        
        
            
    def send_html_mail(self, to_list, cc_list, subject, body):
        self.logger.info(‘send_html_mail() called.‘)
     
        import smtplib
        from email.mime.text import MIMEText  
        from email.mime.multipart import MIMEMultipart

# Construct email
        msgRoot = MIMEMultipart(‘related‘)
        msgRoot[‘Subject‘] = subject    
        msgRoot[‘From‘] = self.mail_user  
        msgRoot[‘To‘] = ",".join(to_list)  
        msgRoot[‘CC‘] =",".join(cc_list)   
        #msgRoot[‘BCC‘] =",".join(cc_list)
        msgRoot.preamble = ‘This is a multi-part message in MIME format.‘
   
        # Encapsulate the plain and HTML versions of the message body in an
        # ‘alternative‘ part, so message agents can decide which they want to display.
        msgAlternative = MIMEMultipart(‘alternative‘)
        msgRoot.attach(msgAlternative)
        
        #Add plain content
        msgText = MIMEText(‘This is HTML mail. If you see this message, which means you will not see the real mail content.‘,‘plain‘)
        msgAlternative.attach(msgText)
        
        #add html content
        msgText = MIMEText(body, ‘html‘)
        msgAlternative.attach(msgText)
 
        try:
            if not self.smtp_over_ssl:
                if self.smtp_port==‘‘:
                    s = smtplib.SMTP(self.smtp_host)
                else:
                    s = smtplib.SMTP(self.smtp_host, self.smtp_port)
            else:
                if self.smtp_port==‘‘:
                    s = smtplib.SMTP_SSL(self.smtp_host)
                else:
                    s = smtplib.SMTP_SSL(self.smtp_host, self.smtp_port)
                    
            s.set_debuglevel(True)  # print stmp actions to stdout
            if self.mail_pwd :
                s.login(self.mail_user,self.mail_pwd)  
    
            to_addrs=to_list+cc_list
            s.sendmail(self.mail_user ,to_addrs, msgRoot.as_string())  
            #s.sendmail(from_addr ,to_addrs, ‘test message‘)
            s.quit()    
            
            self.logger.info("""Mail sent. Find details below, 
            to_list: %s 
            cc_list: %s 
            subject: %s 
            body: %s"""%(to_list, cc_list, subject, body))                     
            return True  
        except Exception, ex:  
            self.logger.exception(ex)  
            return False

用jinja做了个E-Letter小项目,布布扣,bubuko.com

时间: 2024-08-27 12:30:57

用jinja做了个E-Letter小项目的相关文章

最近做了一个Spring Boot小项目,大家帮忙找找bug吧, http://www.dbeetle.cn

最近做了一个Spring Boot小项目,网站顶部有源码地址,欢迎大家访问 http://www.dbeetle.cn 欢迎各位访问,提出意见,找找bug 网站说明 甲壳虫社区(Beetle Community) 一个开源的问答社区.论坛博客,您可以提出自己的问题.发布自己的文章.和其他用户交流 目前功能有第三方登陆.查看.发布.评论.消息通知.顶置.一键已读.搜索等 后续会不断更新完善,欢迎大家提供更好的建议 使用技术 Spring Boot.Mybatis.Thymeleaf.BootStr

小项目特供 贪吃蛇游戏(基于C语言)

C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第二天写了第二版和第三版. 相信C语言写个小游戏或小项目是大多数计算机相关专业的学生都做的事情,但是作为一个数学专业的学生,我们教研室的老师对C语言的要求也就比较低了,大一没有让我们做个小项目实践一次.至今为止用C/C++做过的三个小项目(大作业),一个是外校同学让我帮忙写的学生信息管理系统(天呐,这

用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量.<s:iterator>标签有一个value属性,用来存放在Action类的方法中存数据的list集合,还有一个id,好像是说指定集合的索引的意思,就是给list集合遍历出来的每个对象加上一个数字标签,反正我是这么理解的,没用过.还有一个很重要,就是var变量,我在s:iterator按ctr

Java小项目之:教你做电子日历!

Java小项目之:教你做电子日历!<!doctype html><html><head><meta charset="utf-8"><title>日历控件</title><script src="js/new_file.js" defer></script></head> <body><input id="calendar"

MySQL 只能做小项目?松哥要说几句公道话!

松哥上学那会,很多人对 MySQL 有一些偏见,偏见主要集中在以下几方面: MySQL 不支持事务(事实上 MyISAM 有表锁,但是效率比较低) MySQL 存储的数据量比较小,适合小项目,大项目还是得上 Oracle.DB2 等 这么多年过去了,松哥自己在开发中一直是以 MySQL 为主,我觉得我有必要说两句公道话了. <!--more--> 公道话 第一个问题 关于第一个不支持事务的问题,这有一定的历史原因.MySQL 从设计之初,存储引擎就是可插拔的,允许公司或者个人按照自己的需求定义

Java小项目之:教你做个聊天系统!

Java小项目之:聊天系统今天给大家带来的java练手小项目是一个简单的聊天室,界面简单,操作不难.分为注册系统,登录系统和聊天系统三部分,很适合java小白练手.完整的源码和素材请关注并私信我获取! 界面展示: 代码展示:package chatRoom2; import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWr

Android开发不得不看的11个实战小项目

是不是想学Android开发(http://www.maiziedu.com/course/android-px/)却不知道如何下手?懂得一点点入门基础知识却无法应用到实际开发中?看相关资料觉得都懂了实际动手却发现什么都不懂?本地搭建Android开发环境太麻烦? 如果你有以上的各种问题,那么今天小编推荐的Android开发的这11个小项目,你一定要看!! 因为,这些实战项目都是基于google 官方的API Demos制作而成,而且全部配有Android在线开发环境,你可以随时动手跟着课程操作

IOS-小项目(饿了么 网络部分 简单实现)

在介绍小项目之前,在此说明一下此代码并非本人所写,我只是随笔的整理者. 在介绍之前先展现一下效果图. 看过效果图大家应该很熟悉了,就是饿了么的一个界面而已,值得注意的是,实现时并没有采用本地连接,而是实打实的网络连接.看一下文件架构. 这一采用的是MVC设计模式,虽然文件很少,但是也可以看. 下面开始正式介绍小项目的实现. 首先介绍Model的实现,很简单,实现模型即可, Shop.h // // Shop.h // CX-小项目(饿了么 网络部分 简单实现) // // Created by

盘点三个网络赚零花钱的小项目,傻瓜式操作

今天,写一篇比较特别的日志,咱们来盘点三个赚零花钱的小项目,都是“傻瓜式”操作. 这几个小项目,虽说赚不了太多的钱,但是却是一个可以锻炼执行力的好方法. 每一个项目操作都非常的简单,边锻炼执行力,边收钱,也是一种不错的体验. 废话不多说,咱们直接进入主题啊! 一,支付宝借条,可赚零花钱,也可赚大钱 支付宝有打借条的功能,本来他们开发这个,只是针对于熟人之前借钱的. 不过,无心插柳柳成荫,没成想,这个功能火的一塌糊涂,完全带火了陌生人之间的借贷业务. 如何利用支付宝借条赚钱? 其实就跟放贷是一样的