如何通过java中的电子邮件从数据库发送数据(表)?

Posted

技术标签:

【中文标题】如何通过java中的电子邮件从数据库发送数据(表)?【英文标题】:How to send data(table) from database via email in java? 【发布时间】:2020-08-26 07:12:47 【问题描述】:

我可以发送常规电子邮件(不是来自数据库),但是如何在电子邮件中发送完整表格? 这是我的代码:

private static Message preparedMessage(Session session, String myAccountEmail,
        String recepient) 
    try 
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(myAccountEmail));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
        message.setSubject("Email using Java");
        String htmlTest="<h2> i'm sending an email!</h2>";
        message.setContent(htmlTest, "text/html"); 
       
        return message;
     catch (Exception ex) 
        Logger.getLogger(JavaMailUtil.class.getName()).log(Level.SEVERE, null, ex);
    
    return null;

我尝试了类似这样的简单方法:

     List <PetrolData> petrolList = MP_RacunDAO.select("03.08.2020", "11.08.2020"); //This is data that i want to put in table
       for(PetrolData pd : petrolList)
        String htmlTable = "<table border='1'> <tr> "
                + "<th>Column 1</td>"
                + "<th>Column 2</td>"
                + "<th>Column 3</td>"
                + "</tr>"
                + "<tr>"
                + "<td>"+pd.getTitle()+"</td>"
                + "<td>"+pd.getSum1()+"</td>"
                + "<td>"+pd.getSum2()+"</td>"                   
                + "</tr>"
                + "</table>";
            

显然,它不适合我,我该怎么办?

【问题讨论】:

为什么要为每个PetrolData 创建一个表?添加一次创建表和表头并为每个PetrolData 添加一行不是更合适吗?如果您不想使用库来创建 html,请使用 StringBuilder,也许... @deHaar 我同意你的观点,这更有意义,但我不知道该怎么做:D 我不能把每个循环放在第一个 &lt;tr&gt; 下。 你能显示class PetrolData吗? @deHaar 它只是一个 POJO 类,我有四个字段,它们的构造函数和吸气剂。你还需要整个class吗? 那么,没必要……总和是什么类型的? int? double?还有什么? 【参考方案1】:

如果您想在不使用任何外部库的情况下连续创建 HMTL 表,您可以使用 StringBuilder

您基本上必须在循环数据之前添加表格的开始标记和标题行,然后为每个PetrolData 添加一行,然后在循环之后添加结束表格的标签。

查看这个示例(它使用了可能不必要的换行符和制表符,但它们对于示例输出很有用,因为我不会在这里发送电子邮件):

