smtp服务器发送邮件
通过前台表单收集发送方(smtp server),接收方,邮件内容
后台收集表单信息,发送邮件
用tornado搭一个简单的web后端,同时也应用学习下
import os.path
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.render('index.html')
class EmailHandler(tornado.web.RequestHandler):
def _format_addr(self, s):
name, addr = parseaddr(s)
return formataddr(( \
Header(name, 'utf-8').encode(), \
addr.encode('utf-8') if isinstance(addr, unicode) else addr))
def _send_mail(self, smtp_server, from_addr, password, to_addr, msg):
"""Use smtp protocol to send mail"""
# Smtp server ip and port
server = smtplib.SMTP_SSL(smtp_server, 465)
# Log on smtp
server.login(from_addr, password)
# Send mail
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
def post(self):
# The elements get form form, it will raise
# a error when some special element not exist
from_addr = self.get_argument('from')
from_name = self.get_argument('fromname')
password = self.get_argument('password')
to_addr = self.get_argument('to')
email_head = self.get_argument('title')
email_body = self.get_argument('contents')
smtp_server = 'smtp.qq.com'
# Fill message
msg = MIMEText(u'%s' % email_body, 'plain', 'utf-8')
msg['From'] =self. _format_addr(u'<%s> <%s>' % (from_name, from_addr))
msg['To'] = self._format_addr(u'管理员 <%s>' % to_addr)
msg['Subject'] = Header(u'<%s>' % email_head, 'utf-8').encode()
if self._send_mail(smtp_server, from_addr, password, to_addr, msg):
return
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[(r'/', IndexHandler), (r'/email', EmailHandler)],
template_path=os.path.join(os.path.dirname(__file__), "templates")
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
简单的表单模版
<!DOCTYPE html>
<html>
<head><title>send your email</title></head>
<body>
<h1>Send your email.</h1>
<form method="post" action="/poem">
<p>账号<br><input type="text" name="from"></p>
<p>昵称<br><input type="text" name="fromname"></p>
<p>密码<br><input type="text" name="password"></p>
<p>发送至<br><input type="text" name="to"></p>
<p>标题<br><input type="text" name="title"></p>
<p>内容<br><input type="text-area" name="contents"></p>
<input type="submit">
</form>
</body>
</html>