function sendPaymentNoticeEmail(row) {
  var output = { state: "init", debug: {}, error: {} };
  var sheet = getSheetStudentProgress();

  // var filename = "payment_guide.pdf";
  var fps_tutorial_pdf_file_id = "1iD4CL8X-Nr7vfmj3UI3OzrJaKl1Gbg8tGAi6T6EmEJ0";
  var fps_tutorial_pdf_file = DriveApp.getFileById(fps_tutorial_pdf_file_id);

  // NOTE: student email?
  var student_email_address_cell = getCell(
    sheet,
    row,
    COL_STUDENT_PROGRESS_EMAIL_ADDRESS
  );
  var student_email_address = readCell(student_email_address_cell);

  var student_chinese_name_cell = getCell(
    sheet,
    row,
    COL_STUDENT_PROGRESS_CHINESE_NAME
  );
  var student_chinese_name = readCell(student_chinese_name_cell);

  // NOTE: courase_name
  var course_offered_cell = getCell(
    sheet,
    row,
    COL_STUDENT_PROGRESS_COURSE_OFFERED
  );
  var course_offered = readCell(course_offered_cell);
  if (course_offered == "") {
    output = {
      ...output,
      debug: {
        ...output.debug,
        remarks: {
          course_offered,
          comment: "found empty",
        },
      },
    };
  }

  // NOTE: course_code
  var course_code_cell = getCell(sheet, row, COL_STUDENT_PROGRESS_COURSE_CODE);
  var course_code = readCell(course_code_cell);
  if (course_code == "") {
    output = {
      ...output,
      debug: {
        ...output.debug,
        remarks: {
          course_code,
          comment: "found empty",
        },
      },
    };
  }

  // NOTE: payment_link
  var payment_link_cell = getCell(
    sheet,
    row,
    COL_STUDENT_PROGRESS_PAYMENT_LINK
  );
  var payment_link = readCell(payment_link_cell);
  if (payment_link == "") {
    output = {
      ...output,
      debug: {
        ...output.debug,
        remarks: {
          payment_link,
          comment: "found empty",
        },
      },
    };
  }

  // NOTE: courase_name
  // NOTE: courase_name

  try {
    var subject = email_title(course_offered);
    // var body = email_content("中文名", "chinese 中文科", "CHI001");
    var htmlBody = email_content(
      student_chinese_name,
      course_offered,
      course_code,
      payment_link,
      getChineseDayString()
    );
    var recipient = student_email_address;
    if (recipient=='') throw new Error('email address not valid');

    var sender = "testhelloworld04@gmail.com";

    // https://developers.google.com/apps-script/reference/mail/mail-app
    var options = {
      bcc: sender,

      replyTo: sender,
      to: recipient,
      subject: subject,
      // body: body,
      htmlBody: htmlBody,
      attachments: [fps_tutorial_pdf_file.getAs(MimeType.PDF)],
    };

    sendEmail(options);
    updateNotificationDate(row)
    appendResult(row, "send email done");

    output = { ...output, state: "send email done" };
  } catch (error) {
    output = { ...output, error };
    console.log("sendEmail error");
    console.log(error);
    throw error;
  }
}
