我正在参与掘金创作者训练营第4期,点击了解活动详情,一起学习吧!
我是一个小白的程序员,经过看训练营的说明,我来交作业了.
想做一个送给女友的小礼物
前几天是情人节,送玩偶啥的太俗,想着利用自己的知识,毕竟还算半个程序员吗,给女友定制个每日邮件吧.
分解任务
我们来分解一下任务,我们需要:
- 发送邮件
- 每日一句 来源
- 定时任务
- 编程
- 定制化服务
发送邮件
我采用的是最简单的Python编程,使用SMTP
去发送邮件,邮件有三要素, host邮件的服务器地址,user你的邮箱账号,password你的邮箱密码,好的,给出我们的样例代码,底下是因为,我想讲究一点,给做了封装.
import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.header import Header
receivers = ['你的邮箱@qq.com']
def send_email(message,receivers=receivers):
# 第三方 SMTP 服务
mail_host = "smtp.163.com" # 设置服务器
mail_user = "你的邮箱@163.com" # 用户名
mail_pass = "是网易邮箱的token" # 口令
sender = mail_user
# receivers = ['接收@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
try:
smtpObj = SMTP_SSL(mail_host,465)//465,25 都行后面解释我使用的原因
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(mail_user, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")
复制代码
目前我们可以完成第一步发送邮件,可是我们的邮件内容怎么办呢,不能每天都是现写的内容吧. 前几天从崔庆才老师的书中,学了一点爬虫的皮毛. 新建一个Python文件,定一个get_info的方法,我们使用爬虫来获得我们的每日一句. 每日一句,我在这个网站上找到了每日一句,当然你可以找到每日情话,彩虹屁这些都可以.我使用每日一句来举例吧.
我们直接检查元素,可以看到
我们要的内容藏在了<h5>
标签下且class=e
,我们偷个懒,使用lxml来处理它
result = html.xpath('//h5[@class="e"]/a/text()')[0]
复制代码
这样我们就取到了,我们想要的值,还想要它的翻译怎么办呢,同样的方式再来一遍:
result_translate = html.xpath("//div[@class='fl dailyEtext']/h5[2]/text()")[0]
复制代码
整个获取每日一句的代码如下:
import requests
from lxml import etree
def get_everyday_sentence():
# 每日一句 沪江英语
URL = "http://news.iciba.com/index.php?mod=dailysentence"
r = requests.get(URL)
html = etree.HTML(r.text)
result = html.xpath('//h5[@class="e"]/a/text()')[0]
result_translate = html.xpath("//div[@class='fl dailyEtext']/h5[2]/text()")[0]
# print(result, result_translate)
return result, result_translate
复制代码
定时问题的解决
作为假的程序员,水平不太够啊,我想的解决方案是循环,一直去拿时间,当每天八点的时候执行发邮件的操作.我就直接写个死循环,然后多少秒去请求一下时间,最开始我是设置500s 我感觉有点太长了,我就设置5秒一次. OK 我的实现如下:
import time
from SendEmailforgf import timer
from SendEmailforgf.get_info import get_everyday_sentence
from email.mime.text import MIMEText
from email.header import Header
from sendEmail import send_email
from timer import *
if __name__ == '__main__':
while (True):
if get_time(3) + 8 == 8:
every_senntence_info = get_everyday_sentence()
message = MIMEText(
every_senntence_info[0] + every_senntence_info[1] + " " + f" 距生日还有{int(timer.count_birthday())}天",
'plain',
'utf-8')
message['From'] = Header("猪猪侠不吃棒棒糖", 'utf-8')
message['To'] = Header("可爱小赵", 'utf-8')
subject = '每日一句'
message['Subject'] = Header(subject, 'utf-8')
reciver = "收件人@qq.com"
send_email(message, reciver)
time.sleep(3600)
else:
print("我还在运行")
time.sleep(5)
# time.sleep(60*60*24)
复制代码
有一些定制化的方法还没有介绍到,马上介绍.这是我的主程序入口.
定制化
我觉得吧上面的每日一句啊,彩虹屁,都太普通,你需要添加一些属于你们两个的知识,比如她的生日,写一个计算她生日距今天还有多少天的方法:
import time
import datetime
def get_time(num):
return time.gmtime().__getitem__(num)
def count_birthday():
birthday_birth = '1998-07-07' # 她的生日
current_birth = f"{get_time(0)}-07-07"
today = datetime.datetime.today()
if convert_time(today.strftime("%Y-%m-%d")) > convert_time(current_birth):
day = ((convert_time(current_birth) - convert_time(
today.strftime("%Y-%m-%d")) + 60 * 60 * 24 * 365)) / (60 * 60 * 24 )
else:
day = (convert_time(current_birth) - convert_time(today.strftime("%Y-%m-%d"))) / (60 * 60 * 24 )
#print(day)
return day
def convert_time(DATE):
return int(time.mktime(time.strptime(DATE, "%Y-%m-%d")))
复制代码
写了一个简单的判断,今天的毫秒值跟今年的生日的毫秒值比较,看看是否已经过了今年的生日,目前日期还没有过,不知道这个地方会不会出现bug,出现咱们再改嘛.
编程 实现
上面其实就是我编程实现的方式,但是这代码只有跑了,才能循环,才能发邮件,我的电脑也不能一直就跑着这个小程序吧,这时候我想起来我那不停机的云服务器了,把这个Python代码部署到云服务器上去不就解决了,程序没地方跑的问题了吗.
购买服务器,安装Python按下不表,只说我在把我自己的代码放上去遇上的问题,module找不到,经过我自己找资料,明白是因为自己封装的方法,本地电脑与服务器的路径写法不一样导致的原因,将写有main方法的文件,添加一行代码解决这个问题:
import sys
import os
sys.path.append(os.path.dirname(sys.path[0]))
复制代码
在服务器上运行上传的代码就好了:nohup python3 main.py &
开心,作为半个程序按照自己的意愿,去实现自己想实现的功能,代码写的很简陋,下次会努力的.