在电子邮件正文中附加列表或for循环的内容

时间:2019-06-27 07:52:48

标签: python

因此,我正在使用reddit api,并且在此练习中,我只需要一个简单的脚本,该脚本可将某些子页面上的前10个帖子收集在一起,然后将标题和网址放在电子邮件中。只是。但由于某种原因,我无法在电子邮件正文中附加for循环的结果

我目前将这10个热门帖子的值及其链接存储在称为“帖子”的列表中。

import praw
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart


reddit = praw.Reddit(
    client_id="ID",
    client_secret="ID",
    username="username",
    password="password",
    user_agent="agent",
)

subreddit = reddit.subreddit("worldnews")

hot_worldnews = subreddit.hot(limit=10)

posts = []

for post in hot_worldnews:
    posts.append(post.title + "\n" + post.url + "\n")


# Once I have that, I compile the email:


message = MIMEMultipart("alternative")
message["Subject"] = "Today's headlines"
message["From"] = "News bot"
recipients = ["email1@email.com", "email2@email.com"]
message["To"] = ""
message["bcc"] = " ,".join(recipients)

# creating the content of the email, first the plain content then the html content

plain = """
Today's headlines:
""" + "\n".join(
    posts
)

html = """
<h1><span style="color: #ff0000; background-color: #000000;"><strong>Today's headlines!</strong></span></h1>
""" + "\n".join(
    posts
)

# now we compile both parts to prepare them to send

part1 = MIMEText(plain, "plain")
part2 = MIMEText(html, "html")
message.attach(part1)
message.attach(part2)

# Now send the email

gmail_user = "user"
gmail_pwd = "pass"
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.login(gmail_user, gmail_pwd)
server.sendmail(message["From"], recipients, message.as_string())

这给了我很多头条新闻和链接,但所有这些在一起。

我一直在这里寻找不同的解决方案,很显然,我不能在电子邮件正文中包含for循环,但是'\n'.join(posts)公式似乎也不起作用,因为所有帖子都来了一个接一个,但我无法正确格式化。输出的电子邮件是一堆文字和链接

有见识吗?

2 个答案:

答案 0 :(得分:1)

在您的HTML邮件中,您将需要使用HTML换行符<br>来连接字符串,因为\n换行符在HTML中呈现为空格。

我也添加了\n来简化调试,但是如上所述,您的浏览器/邮件客户端将基本上忽略它。 (我还优化了HTML样式:-))

plain = """
Today's headlines:
""" + '\n'.join(posts)

html = """
<h1 style="color: #f00; background: #000; font-weight: bold">Today's headlines!</h1>
""" + '<br />\n'.join(posts)

答案 1 :(得分:0)

好的,所以没有用,但是现在让我说以另一种方式,将这段hmtml代码附加到我的电子邮件中:

<h1>Today's headlines:</h1>
<p>{}</p>
<hr />
<p>The weather is going to be {} in {} with a max temperature of {}</p>
<hr />
<p>&nbsp;</p>.format(posts, weather, location, temp)

我现在想做的是:我有一大堆带有很多'{}'的html(很抱歉,我不知道如何正确地称呼它们)。 html之后,我可以一一称呼它们。问题是在上一个练习中,我可以在最后的html行中添加'+'并包含'<br />\n'.join(posts)来执行此操作。但是在另一个示例中,我无法做到这一点。

在这种情况下,现在这样做的方式是什么?我尝试用变量替换'<br />\n'.join(posts),但显然不起作用。

希望我已经正确地解释了自己。