我想通过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)?
感谢您的帮助
答案 0 :(得分:1)
我在我自己的函数实现中使用了一个DataHandler对象,该函数已经在生产中运行了很长一段时间。 所以我首先创建一个传递电子邮件文本的数据处理程序,然后将其设置为消息的数据处理程序:
DataHandler messageDataHandler = new DataHandler(notification.getMessage(), "text/plain; charset=\"UTF-8\"");
msg.setDataHandler(messageDataHandler);
您还应该像我的示例中那样指定文本编码。