繁体   English   中英

为什么我的Google App Engine项目没有发送电子邮件?

[英]Why is my google app engine project not sending an email?

我完全按照本文上传了一个测试html页面和servlet。 这有效,并且会给我发送电子邮件。 但是,当我将下面的代码几乎完全将此代码复制到我的SendEmail方法中时,它不会发送电子邮件。 我知道当我在本地运行此命令时,它可以很好地到达SendEmail方法(但是您不能使用GAE中的开发服务器发送电子邮件)。 当我部署它时,页面上或日志中都没有错误,因此看起来很旧,好像只是在不发送电子邮件。 有人看到原因吗?

public class EmailService {
    private static SimpleDateFormat dateFormatter = new SimpleDateFormat ("MM/dd/yyyy");

    public static void SendDeadlineEmails() {
        PersistenceManager pm = getPersistenceManager();
        try {
            List<DeadlineEmailObject> studentsWithDeadlineToday = populateEmailList(pm);
            sendEmails(studentsWithDeadlineToday);
        } finally {
            pm.close();
        }
    }

    private static List<DeadlineEmailObject> populateEmailList(PersistenceManager pm) {
        List<Student> students =  getStudents(pm);
        List<DeadlineEmailObject> studentsWithDeadlineToday = new ArrayList<DeadlineEmailObject>();
        String today = dateFormatter.format(System.currentTimeMillis());

        for(Student student : students) {
            Set<Charge> charges = student.getCharges();
            if(charges != null) {
                for(Charge charge : charges) {
                    String deadline = dateFormatter.format(charge.getDeadline());
                    if(deadline.equals(today)) {
                        studentsWithDeadlineToday.add(new DeadlineEmailObject(student, charge));
                    }
                }
            }
        }
        return studentsWithDeadlineToday;
    }

    @SuppressWarnings("unchecked")
    private static List<Student> getStudents(PersistenceManager pm) {
        return (List<Student>) pm.newQuery(Student.class).execute();
    }

    private static void sendEmails(List<DeadlineEmailObject> studentsWithDeadlineToday) {
        for(DeadlineEmailObject emailObj : studentsWithDeadlineToday) {
            sendEmail(emailObj);
            System.out.println("Student: " + emailObj.getStudent().getFullName() + "\nAmount: " + emailObj.getCharge().getAmount() + 
                    "\nDeadline: " + dateFormatter.format(emailObj.getCharge().getDeadline()));
        }
    }

    private static void sendEmail(DeadlineEmailObject emailObj) {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);
        try {
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("njbuwm@gmail.com", "Admin"));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailObj.getStudent().getEmail(), emailObj.getStudent().getFullName()));
            msg.setSubject("Deadline Reached");
            msg.setText(buildMessage(emailObj));
            Transport.send(msg);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    private static String buildMessage(DeadlineEmailObject emailObj) {
        String email = "";
        email += "Dear " + emailObj.getStudent().getFullName() + " ,\n";
        email += "You owe us money. This much: $" + emailObj.getCharge().getAmount() + ".\n";
        email += "For this reason: " + emailObj.getCharge().getReason() + ".\n";
        email += "The deadline is today and I advise you to pay it or you will be deported to Idontpaymybills Island forever.\n";
        email += "Thank you,\n Automated Emailer";
        return email;
    }

    private static PersistenceManager getPersistenceManager() {
        return JDOHelper.getPersistenceManagerFactory("transactions-optional").getPersistenceManager();
    }
}

将您的呼叫更改为setFrom()以使用《 开发人员指南》中允许的电子邮件地址:

要设置发件人地址,应用程序将在MimeMessage对象上调用setFrom()方法。 发件人地址必须是以下类型之一:

  • 该应用程序的注册管理员地址
  • 使用Google帐户登录的当前请求的用户地址。 您可以使用Users API确定当前用户的电子邮件地址。 该用户的帐户必须是Gmail帐户,或者位于由Google Apps管理的域上。
  • 该应用程序的任何有效电子邮件接收地址(例如xxx@APP-ID.appspotmail.com)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM