Java 为什么我的谷歌应用引擎项目不发送电子邮件?

Java 为什么我的谷歌应用引擎项目不发送电子邮件?,java,google-app-engine,email,jakarta-mail,Java,Google App Engine,Email,Jakarta Mail,我已经上传了一个测试html页面和servlet。这工作,并会给我发送电子邮件。但是,当我在下面显示的代码中将此代码几乎完全复制到SendEmail方法中时,它不会发送电子邮件。我知道,当我在本地运行此程序时,SendEmail方法就可以了(但您不能使用GAE中的开发服务器发送电子邮件)。当我部署它时,页面或日志中没有任何错误,因此它看起来就像没有发送电子邮件一样。有人知道原因吗 public class EmailService { private static SimpleDateF

我已经上传了一个测试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();
    }
}
公共类电子邮件服务{
专用静态SimpleDataFormat dateFormatter=新SimpleDataFormat(“MM/dd/yyyy”);
公共静态无效SendDeadlineEmails(){
PersistenceManager pm=getPersistenceManager();
试一试{
List studentsWithDeadlineToday=populateEmailList(pm);
发送电子邮件(今天有死线的学生);
}最后{
pm.close();
}
}
私有静态列表populateEmailList(PersistenceManager pm){
列出学生=getStudents(pm);
List studentsWithDeadlineToday=new ArrayList();
String today=dateFormatter.format(System.currentTimeMillis());
用于(学生:学生){
设置费用=student.getCharges();
如果(费用!=null){
用于(费用:费用){
字符串deadline=dateFormatter.format(charge.getDeadline());
如果(截止日期等于(今天)){
studentsWithDeadlineToday.add(新的DeadlineEmailObject(student,charge));
}
}
}
}
今天返回死线的学生;
}
@抑制警告(“未选中”)
私有静态列表getStudents(PersistenceManager pm){
return(List)pm.newQuery(Student.class).execute();
}
私人静态无效发送电子邮件(列出学生和死线今天){
对于(DeadlineEmailObject emailObj:studentsWithDeadlineToday){
sendmail(emailObj);
System.out.println(“学生:+emailObj.getStudent().getFullName()+”\n数量:+emailObj.getCharge().getAmount()+
“\nDeadline:”+dateFormatter.format(emailObj.getCharge().getDeadline());
}
}
私有静态void sendmail(DeadlineEmailObject emailObj){
Properties props=新属性();
Session Session=Session.getDefaultInstance(props,null);
试一试{
Message msg=新的mimessage(会话);
msg.setFrom(新的InternetAddress(“njbuwm@gmail.com“,”管理“);
msg.addRecipient(Message.RecipientType.TO,新的InternetAddress(emailObj.getStudent().getEmail(),emailObj.getStudent().getFullName());
msg.setSubject(“截止日期”);
msg.setText(buildMessage(emailObj));
发送(msg);
}捕获(例外e){
抛出新的运行时异常(e);
}
}
私有静态字符串构建消息(DeadlineEmailObject emailObj){
字符串email=“”;
电子邮件+=“亲爱的”+emailObj.getStudent().getFullName()+“,\n”;
email+=“您欠我们的钱。金额:$”+emailObj.getCharge().getAmount()+“\n”;
电子邮件+=”因此:“+emailObj.getCharge().getReason()+”\n”;
email+=“截止日期是今天,我建议您付款,否则您将被永远驱逐到Idontpaymybills岛。\n”;
电子邮件+=“谢谢,\n自动电子邮件发送程序”;
回复邮件;
}
私有静态PersistenceManager getPersistenceManager(){
返回JDOHelper.getPersistenceManagerFactory(“事务可选”).getPersistenceManager();
}
}

将您的呼叫更改为
setFrom()
,以使用以下地址中允许的电子邮件地址:

要设置发件人地址,应用程序将调用 mimessage对象。发件人地址必须是以下地址之一 类型:

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

你怎么知道它不发送电子邮件呢?我是这样假设的,因为我是在给自己发送邮件,而我没有收到。你检查过你的垃圾邮件文件夹吗?已经是了,不过,对于这个问题的未来旁观者来说,这是一个很好的建议。似乎有什么问题,因为我今天早上重新部署了,它刚刚开始工作。。。很可能是黑魔法。