通过DataWorks实现邮件外发最佳实践

本文为您介绍如何通过PyODPS节点结合独享资源组的方式,实现邮件外发的需求。

背景信息

DataWorks中的PyODPS节点和Python脚本有所区别,PyODPS节点主要用于和MaxCompute交互进行数据分析处理。DataWorks暂不支持自定义发送邮件功能,您可以通过PyODPS节点结合独享资源组的方式,实现从MaxCompute读取数据进行邮件外发的场景需求。

说明

TCP 25端口是默认的邮箱服务端口。出于安全考虑,云服务器ECS的25端口默认受限,独享资源组无法支持该端口,建议您使用465端口发送邮件。

通过PyODPS节点结合独享资源组的方式实现邮件外发时,独享资源组用户无法登录到对应的机器,这会导致无法安装更多Python第三方模块,实现更多的功能。

操作步骤

  1. 新增独享资源组。

    1. 登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的资源组,进入资源组列表页面。

    2. 独享资源组页签下,单击新建资源组

    3. 配置各项参数,详情请参见新增和使用Serverless资源组

      说明

      Serverless资源组和DataWorks工作空间的地域请保持一致。

    4. 单击立即购买

  2. 分配Serverless资源组至相应的工作空间。

    1. 单击相应资源组后的绑定工作空间

    2. 绑定工作空间操作框中,单击绑定要分配的工作空间。

  3. 进入数据开发页面。

    登录DataWorks控制台,切换至目标地域后,单击左侧导航栏的数据开发与治理 > 数据开发,在下拉框中选择对应工作空间后单击进入数据开发

  4. 新建PyODPS 2节点。

    1. 鼠标悬停至image.png图标,单击新建节点 > MaxCompute > PyODPS 2

      您也可以打开相应的业务流程,右键单击MaxCompute,选择新建节点 > PyODPS 2

    2. 新建节点对话框中,输入名称,并选择路径

      说明

      节点名称必须是大小写字母、中文、数字、下划线(_)和小数点(.),且不能超过128个字符。

    3. 单击确认

    4. 在PyODPS 2节点的编辑页面,输入如下SMTP发送代码。

      import smtplib
      from email.mime.text import MIMEText
      from odps import ODPS
      mail_host = '<yourHost>' //邮箱服务地址
      mail_username = '<yourUserName>' //登录用户名
      mail_password = '<yourPassWord>'  //登录用户密码
      mail_sender = '<senderAddress>' //发件人邮箱地址
      mail_receivers = ['<receiverAddress>']  //收件人邮箱地址
      mail_content=""        //邮件内容
      with o.execute_sql('query_sql').open_reader() as reader:
                 for record in reader:
                         mail_content+=str(record['column_name'])+' '+record['column_name']+'\n'
      message = MIMEText(mail_content,'plain','utf-8')
      message['Subject'] = 'mail test'
      message['From'] = mail_sender
      message['To'] = mail_receivers[0]
      try:
                 smtpObj = smtplib.SMTP_SSL(mail_host+':465')
                 smtpObj.login(mail_username,mail_password)
                 smtpObj.sendmail(
                     mail_sender,mail_receivers,message.as_string())
                 smtpObj.quit()
                 print('mail send success')
      except smtplib.SMTPException as e:
                 print('mail send error',e)           

      或者您可以使用以下发送邮件代码的示例:

      import smtplib
      from email.mime.text import MIMEText
      from odps import ODPS
      mail_host = 'username@example.com'  //邮箱服务地址
      mail_username = 'xxxx' //登录用户名
      mail_password = 'xxx'  //登录用户密码
      mail_sender = 'xxx' //发件人邮箱地址
      mail_receivers = ['xxx'] //收件人邮箱地址
      mail_content=""        //邮件内容
      with o.execute_sql('query_sql').open_reader() as reader:           
          for record in reader:                   
                      mail_content+=str(record['column_name'])+' '+record['column_name']+'\n'
      message = MIMEText(mail_content,'plain','utf-8')
      message['Subject'] = 'mail test'
      message['From'] = mail_sender
      message['To'] = mail_receivers[0]
      try:           
                 smtpObj = smtplib.SMTP()
                 smtpObj.connect(mail_host,587)
                 smtpObj.ehlo()
                 smtpObj.starttls()
                 smtpObj.login(mail_username,mail_password)
                 smtpObj.sendmail(
                     mail_sender,mail_receivers,message.as_string())
                 smtpObj.quit()
                 print('mail send success')
      except smtplib.SMTPException as e: 
                print('mail send error',e)
      说明

      使用PyODPS 2节点外发邮件时,PyODPS会将读取的数据存放至一个临时文件中,再通过邮件的形式外发。外发邮件时没有数据条数的限制。

    5. 单击工具栏中的保存图标。

  5. 提交节点。

    重要

    提交节点前,您需要单击右侧的调度配置,设置重跑属性依赖的上游节点

    1. 单击工具栏中的提交图标。

    2. 提交新版本对话框中,输入备注

    3. 单击确认

    如果您使用的是标准模式的工作空间,提交节点后,请单击右上角的发布。详情请参见发布任务

  6. 修改运行节点的资源组。

    1. 在PyODPS 2节点的编辑页面,单击右上方的运维

    2. 在左侧导航栏,单击周期任务运维 > 周期任务

    3. 单击相应节点后的更多 > 修改调度资源组

    4. 修改调度资源组对话框中,选择资源组

    5. 单击确定

  7. 测试节点,详情请参见查看并管理周期任务