我是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()
但由于某些原因,代码给我的文件或目录不存在异常。
我错过了什么吗。
谢谢
1条答案
按热度按时间qf9go6mv1#
您需要修改代码以使其与dbfs一起工作,因为
open
函数对dbfs或其他文件系统一无所知,只能处理本地文件(请参阅有关dbfs的文档)。您可以按以下步骤进行:
如果您使用的是“full databricks”,而不是社区版,那么您需要预先准备
/dbfs
文件名,比如,/dbfs/mnt/....
-这个/dbfs
mount是从使用本地文件的代码访问dbfs上的文件的方法(但是在写入到该位置时有一些限制)。或者可以使用dbutils.fs.cp命令将文件从dbfs复制到本地文件,并使用该文件副本进行附加,如下所示: