Использование функции для сообщения в электронной почте smtplib

Я пытаюсь отправить электронное письмо самому себе с результатами некоторых веб-скрейпингов, которые я сделал. Очистка всего происходит в функции. Поэтому я попытался установить функцию в качестве сообщения для моей электронной почты, но она просто не работает.

Вот мой код (все еще довольно новый, поэтому, пожалуйста, не слишком сильно ругайте код, я знаю, что еще могу его реорганизовать)

from bs4 import BeautifulSoup
from email.mime.text import MIMEText
import requests
import smtplib

page = requests.get("https://www.sportsinteraction.com/soccer/england/premier-league-betting/")

soup = BeautifulSoup(page.content, 'html.parser')
matches = soup.find_all(class_="game")

def betting_odds(data):
    for games in data:
        teams = games.find_all(class_="name")
        odds = games.find_all(class_="price wide")
        if len(games.find_all(class_="date")) > 0:
            print(games.find(class_="date").get_text())
        team1 = teams[0].get_text()
        draw = teams[1].get_text()
        team2 = teams[2].get_text()
        odds1 = odds[0].get_text()
        odds_draw = odds[1].get_text()
        odds2 = odds[2].get_text()
        print("{}  {} \n{}  {} \n{}  {} \n".format(team1, odds1, draw, odds_draw, team2, odds2))    

fromx = '[email protected]'
to = '[email protected]'
msg = MIMEText('Here are the odds for the upcoming premier league games\n\n{}'.format(betting_odds(matches)))
msg['Subject'] = 'Premier League Odds'
msg['From'] = fromx
msg['To'] = to

smtpObj = smtplib.SMTP('smtp.gmail.com', 587)
smtpObj.ehlo()

smtpObj.starttls()
smtpObj.login('[email protected]', 'password')
smtpObj.sendmail(fromx, to, msg.as_string()) 
smtpObj.quit()

Когда я запускаю это, все результаты отображаются в оболочке именно так, как я хочу, а затем отправляется электронное письмо. Как только я получаю электронное письмо, у него есть тема, и первая строка сообщения верна, но затем он говорит «Нет».

Любая помощь приветствуется!


person pconn12    schedule 25.10.2018    source источник
comment
Ваша функция ничего не возвращает, она просто печатает.   -  person Klaus D.    schedule 25.10.2018
comment
когда я изменил операторы печати на возврат, сообщение электронной почты просто вернуло первую строку и ничего после нее. Любая идея, почему это произойдет?   -  person pconn12    schedule 25.10.2018
comment
Потому что ваша первая итерация уже вернется, в отличие от print(), которую можно запускать несколько раз.   -  person Klaus D.    schedule 25.10.2018
comment
Потому что вы не возвращаете все строки, только первую. Я бы предложил добавить переменную message = "" перед for games in data:, а затем вместо печати добавить каждое значение в переменную message += ("{} {} \n{} ...)   -  person Shai Léger    schedule 25.10.2018
comment
Я также пытался создать переменную и добавить каждое значение, но это тоже не сработало, я проверю это снова.   -  person pconn12    schedule 25.10.2018
comment
Это сработало!!! Должно быть, я что-то напутал, когда создавал переменную для хранения строки в первый раз. спасибо вам обоим за помощь!   -  person pconn12    schedule 25.10.2018


Ответы (1)


Это было решено. Я завершил это, создав переменную для хранения строк и продолжил их объединение через циклы. Затем я вернул переменную в конце.

Ваше здоровье!

person pconn12    schedule 25.10.2018