为了使用Scrapy正确发送电子邮件,我忘记了什么

时间:2015-03-19 13:52:45

标签: python python-2.7 gmail scrapy

我想用Scrapy发送电子邮件

我读了扔官方网站,我发现我可以这样做:

from scrapy.mail import MailSender
        from scrapy.utils.project import get_project_settings
        settings = get_project_settings()
        mailer = MailSender(mailfrom ="Something@gmail.com", smtphost="smtp.gmail.com", smtpport=465, smtppass ="MySecretPassword")
        mailer.send(to=["AnotherMail@gmail.com"], subject="Some subject", body="Some body")

代码没有抛出任何异常,但没有发送邮件。

我错过了什么?

注1:

我需要使用Scrapy框架,而不是纯Python

注2:

我不想使用mailer = MailSender.from_settings(settings)来应用默认设置,因为如您所见,我有自定义选项,而我试图使用默认设置,但结果相同,没有例外,但是没有发送电子邮件。

我希望你帮助我

3 个答案:

答案 0 :(得分:4)

您的代码会想到两件事。首先,是否应该填充邮件代码,第二,是否应填充smtpuser参数。

以下是使用Scrapy通过Gmail发送电子邮件的工作代码。这个答案有4个部分:电子邮件代码,完整示例,日志记录和Gmail配置。提供了完整的示例,因为有一些事情需要协调才能实现。

电子邮件代码

要让Scrapy发送电子邮件,您可以在Spider类中添加以下内容(下一节中的完整示例)。这些示例让Scrapy在抓取完成后发送电子邮件。

要添加两个代码块,第一个用于导入模块,第二个用于发送电子邮件。

导入模块:

from scrapy import signals
from scrapy.mail import MailSender

在Spider类定义中:

class MySpider(Spider):

    <SPIDER CODE>

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls()
        crawler.signals.connect(spider.spider_closed, signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        mailer = MailSender(mailfrom="Something@gmail.com",smtphost="smtp.gmail.com",smtpport=587,smtpuser="Something@gmail.com",smtppass="MySecretPassword")
        return mailer.send(to=["AnotherMail@gmail.com"],subject="Some subject",body="Some body")

完成示例

将这个放在一起,这个例子使用位于:

的dirbot示例

https://github.com/scrapy/dirbot

只需要编辑一个文件:

./dirbot/spiders/dmoz.py

这是整个工作文件,其中导入靠近顶部,电子邮件代码位于蜘蛛类的末尾:

from scrapy.spider import Spider
from scrapy.selector import Selector

from dirbot.items import Website

from scrapy import signals
from scrapy.mail import MailSender

class DmozSpider(Spider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
    ]

    def parse(self, response):
        """
        The lines below is a spider contract. For more info see:
        http://doc.scrapy.org/en/latest/topics/contracts.html

        @url http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/
        @scrapes name
        """
        sel = Selector(response)
        sites = sel.xpath('//ul[@class="directory-url"]/li')
        items = []

        for site in sites:
            item = Website()
            item['name'] = site.xpath('a/text()').extract()
            item['url'] = site.xpath('a/@href').extract()
            item['description'] = site.xpath('text()').re('-\s[^\n]*\\r')
            items.append(item)

        return items

    @classmethod
    def from_crawler(cls, crawler):
        spider = cls()
        crawler.signals.connect(spider.spider_closed, signals.spider_closed)
        return spider

    def spider_closed(self, spider):
        mailer = MailSender(mailfrom="Something@gmail.com",smtphost="smtp.gmail.com",smtpport=587,smtpuser="Something@gmail.com",smtppass="MySecretPassword")
        return mailer.send(to=["AnotherMail@gmail.com"],subject="Some subject",body="Some body")

更新此文件后,从项目目录运行standard crawl命令以抓取并发送电子邮件:

$ scrapy crawl dmoz

<强>登录

通过在mailer.send方法中返回spider_closed方法的输出,Scrapy会自动将结果添加到其日志中。以下是成功与失败的例子:

成功日志消息:

2015-03-22 23:24:30-0000 [scrapy] INFO: Mail sent OK: To=['AnotherMail@gmail.com'] Cc=None Subject="Some subject" Attachs=0

错误日志消息 - 无法连接:

2015-03-22 23:39:45-0000 [scrapy] ERROR: Unable to send mail: To=['AnotherMail@gmail.com'] Cc=None Subject="Some subject" Attachs=0- Unable to connect to server.

错误日志消息 - 身份验证失败:

2015-03-22 23:38:29-0000 [scrapy] ERROR: Unable to send mail: To=['AnotherMail@gmail.com'] Cc=None Subject="Some subject" Attachs=0- 535 5.7.8 Username and Password not accepted. Learn more at 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 sb4sm6116233pbb.5 - gsmtp

Gmail配置

要将Gmail配置为以这种方式接受电子邮件,您需要启用“访问安全性较低的应用”,当您登录该帐户时,可以通过以下网址进行操作:

https://www.google.com/settings/security/lesssecureapps

答案 1 :(得分:1)

您实际使用的是代码引用的Gmail地址吗?如果是这样,google通常会在您执行此操作时首次阻止对外发邮件的访问。我在使用PHPMailer时一直遇到这个问题。首先尝试运行您的脚本,然后访问此链接:https://accounts.google.com/displayunlockcaptcha,它将为您提供来自Google的继续按钮。单击该继续按钮,这将验证您是否尝试发送邮件。然后再次尝试运行脚本,看看是否有效。

答案 2 :(得分:0)

Scrapy邮件对我不起作用。我改用它:

def send_mail(self, message, title):
    print "Sending mail..........."
    import smtplib
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEText import MIMEText
    gmailUser = 'mail_you_send_from@gmail.com'
    gmailPassword = 'password'
    recipient = 'mail_to_send_to'

    msg = MIMEMultipart()
    msg['From'] = gmailUser
    msg['To'] = recipient
    msg['Subject'] = title
    msg.attach(MIMEText(message))

    mailServer = smtplib.SMTP('smtp.gmail.com', 587)
    mailServer.ehlo()
    mailServer.starttls()
    mailServer.ehlo()
    mailServer.login(gmailUser, gmailPassword)
    mailServer.sendmail(gmailUser, recipient, msg.as_string())
    mailServer.close()
    print "Mail sent"