2015-10-18 121 views
0

我想發送一個電子郵件與HTML標記文本。 我希望我的代碼從我的電腦上的文件中獲取消息,並且希望能夠使用我在項目中使用的變量。 ,這樣我的消息就像:Hello [用戶名] ,[username]是一個變量。從文件發送HTML電子郵件與變量從java - java

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 = "[email protected]"; // username 
    _pass = "password"; // password 
    _from = "[email protected]"; // 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 = "[email protected]"; 
    _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); 

    } 

} 
+0

退房這個環節上好的example。希望它有助於http://www.tutorialspoint.com/java/java_sending_email.htm –

回答

1

使用這個模板引擎,我個人freemarker這樣做。

它允許您將模板與您的程序一起存儲,您可以使用通過代碼傳遞的變量來填充該模板。

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

在模板中,您只需編寫這樣的事:

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

有FreeMarker的頁面

+0

非常感謝,我將使用這個,但我有一個問題。 我已經使用該示例文件並創建了我的tfl文件,但是如何使我的腳本中的電子郵件正文? – xX4m4zingXx

+0

不幸的是,模板不允許直接寫入字符串。所以你需要做這樣的事情:http://stackoverflow.com/questions/19181206/how-to-convert-writer-to-string。這樣做可以將Writer轉換爲String,然後可以將此String分配給_body。 – Marged

+0

好的,我做到了,但現在沒有發送電子郵件。 我將我的模板文件添加到主帖子中。 – xX4m4zingXx