public static void main(String[] args) 
    // sample data
    List<PetrolData> petrolDataList = new ArrayList<>();
    petrolDataList.add(new PetrolData("Petrol 1", 4.1f, 8.2f, 12.4f));
    petrolDataList.add(new PetrolData("Petrol 2", 5.3f, 9.2f, 13.24f));
    petrolDataList.add(new PetrolData("Petrol 3", 6.0f, 10.1f, 14.312f));
    petrolDataList.add(new PetrolData("Petrol 4", 7.7f, 11.9f, 15.15f));
    petrolDataList.add(new PetrolData("Petrol 5", 8.45f, 12.0f, 16.936f));
    petrolDataList.add(new PetrolData("Petrol 6", 9.67f, 13.2f, 17.777f));
    
    StringBuilder htmlTableBuilder = new StringBuilder();
    // open the table
    htmlTableBuilder.append("<table border=\"1\">").append(System.lineSeparator());
    // open a rown, header row here
    htmlTableBuilder.append("\t").append("<tr>").append(System.lineSeparator());
    // add the headers to the header row
    htmlTableBuilder.append("\t").append("\t").append("<th>").append("Title").append("</th>").append(System.lineSeparator());
    htmlTableBuilder.append("\t").append("\t").append("<th>").append("Sum 1").append("</th>").append(System.lineSeparator());
    htmlTableBuilder.append("\t").append("\t").append("<th>").append("Sum 2").append("</th>").append(System.lineSeparator());
    htmlTableBuilder.append("\t").append("\t").append("<th>").append("Sum 3").append("</th>").append(System.lineSeparator());
    // close the header row
    htmlTableBuilder.append("\t").append("</tr>").append(System.lineSeparator());
    
    // add a data row for each PetrolData
    for (PetrolData pd : petrolDataList) 
        // open a row again
        htmlTableBuilder.append("\t").append("<tr>").append(System.lineSeparator());
        // add the data
        htmlTableBuilder.append("\t").append("\t").append("<td>").append(pd.getTitle()).append("</td>").append(System.lineSeparator());
        htmlTableBuilder.append("\t").append("\t").append("<td>").append(pd.getSum1()).append("</td>").append(System.lineSeparator());
        htmlTableBuilder.append("\t").append("\t").append("<td>").append(pd.getSum2()).append("</td>").append(System.lineSeparator());
        htmlTableBuilder.append("\t").append("\t").append("<td>").append(pd.getSum3()).append("</td>").append(System.lineSeparator());
        // close the row
        htmlTableBuilder.append("\t").append("</tr>").append(System.lineSeparator());
    
    // and close the table
    htmlTableBuilder.append("</table>");
    
    // then print the result
    System.out.println(htmlTableBuilder.toString());

输出如下,您可以轻松地将其嵌入到有效的 HTML 邮件中:

<table border="1">
    <tr>
        <th>Title</th>
        <th>Sum 1</th>
        <th>Sum 2</th>
        <th>Sum 3</th>
    </tr>
    <tr>
        <td>Petrol 1</td>
        <td>4.099999904632568</td>
        <td>8.199999809265137</td>
        <td>12.399999618530273</td>
    </tr>
    <tr>
        <td>Petrol 2</td>
        <td>5.300000190734863</td>
        <td>9.199999809265137</td>
        <td>13.239999771118164</td>
    </tr>
    <tr>
        <td>Petrol 3</td>
        <td>6.0</td>
        <td>10.100000381469727</td>
        <td>14.312000274658203</td>
    </tr>
    <tr>
        <td>Petrol 4</td>
        <td>7.699999809265137</td>
        <td>11.899999618530273</td>
        <td>15.149999618530273</td>
    </tr>
    <tr>
        <td>Petrol 5</td>
        <td>8.449999809265137</td>
        <td>12.0</td>
        <td>16.93600082397461</td>
    </tr>
    <tr>
        <td>Petrol 6</td>
        <td>9.670000076293945</td>
        <td>13.199999809265137</td>
        <td>17.777000427246094</td>
    </tr>
</table>

注意doubles 的格式,您可能必须应用DecimalFormat 或类似的东西才能显示正确的值。

【讨论】:

谢谢,它现在正在工作。但是一个简单的表格有很多代码。您对外部库有什么想法?这就是程序员一般发送表格的方式吗? 是的,它有很多代码,因为 HTML 需要很多代码。不,程序员通常会使用一个让生活更轻松的库(如this question 中建议的那样),或者拥有具有他们加载/阅读的电子邮件或页面的基本结构的模板文件,然后构建一个表格并将其插入那里。 再次感谢您,您的帮助很大

以上是关于如何通过java中的电子邮件从数据库发送数据(表)?的主要内容,如果未能解决你的问题,请参考以下文章

从db获取数据并通过PHP中的Mailchimp发送邮件

关于如何使用从其电子表格的html表单接收的数据创建pdf并通过电子邮件发送pdf文件的Google应用程序脚本

数据表中的多选行,如何从JSON获取一列数据到php

从 db 获取数据并通过 PHP 中的 Mailchimp 发送邮件

如何将 POST 数据发送到 PHP 中的另一个会话?

如何将标签中的数据从表视图行操作发送到视图控制器?