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

背景信息

DataWorks中的PyODPS节点和Python脚本有所区别,PyODPS节点主要用于和MaxCompute交互进行数据分析处理。DataWorks暂不支持自定义发送邮件功能,您可以通过PyODPS节点结合独享资源组的方式,实现从MaxCompute读取数据进行邮件外发的场景需求。
说明 TCP 25端口是默认的邮箱服务端口。出于安全考虑,云服务器ECS的25端口默认受限,独享资源组无法支持该端口,建议您使用465端口发送邮件。

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

操作步骤

  1. 新增独享资源组。
    1. 登录DataWorks控制台
    2. 在左侧导航栏,单击资源组列表
    3. 独享资源组页签下,单击新增独享资源组
    4. 新增独享资源组对话框中,配置各项参数,详情请参见新增和使用独享调度资源组
      说明 独享资源组和DataWorks工作空间的地域请保持一致。
    5. 单击创建
  2. 分配独享资源组至相应的工作空间。
    1. 单击相应资源组后的修改归属工作空间
    2. 修改归属对话框中,选中要分配的工作空间。
    3. 单击确定
  3. 进入数据开发页面。
    1. 在DataWorks控制台的左侧导航栏,单击工作空间列表
    2. 在页面左上角切换工作空间所在的地域。
    3. 单击相应工作空间后的进入数据开发
  4. 新建PyODPS 2节点。
    1. 鼠标悬停至新建图标,单击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=""        //邮件内容
      o=ODPS('access_key','access_secretkey','default_project_name',endpoint='maxcompute_service_endpoint')
      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=""        //邮件内容
      o=ODPS('access_key','access_secretkey','default_project_name',endpoint='maxcompute_service_endpoint')
      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. 修改资源组对话框中,选择资源组
    6. 单击确定
  7. 测试节点,详情请参见周期任务运行与管理