创造营作业--送给女友的定时情话每日邮件

我正在参与掘金创作者训练营第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的方法,我们使用爬虫来获得我们的每日一句. 每日一句,我在这个网站上找到了每日一句,当然你可以找到每日情话,彩虹屁这些都可以.我使用每日一句来举例吧.

image.png

我们直接检查元素,可以看到

image.png

我们要的内容藏在了<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 &

开心,作为半个程序按照自己的意愿,去实现自己想实现的功能,代码写的很简陋,下次会努力的.

Guess you like

Origin juejin.im/post/7067535114812522510