从databricks笔记本发送带有附件的电子邮件

zi8p0yeb  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(553)

我是python和spark领域的新手。我正试图构建一个pyspark代码,从databricks发送一封电子邮件,同时从挂载点位置发送附件。我使用下面的代码来实现同样的功能-

import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders

def send_mail(send_from = <from_email>, send_to = <to_email>, subject = "Test", message = "Test", files=["/mnt/<Mounted Point Directory>/"],
              server="<SMTP Host>", port=<SMTP Port>, username='<SMTP Username>', password='<SMTP Password>',
              use_tls=True):

    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = COMMASPACE.join(send_to)
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase('application', "octet-stream")
        with open(path, 'rb') as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition',
                        'attachment; filename="{}"'.format(Path(path).name))
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

但由于某些原因,代码给我的文件或目录不存在异常。
我错过了什么吗。
谢谢

qf9go6mv

qf9go6mv1#

您需要修改代码以使其与dbfs一起工作,因为 open 函数对dbfs或其他文件系统一无所知,只能处理本地文件(请参阅有关dbfs的文档)。
您可以按以下步骤进行:
如果您使用的是“full databricks”,而不是社区版,那么您需要预先准备 /dbfs 文件名,比如, /dbfs/mnt/.... -这个 /dbfs mount是从使用本地文件的代码访问dbfs上的文件的方法(但是在写入到该位置时有一些限制)。
或者可以使用dbutils.fs.cp命令将文件从dbfs复制到本地文件,并使用该文件副本进行附加,如下所示:

dbutils.fs.cp("/mnt/...", "file:///tmp/local-name")
with open("/tmp/local-name", "r"):
...

相关问题