【问题标题】:Send html email from file with variables from java - java从带有来自java的变量的文件发送html电子邮件 - java
【发布时间】:2016-01-17 03:56:17
【问题描述】:

我想发送一封带有 html 标记文本的电子邮件。 我希望我的代码从我的电脑上的文件中获取消息,并且我希望能够使用我在项目中拥有的变量。 这样我的消息就会出现:你好[用户名] 并且 [username] 是一个变量。

package com.email;

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart;


public class SendMail extends javax.mail.Authenticator { 

  private String _user; 
  private String _pass; 

  private String[] _to = new String[1]; 
  private String _from; 

  private String _port; 
  private String _sport; 

  private String _host; 

  private String _subject; 
  private String _body; 

  private boolean _auth; 

  private boolean _debuggable; 

  private Multipart _multipart; 


  public SendMail() {
    _host = "smtp.live.com"; // default smtp server
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port

    _user = "user@hotmail.com"; // username 
    _pass = "password"; // password 
    _from = "user@hotmail.com"; // email sent from 
    _subject = "Welcome to Ravenous!"; // email subject 
    _body = "<h2 style='font-style: normal;font-weight: 700;Margin-bottom: 0;Margin-top: 0;font-size: 24px;line-height: 32px;font-family: Open Sans,sans-serif;color: #44a8c7;text-align: center'>Welcome to Ravenous!</h2><p style='font-style: normal;font-weight: 400;Margin-bottom: 0;Margin-top: 16px;font-size: 15px;line-height: 24px;font-family: Open Sans,sans-serif;color: #60666d;text-align: center'>Hello, we hope that you enjoy your stay on Ravenous.</p>"; // email body 
    _to[0] = "";
    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    _multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 

  public SendMail(String to) { 
    this(); 
    _user = "user@hotmail.com";
    _pass = "password";

    _to[0] = to; 
  } 

  public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
        addressTo[i] = new InternetAddress(_to[i]); 
      } 
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 

      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setContent(_body, "text/html; charset=utf-8"); 
      _multipart.addBodyPart(messageBodyPart); 

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 

  private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.host", _host); 

    if(_debuggable) { 
      props.put("mail.debug", "true"); 
    } 

    if(_auth) { 
      props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
   // props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.put("mail.smtp.starttls.enable", "true");

    return props; 
  } 

  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 

  public void setBody(String _body) { 
    this._body = _body; 
  } 

  public String[] getTo() { 
    return _to; 
  } 

  public void setTo(String[] _to) { 
    this._to = _to; 
  } 

  public String getFrom() { 
    return _from; 
  } 

  public void setFrom(String _from) { 
    this._from = _from; 
  }
  public String getSubject() { 
    return _subject; 
  } 

  public void setSubject(String _subject) { 
    this._subject = _subject; 
  }   
  // more of the getters and setters ….. 
} 

那么我如何从 html 文件中获取我的 html 消息并将其与一些变量一起发送?

这是我的模板文件的样子:

package com.email;

import java.io.*;
import java.util.*;

import com.world.entity.impl.player.Player;

import freemarker.template.*;

public class Template {

    public static String body;

    public static void  getTemplate() throws Exception {

        Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
        cfg.setDirectoryForTemplateLoading(new File("./data/templates/"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

        Map<String, Object> root = new HashMap<String, Object>();
        root.put("userName", SendMail._username);
        Map<String, String> latest = new HashMap<String, String>();
        root.put("latestProduct", latest);
        latest.put("url", "products/greenmouse.html");
        latest.put("name", "green mouse");

        freemarker.template.Template temp = cfg.getTemplate("Welcome.ftl");

        Writer out = new OutputStreamWriter(System.out);
        body = out.toString();
        temp.process(root, out);

    }

}

【问题讨论】:

标签: java html


【解决方案1】:

为此使用模板引擎,我个人使用freemarker 完成此操作。

它允许您在程序旁边存储一个模板,您可以使用从代码传递的变量来填充该模板。

Map root = new HashMap();
root.put("name", "John Doe");
...
Template temp = cfg.getTemplate("mymailtemplate.ftl");
...

在模板中,您只需编写如下内容:

<h1>Welcome ${name}!</h1>

freemarker 页面上有一个很好的example

【讨论】:

  • 非常感谢,我打算用这个,但是我有一个问题。我已经使用了该示例文件并制作了我的 tfl 文件,但是如何在我的脚本中制作电子邮件的正文?
  • 不幸的是,模板不允许直接写入字符串。所以你需要做这样的事情:stackoverflow.com/questions/19181206/…。这样做可以将 Writer 转换为 String,然后可以将此 String 分配给您的 _body。
  • 好的,我这样做了,但现在它没有发送电子邮件。我将我的模板文件添加到主帖中。
  • 交换最后两行:先处理,再赋值给body
  • 我这样做了,但我仍然没有收到电子邮件。你能再帮我一次吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-16
  • 2013-05-26
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多