在java中只在for循环中显示一个结果

时间:2016-09-21 07:54:01

标签: java email

我正在从java发送邮件。问题是当我从for循环运行程序时,我只获得邮件中的最后一条数据记录。但是当我在控制台上打印数据时,我会按预期获得所有记录。

    for(int i = 0; i < stud.size(); i++) {

        Student students = studs.get(i);

        msg.setContent("<table border = '1'><tr>"
                + "<th>Students</th><th>Project</th></tr>"
                + "<tr> <td> "
                + students.getFullname() + "</td>"
                + "<td> " + students.getProject() + "</td>"
                + "</tr></table>", "text/html"); // this sends only the last record on mail.

        System.out.println(students.getFullname() + " " + students.getProject()); // this prints a list of records on console.

    }

    Transport.send(msg);

6 个答案:

答案 0 :(得分:1)

Transport.send(msg);也将它放在for循环中。像这样,

   private String myBody = "";
  for(int i = 0; i < stud.size(); i++) {

        Student students = studs.get(i);

        myBody += "<table border = '1'><tr>"
                + "<th>Students</th><th>Project</th></tr>"
                + "<tr> <td> "
                + students.getFullname() + "</td>"
                + "<td> " + students.getProject() + "</td>"
                + "</tr></table>", "text/html"); // this sends only the last record on mail.

        System.out.println(students.getFullname() + " " + students.getProject()); // this prints a list of records on console.

    }

    msg.setContent(myBody);
    Transport.send(msg);

答案 1 :(得分:1)

不确定msg的类型是什么,但msg.setContent可能会覆盖您为其设置的上一个值。

假设您希望发送一封电子邮件,请尝试以下内容:

    msg.setContent(msg.getContent () + "<table border = '1'><tr>"
            + "<th>Students</th><th>Project</th></tr>"
            + "<tr> <td> "
            + students.getFullname() + "</td>"
            + "<td> " + students.getProject() + "</td>"
            + "</tr></table>", "text/html");

或者,您可以使用addContent()appendContent()方法代替setContent()

答案 2 :(得分:1)

查看您的代码。您可以遍历每次将邮件内容设置为相同邮件的学生列表。

然后,在循环之后,您发送的消息此时仅包含最后一条消息。

如果要发送多条消息,请将Transport.send(msg)移动到循环中。

答案 3 :(得分:0)

问题是您在for循环中使用msg.setContent()。 所以你基本上只是每次都覆盖内容。最后一次迭代将是邮件中的实际内容。 您可能希望首先使用StringBuilder或其他内容来构建内容。像这样:

StringBuilder content = new StringBuilder();
for(int i = 0; i < stud.size(); i++)
{
    content.append("<table border = '1'><tr>");
    content.append("<th>Students</th><th>Project</th></tr>");
    content.append("<tr> <td> ");
    content.append(students.getFullname() + "</td>");
    content.append("<td> " + students.getProject() + "</td>");
    content.append("</tr></table>");
}
msg.setContent(content.toString(), "text/html");

答案 4 :(得分:0)

由于您只想要一封包含所有学生记录的电子邮件,您需要通过连接或字符串构建器创建所有字符串,如下所示。

String headerStirng = "<table border = '1'><tr>" + "<th>Students</th><th>Project</th></tr>";

        StringBuilder bodyString = new StringBuilder();
        for (int i = 0; i < stud.size(); i++) {

            Student students = studs.get(i);

            bodyString.append("<tr> <td> " + students.getFullname() + "</td>" + "<td> " + students.getProject() + "</td></tr>");

            System.out.println(students.getFullname() + " " + students.getProject());

        }

        String footerStirng = "</table>";
        msg.setContent(headerStirng + bodyString + footerStirng, "text/html");
        Transport.send(msg);

答案 5 :(得分:0)

看看你的循环,你正在覆盖&#39;内容&#39;在for循环的每次迭代中。 最好使用StringBuffer / StringBuilder在循环的每次迭代中连接String,最后设置内容。

    StringBuffer buf = new StringBuffer(); 
    buf.append("<table border = '1'>");
    for(int i = 0; i < stud.size(); i++) {

        Student students = studs.get(i);

       buf.append("<tr>"
                + "<th>Students</th><th>Project</th></tr>"
                + "<tr> <td> "
                + students.getFullname() + "</td>"
                + "<td> " + students.getProject() + "</td>"
                + "</tr>"); 

        System.out.println(students.getFullname() + " " + students.getProject()); 

    }
    buf.append("</table>");
    msg.setContent(buf.toString, "text/html");
    Transport.send(msg);