本文介绍了从数据库笔记本发送带附件的电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是PYTHON和Spark世界的新手。我正在尝试构建一个pysppark代码,以便从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()

但由于某种原因,代码给了我文件或目录不存在的异常。

我在这里错过了什么吗?

谢谢

推荐答案

您需要修改代码才能使用dBFS,因为open函数对dBFS或其他文件系统一无所知,只能处理本地文件(请参阅documentation关于dBFS)。

您可以按如下方式操作:

  • 如果您在";Full Databricks";而不是Community Edition上,则需要在文件名前面加上/dbfs,如/dbfs/mnt/....-此/dbfs挂载是从处理本地文件的代码访问dBFS上的文件的方式(但写入该位置时有一些限制)。
  • 也可以使用dbutils.fs.cp command将文件从dBFS复制到本地文件,然后使用文件副本进行附加,如下所示:
dbutils.fs.cp("/mnt/...", "file:///tmp/local-name")
with open("/tmp/local-name", "r"):
...

这篇关于从数据库笔记本发送带附件的电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-16 14:46