数据分析团队经常需要将分析结果自动发送给业务人员,而邮件是最通用的方式之一。本文将详细介绍如何利用DataWorks实现邮件自动推送功能,内容简明扼要,配有实用代码示例。
基础概念
DataWorks提供两种主要方式实现邮件外发:
- 通过PyODPS节点结合MaxCompute数据处理后发送邮件
- 使用DataWorks内置的数据推送服务直接发送邮件
重要提示:
- 出于安全原因,云服务器的25端口(标准邮件端口)默认受限,建议使用465端口(SSL加密)
- 独享资源组用户无法安装额外Python第三方模块
- Serverless资源组与DataWorks工作空间必须在同一地域
通过PyODPS节点实现邮件外发
步骤1:创建独享资源组
- 登录DataWorks控制台
- 进入"资源组"列表页面
- 点击"新建资源组"创建独享资源组
- 购买后绑定到目标工作空间
步骤2:创建PyODPS节点
- 进入数据开发页面
- 新建PyODPS 2节点
- 编写以下邮件发送代码:
python
python
import smtplib
from email.mime.text import MIMEText
from odps import ODPS
import datetime
# 邮箱配置信息
mail_host = 'smtp.163.com' # 邮箱服务器地址
mail_username = 'your_username' # 登录用户名
mail_password = 'your_password' # 邮箱授权码
mail_sender = '[email protected]' # 发件人邮箱
mail_receivers = ['[email protected]'] # 收件人邮箱
# 获取当前日期
today = datetime.datetime.now().strftime('%Y-%m-%d')
# 通过SQL查询获取数据
mail_content = f"数据报表({today})\n\n"
with o.execute_sql('SELECT product_name, sales_amount FROM sales_data WHERE sale_date = CURRENT_DATE()').open_reader() as reader:
for record in reader:
mail_content += f"产品: {record['product_name']}, 销售额: {record['sales_amount']}元\n"
# 构建邮件
message = MIMEText(mail_content, 'plain', 'utf-8')
message['Subject'] = f'每日销售报表 - {today}'
message['From'] = mail_sender
message['To'] = mail_receivers[0]
# 发送邮件
try:
smtp = smtplib.SMTP_SSL(mail_host, 465) # 使用SSL加密连接
smtp.login(mail_username, mail_password)
smtp.sendmail(mail_sender, mail_receivers, message.as_string())
smtp.quit()
print('邮件发送成功')
except smtplib.SMTPException as e:
print('邮件发送失败:', e)
步骤3:配置并运行节点
- 保存节点代码
- 点击"提交"按钮
- 设置调度配置(重跑属性和上游依赖)
- 修改节点运行资源组为刚创建的独享资源组
- 测试运行节点
发送HTML格式邮件和附件
下面是更实用的HTML邮件代码示例,支持表格格式和附件:
python
python
import smtplib
import pandas as pd
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from odps import ODPS
from datetime import datetime
# 邮箱配置
mail_host = 'smtp.qq.com'
mail_username = '[email protected]'
mail_password = 'your_authorization_code' # QQ邮箱需要授权码
mail_sender = '[email protected]'
mail_receivers = ['[email protected]']
# 查询数据并创建HTML表格
sql = "SELECT region, SUM(sales) as total_sales FROM sales_table GROUP BY region ORDER BY total_sales DESC"
html_content = "<h2>各区域销售额统计</h2><table border='1'><tr><th>区域</th><th>销售额(元)</th></tr>"
# 创建Excel附件数据
excel_data = []
with o.execute_sql(sql).open_reader() as reader:
for record in reader:
region = record['region']
sales = record['total_sales']
# 添加到HTML表格
html_content += f"<tr><td>{region}</td><td>{sales:,.2f}</td></tr>"
# 添加到Excel数据
excel_data.append({"区域": region, "销售额": sales})
html_content += "</table><p>详细数据请查看附件。</p>"
# 创建多部分邮件
message = MIMEMultipart()
message['Subject'] = f'销售数据报表 - {datetime.now().strftime("%Y-%m-%d")}'
message['From'] = mail_sender
message['To'] = mail_receivers[0]
# 添加HTML内容
html_part = MIMEText(html_content, 'html', 'utf-8')
message.attach(html_part)
# 创建Excel附件
df = pd.DataFrame(excel_data)
excel_file = f"/tmp/sales_report_{datetime.now().strftime('%Y%m%d')}.xlsx"
df.to_excel(excel_file, index=False)
# 添加附件
with open(excel_file, 'rb') as f:
attachment = MIMEApplication(f.read())
attachment.add_header('Content-Disposition', 'attachment', filename=f"销售报表_{datetime.now().strftime('%Y%m%d')}.xlsx")
message.attach(attachment)
# 发送邮件
try:
smtp = smtplib.SMTP_SSL(mail_host, 465)
smtp.login(mail_username, mail_password)
smtp.sendmail(mail_sender, mail_receivers, message.as_string())
smtp.quit()
print('销售报表邮件发送成功')
except Exception as e:
print('邮件发送失败:', e)
通过数据推送服务实现邮件外发
除了PyODPS节点,DataWorks还提供两种专用的数据推送方式:
数据推送节点
适合在数据开发中集成邮件推送功能:
- 在数据开发中创建数据推送节点
- 将上游节点的输出参数配置为邮件内容
- 设置接收邮箱和发送周期
- 提交并发布节点
数据推送服务
适合需要更丰富展示形式的场景:
- 在数据服务中创建推送任务
- 编写SQL查询定义数据范围
- 添加富文本或表格组织邮件内容
- 设置调度周期实现定时推送
常见邮件服务器配置参考
服务商 | SMTP服务器 | SSL端口 | TLS端口 | 认证方式 |
---|---|---|---|---|
163邮箱 | smtp.163.com | 465 | 994 | 授权码 |
QQ邮箱 | smtp.qq.com | 465 | 587 | 授权码 |
企业邮箱 | 查看企业邮箱设置 | 465 | 587 | 密码或授权码 |
阿里云邮件推送 | smtpdm.aliyun.com | 465 | 80 | API密钥 |
常见问题及解决方案
发送失败
- 检查邮箱授权码是否过期
- 确认端口是否正确(建议使用465端口)
- 检查网络连接是否稳定
无法发送附件
- 确保使用的路径有写入权限
- 控制附件大小在合理范围内(建议<10MB)
- 使用OSS存储大附件,邮件中只发送下载链接
无法使用第三方库
- 优先使用Python标准库
- 考虑使用阿里云提供的邮件推送服务(DirectMail)
- 通过API调用外部邮件服务
业务应用案例
案例1:每日异常订单提醒
ini
python
# 查询异常订单
sql = """
SELECT order_id, user_id, amount, payment_status
FROM orders
WHERE order_date = CURRENT_DATE()
AND (amount > 10000 OR payment_status = 'FAILED')
"""
# 生成HTML报告并发送给相关负责人
案例2:周报销售业绩统计
ini
python
# 周一早上自动发送上周销售业绩
if datetime.now().weekday() == 0: # 周一
last_week_start = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d')
last_week_end = (datetime.now() - timedelta(days=1)).strftime('%Y-%m-%d')
sql = f"""
SELECT salesperson, SUM(amount) as total_sales, COUNT(order_id) as order_count
FROM sales_records
WHERE sale_date BETWEEN '{last_week_start}' AND '{last_week_end}'
GROUP BY salesperson
ORDER BY total_sales DESC
"""
# 生成报表并发送
通过以上方法和示例,您可以根据业务需求灵活配置DataWorks的邮件外发功能,实现数据自动化推送,提升工作效率。