如何使用javamail和smtp发送带有从数据库中提取的数据的邮件?

时间:2010-08-10 17:42:28

标签: java smtp javamail

我想通过smtp将电子邮件发送到带有java程序(使用javamail)的地址。它实际上是将电子邮件发送到目的地。问题是电子邮件的主体每次都没有完全发送。考虑到我的邮件正文是从数据库中提取的。 这是我的代码:

public static void Bmail(Connection conn, String grav, String state)
    {
        Statement stmt;

        try
        {
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

            ResultSet res = stmt.executeQuery("select ID, Time_C from production where name='"+grav +"' and State='"+state+"'");

            while(res.next())
            {                           
                String id=res.getString("1"), tc=res.getString("2"); 
                    testmail smtpMailSend = new testmail();
                String sub="Alert "+grav+" "+state;
                    String mes=" ID "+id +"\n Stat: "+state +"\n time: "+tc;
                  smtpMailSend.sMail(sub,mes);
             }
         } catch(Exception e)
        {
            e.printStackTrace();
            stmt = null;
        }
    }
public void sMail(String obj,String text)throws MessagingException
{
Properties props = new Properties();
    props.put("mail.smtp.host", d_host);
    props.put("mail.smtp.port", d_port);
    props.put("mail.smtp.starttls.enable","true");
    props.put("mail.smtp.debug", "true");
    props.put("mail.smtp.auth", "true");
    Authenticator auth = new SMTPAuthenticator();
    Session session = Session.getInstance(props, auth);
    session.setDebug(true);
    Message msg = new MimeMessage(session);
    msg.setText(text);
    msg.setContent(text,"text/plain");
    msg.setSubject(obj);
    msg.setFrom(new InternetAddress(d_email));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(m_to));
    msg.saveChanges();
    Transport transport = session.getTransport("smtps");
    transport.connect(d_host, d_port, d_uname, d_password);
    transport.sendMessage(msg, msg.getAllRecipients());
    transport.close();
    }

所以在第一次记录2之后,我没有时间或状态就收到邮件“ID:12345”。

我试过setContent,但我仍然遇到同样的问题。也许内容类型是原因(我正在放置text / plain)?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我在我自己的函数实现中使用了一个DataHandler对象,该函数已经在生产中运行了很长一段时间。 所以我首先创建一个传递电子邮件文本的数据处理程序,然后将其设置为消息的数据处理程序:

DataHandler messageDataHandler = new DataHandler(notification.getMessage(), "text/plain; charset=\"UTF-8\"");
msg.setDataHandler(messageDataHandler);

您还应该像我的示例中那样指定文本编码。