JavaMail寄送郵件,使用ssl(tls)及帳號Auth認證

相關JavaMail的介紹可以參考Java程式Mail、EDM(電子型錄)寄送

最近使用synology架設了mail server,然後利用Let’s Encrypt加載了SSL功能,所以改寫了寄送郵件的程式。

有關synology架mail server部份可以參考

如何讓 Synology NAS 成為郵件伺服器

NAS也可以輕鬆成為郵件伺服器與Web Mail

如何將DSM(NAS)變成Mail Server

Let’s Encrypt安裝的部份可以由synology自動取得。

JavaMail send Mail程式碼如下

package com.izero.mail.thread;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import com.sun.mail.util.MailSSLSocketFactory;

public class Sender  {
	private String content;
	
	private org.apache.log4j.Logger log ;
	private String subject;
	private ArrayList<InternetAddress> to;
	private Properties p;
	public Sender(ArrayList<InternetAddress> to,String subject,String content,Properties p)
	{
		super();
		this.content = content;
		this.to = to;
		log = org.apache.log4j.Logger.getLogger(this.getClass());
		this.p = p;
		this.subject = subject;
	}
	
	
	public void run() {
		try {

			// 設定傳送基本資訊
			String host = p.getProperty("host");

			String from = p.getProperty("from");

			
			String user=p.getProperty("user");
			String pwd=p.getProperty("pwd");
			String port = p.getProperty("port");
			
			Properties props = System.getProperties();

			log.info(user);
			log.info(pwd);
			log.info(from);
			log.info("mail.smtp.host="+ host);
			log.info("mail.smtp.auth="+ true);
			log.info("mail.smtp.port="+ port);
			
			// 設定SMTP server

			props.put("mail.smtp.host", host);
			props.put("mail.smtp.auth", "true");
			//props.put("mail.smtp.port", port);
			//props.put("mail.smtp.starttls.enable", true);
			//使用ssl或tls連線
			MailSSLSocketFactory sf = new MailSSLSocketFactory();
			sf.setTrustAllHosts(true); 
			props.put("mail.imap.ssl.trust", "*");
			props.put("mail.imap.ssl.socketFactory", sf);
			//認證
			Authenticator auth = new SMTPAuthenticator(user,pwd);
			// 依據Properties建立一個Session
			Session mailSession = Session.getInstance(props, auth);
			

			// 從Session建立一個Message

			/*Message mailMessage = new MimeMessage(mailSession);
			// Set from email address
			mailMessage.setFrom(new InternetAddress(from));
			// Set to mail address
			mailMessage.setRecipient(Message.RecipientType.TO,
					new InternetAddress(to));
			// 設定標題
			mailMessage.setSubject("Hello JavaMail");
			// 設定Mail內容
			mailMessage.setText("Wellcome to  JavaMail...加油!!");*/
			
			
			MimeMessage message = new MimeMessage(mailSession);
			message.setFrom(new InternetAddress(from,p.getProperty("fromName","big5")));
			// System.out.println(p.getProperty("fromName","utf-8"));
			  /*new InternetAddress(
					  to)*/
			  for(int i = 0 ; i < to.size();i++)
				  message.addRecipient(Message.RecipientType.TO, to.get(i));
			  // 加入標題
			  message.setSubject(this.subject);
			  
			  message.setSentDate(new Date());
			  // 向multipart增加個別內容body
			  Multipart multipart = new MimeMultipart();

			  //設定內容本文
			  BodyPart contentPart = new MimeBodyPart();
			 //Multi
			  contentPart.setContent(content,"text/plain;charset=big5");//給BodyPart對像設置內容和格式/編碼方式
			  //純文字內容
			  //contentPart.setText(content);
			  multipart.addBodyPart(contentPart);

			  // 增加附件
			  // BodyPart messageBodyPart = new MimeBodyPart();
			  // DataSource source = new FileDataSource(affix);
			  // 增加附件的内容
			  // messageBodyPart.setDataHandler(new DataHandler(source));
			  // 附件標題
			  // 使用base64編碼,讓傳送過程內容不會變亂碼
			  // sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
			  // messageBodyPart.setFileName(MimeUtility.encodeText(filename,"BIG5","B"));
			  // multipart.addBodyPart(messageBodyPart);

			  // 將multipart放到message中
			  message.setContent(multipart);
			  // 保存郵件
			  message.saveChanges();
			
			
			Transport transport = mailSession.getTransport("smtp");
			// 傳送
			transport.connect(host, user, pwd);
			transport.sendMessage(message, message.getAllRecipients());
			transport.close();
			log.info(to+",寄送完成");
			//Transport.send(mailMessage);

			//System.out.println("\n Mail was sent successfully.");

		} catch (Exception e) {

			log.info(this.to+"-"+e.getMessage());
			e.printStackTrace();

		}

	}
	private class SMTPAuthenticator extends javax.mail.Authenticator {
		private String SMTP_AUTH_PWD;
		private String SMTP_AUTH_USER;
		public SMTPAuthenticator(String SMTP_AUTH_USER,String SMTP_AUTH_PWD)
		{
			super();
			this.SMTP_AUTH_USER = SMTP_AUTH_USER;
			this.SMTP_AUTH_PWD = SMTP_AUTH_PWD;
		}
        public PasswordAuthentication getPasswordAuthentication() {
           String username = SMTP_AUTH_USER;
           String password = SMTP_AUTH_PWD;
           System.out.println(SMTP_AUTH_USER+";"+SMTP_AUTH_PWD);
           return new PasswordAuthentication(username, password);
        }
    }
}

測試的source

public static void main(String args[])throws Exception
	{
		ArrayList<InternetAddress> to = new ArrayList<InternetAddress>();
		if(args.length==0)
		{
			to.add(new InternetAddress("yku@mailserver"));
		}else
		{
			for(int i = 0 ; i < args.length;i++)
				to.add(new InternetAddress(args[i]));
		}
		
		Properties p= new Properties();
		//log.info((new java.io.File("mail.properties")).getAbsoluteFile());
		System.out.println((new java.io.File("mail.properties")).getAbsoluteFile());
		java.io.FileReader fr = new java.io.FileReader("mail.properties");
		java.io.BufferedReader br = new java.io.BufferedReader(fr);
		String str;
		while((str=br.readLine())!=null)
		{
			String[] tmp = str.split("=");
			p.setProperty(tmp[0], tmp[1]);
		}
		br.close();
		fr.close();
		com.izero.mail.thread.Sender sender = new com.izero.mail.thread.Sender(to,"測試信件","內容如下:",p);
		sender.run();
		//new Main(to);
		
	}

設定檔內容範例

host=smtp.mailserver
port=587
from=yku@mailserver
auth=true
user=yku
pwd=password
fromName=顯示寄送者為誰

 

發表迴響