diff --git a/src/com/netease/qa/emmagee/activity/MainPageActivity.java b/src/com/netease/qa/emmagee/activity/MainPageActivity.java index c95a254b04d052eb9fda2df6664186d791e1bab6..445154aa8314a8d927269a8b7fdcf29f02ddbc08 100644 --- a/src/com/netease/qa/emmagee/activity/MainPageActivity.java +++ b/src/com/netease/qa/emmagee/activity/MainPageActivity.java @@ -16,12 +16,11 @@ */ package com.netease.qa.emmagee.activity; -import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; import java.util.List; +import java.util.Properties; import android.app.Activity; import android.app.AlertDialog; @@ -39,8 +38,6 @@ import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CompoundButton; @@ -82,9 +79,6 @@ public class MainPageActivity extends Activity { public void onCreate(Bundle savedInstanceState) { Log.i(LOG_TAG, "MainActivity::onCreate"); super.onCreate(savedInstanceState); - requestWindowFeature(Window.FEATURE_NO_TITLE); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.mainpage); createNewFile(); processInfo = new ProcessInfo(); @@ -132,6 +126,9 @@ public class MainPageActivity extends Activity { }); } + /** + * customized BroadcastReceiver + */ public class UpdateReceiver extends BroadcastReceiver { @Override @@ -143,6 +140,7 @@ public class MainPageActivity extends Activity { } } + @Override protected void onStart() { Log.d(LOG_TAG, "onStart"); receiver = new UpdateReceiver(); @@ -168,15 +166,22 @@ public class MainPageActivity extends Activity { private void createNewFile() { Log.i(LOG_TAG, "create new file to save setting data"); settingTempFile = getBaseContext().getFilesDir().getPath() - + "\\Emmagee_Settings.txt"; + + "\\EmmageeSettings.properties"; + Log.i(LOG_TAG, "settingFile = " + settingTempFile); File settingFile = new File(settingTempFile); if (!settingFile.exists()) { try { settingFile.createNewFile(); - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( - new FileOutputStream(settingFile))); - bw.write("5" + "\r\n" + "true"); - bw.close(); + Properties properties = new Properties(); + properties.setProperty("interval", "5"); + properties.setProperty("isfloat", "true"); + properties.setProperty("sender", ""); + properties.setProperty("password", ""); + properties.setProperty("recipients", ""); + properties.setProperty("smtp", ""); + FileOutputStream fos = new FileOutputStream(settingTempFile); + properties.store(fos, "Setting Data"); + fos.close(); } catch (IOException e) { Log.d(LOG_TAG, "create new file exception :" + e.getMessage()); } diff --git a/src/com/netease/qa/emmagee/activity/SettingsActivity.java b/src/com/netease/qa/emmagee/activity/SettingsActivity.java index 19949adb4db732901745954c8aa6ffefe97ec7fc..8f3b71a87fff687f556221b58846244999981dd8 100644 --- a/src/com/netease/qa/emmagee/activity/SettingsActivity.java +++ b/src/com/netease/qa/emmagee/activity/SettingsActivity.java @@ -16,12 +16,13 @@ */ package com.netease.qa.emmagee.activity; -import java.io.BufferedWriter; +import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.RandomAccessFile; +import java.util.Properties; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import android.app.Activity; import android.content.Intent; @@ -35,10 +36,11 @@ import android.widget.EditText; import android.widget.Toast; import com.netease.qa.emmagee.R; +import com.netease.qa.emmagee.utils.EncryptData; /** * Setting Page of Emmagee - * + * */ public class SettingsActivity extends Activity { @@ -47,8 +49,15 @@ public class SettingsActivity extends Activity { private CheckBox chkFloat; private EditText edtTime; - private String time; + private EditText edtRecipients; + private EditText edtSender; + private EditText edtPassword; + private EditText edtSmtp; + private String time, sender; + private String prePassword, curPassword; private String settingTempFile; + private String recipients, smtp; + private String[] receivers; @Override public void onCreate(Bundle savedInstanceState) { @@ -56,28 +65,32 @@ public class SettingsActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.settings); + final EncryptData des = new EncryptData("emmagee"); Intent intent = this.getIntent(); settingTempFile = intent.getStringExtra("settingTempFile"); chkFloat = (CheckBox) findViewById(R.id.floating); edtTime = (EditText) findViewById(R.id.time); + edtSender = (EditText) findViewById(R.id.sender); + edtPassword = (EditText) findViewById(R.id.password); + edtRecipients = (EditText) findViewById(R.id.recipients); + edtSmtp = (EditText) findViewById(R.id.smtp); + Button btnSave = (Button) findViewById(R.id.save); boolean floatingTag = true; - RandomAccessFile raf; try { - raf = new RandomAccessFile(settingTempFile, "r"); - String f = raf.readLine(); - if (f == null || ("".equals(f))) { - time = "5"; - } else { - time = f; - } - String tag = raf.readLine(); - if ("false".equals(tag)) { - floatingTag = false; - } - raf.close(); + Properties properties = new Properties(); + properties.load(new FileInputStream(settingTempFile)); + String interval = properties.getProperty("interval").trim(); + String isfloat = properties.getProperty("isfloat").trim(); + sender = properties.getProperty("sender").trim(); + prePassword = properties.getProperty("password").trim(); + recipients = properties.getProperty("recipients").trim(); + time = "".equals(interval) ? "5" : interval; + floatingTag = "false".equals(isfloat) ? false : true; + recipients = properties.getProperty("recipients"); + smtp = properties.getProperty("smtp"); } catch (FileNotFoundException e) { Log.e(LOG_TAG, "FileNotFoundException: " + e.getMessage()); e.printStackTrace(); @@ -87,11 +100,40 @@ public class SettingsActivity extends Activity { } edtTime.setText(time); chkFloat.setChecked(floatingTag); + edtRecipients.setText(recipients); + edtSender.setText(sender); + edtPassword.setText(prePassword); + edtSmtp.setText(smtp); + // edtTime.setInputType(InputType.TYPE_CLASS_NUMBER); btnSave.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { time = edtTime.getText().toString().trim(); + sender = edtSender.getText().toString().trim(); + if (!"".equals(sender) && !checkMailFormat(sender)) { + Toast.makeText(SettingsActivity.this, "发件人邮箱格式不正确", + Toast.LENGTH_LONG).show(); + return; + } + recipients = edtRecipients.getText().toString().trim(); + receivers = recipients.split("\\s+"); + for (int i = 0; i < receivers.length; i++) { + if (!"".equals(receivers[i]) + && !checkMailFormat(receivers[i])) { + Toast.makeText(SettingsActivity.this, + "收件人邮箱" + receivers[i] + "格式不正确", + Toast.LENGTH_LONG).show(); + return; + } + } + curPassword = edtPassword.getText().toString().trim(); + smtp = edtSmtp.getText().toString().trim(); + if (checkMailConfig(sender, recipients, smtp, curPassword) == -1) { + Toast.makeText(SettingsActivity.this, "邮箱配置不完整,请完善所有信息", + Toast.LENGTH_LONG).show(); + return; + } if (!isNumeric(time)) { Toast.makeText(SettingsActivity.this, "输入数据无效,请重新输入", Toast.LENGTH_LONG).show(); @@ -105,12 +147,31 @@ public class SettingsActivity extends Activity { Toast.LENGTH_LONG).show(); } else { try { - BufferedWriter bw = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream( - settingTempFile))); - time = Integer.toString(Integer.parseInt(time)); - bw.write(time + "\r\n" + chkFloat.isChecked()); - bw.close(); + Properties properties = new Properties(); + properties.setProperty("interval", time); + properties.setProperty("isfloat", + chkFloat.isChecked() ? "true" : "false"); + properties.setProperty("sender", sender); + Log.d(LOG_TAG, "sender=" + sender); + try { + // FIXME 注释 + properties.setProperty( + "password", + curPassword.equals(prePassword) ? curPassword + : ("".equals(curPassword) ? "" + : des.encrypt(curPassword))); + Log.d(LOG_TAG, "curPassword=" + curPassword); + Log.d(LOG_TAG, + "encrtpt=" + des.encrypt(curPassword)); + } catch (Exception e) { + properties.setProperty("password", ""); + } + properties.setProperty("recipients", recipients); + properties.setProperty("smtp", smtp); + FileOutputStream fos = new FileOutputStream( + settingTempFile); + properties.store(fos, "Setting Data"); + fos.close(); Toast.makeText(SettingsActivity.this, "保存成功", Toast.LENGTH_LONG).show(); Intent intent = new Intent(); @@ -136,9 +197,32 @@ public class SettingsActivity extends Activity { super.onDestroy(); } + private int checkMailConfig(String sender, String recipients, String smtp, + String curPassword) { + if (!"".equals(curPassword) && !"".equals(sender) + && !"".equals(recipients) && !"".equals(smtp)) { + return 1; + } else if ("".equals(curPassword) && "".equals(sender) + && "".equals(recipients) && "".equals(smtp)) { + return 0; + } else + return -1; + } + + /** + * 检查邮件格式正确性 + */ + private boolean checkMailFormat(String mail) { + String strPattern = "^[a-zA-Z][\\w\\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\\w\\.-]*" + + "[a-zA-Z0-9]\\.[a-zA-Z][a-zA-Z\\.]*[a-zA-Z]$"; + Pattern p = Pattern.compile(strPattern); + Matcher m = p.matcher(mail); + return m.matches(); + } + /** * is input a number. - * + * * @param inputStr * input string * @return true is numeric diff --git a/src/com/netease/qa/emmagee/service/EmmageeService.java b/src/com/netease/qa/emmagee/service/EmmageeService.java index 3159ad2a3b3876212dacb177a813a0aed94f5cf0..bff50e21c18f63b8752f8ca4935a7f24e5f49efc 100644 --- a/src/com/netease/qa/emmagee/service/EmmageeService.java +++ b/src/com/netease/qa/emmagee/service/EmmageeService.java @@ -18,14 +18,15 @@ package com.netease.qa.emmagee.service; import java.io.BufferedWriter; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.io.RandomAccessFile; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; +import java.util.Properties; import android.app.Activity; import android.app.Service; @@ -49,8 +50,9 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; -//import com.netease.qa.emmagee.activity.MainPageActivity; import com.netease.qa.emmagee.utils.CpuInfo; +import com.netease.qa.emmagee.utils.EncryptData; +import com.netease.qa.emmagee.utils.MailSender; import com.netease.qa.emmagee.utils.MemoryInfo; import com.netease.qa.emmagee.utils.MyApplication; import com.netease.qa.emmagee.R; @@ -89,6 +91,9 @@ public class EmmageeService extends Service { private String processName, packageName, settingTempFile; private int pid, uid; private boolean isServiceStop = false; + private String sender, password, recipients, smtp; + private String[] receivers; + private EncryptData des; public static BufferedWriter bw; public static FileOutputStream out; @@ -106,6 +111,7 @@ public class EmmageeService extends Service { fomart = new DecimalFormat(); fomart.setMaximumFractionDigits(2); fomart.setMinimumFractionDigits(0); + des = new EncryptData("emmagee"); } @Override @@ -158,11 +164,19 @@ public class EmmageeService extends Service { */ private void readSettingInfo(Intent intent) { try { - RandomAccessFile raf = new RandomAccessFile(new File( - settingTempFile), "r"); - time = raf.readLine(); - isFloating = ("true".equals(raf.readLine())) ? true : false; - raf.close(); + Properties properties = new Properties(); + properties.load(new FileInputStream(settingTempFile)); + String interval = properties.getProperty("interval").trim(); + isFloating = "true" + .equals(properties.getProperty("isfloat").trim()) ? true + : false; + sender = properties.getProperty("sender").trim(); + password = properties.getProperty("password").trim(); + recipients = properties.getProperty("recipients").trim(); + time = "".equals(interval) ? "5" : interval; + recipients = properties.getProperty("recipients"); + receivers = recipients.split("\\s+"); + smtp = properties.getProperty("smtp"); } catch (IOException e) { time = "5"; isFloating = true; @@ -315,7 +329,7 @@ public class EmmageeService extends Service { } else { Intent intent = new Intent(); intent.putExtra("isServiceStop", true); - intent.setAction("com.netease.action.emmageeService");// action与接收器相同 + intent.setAction("com.netease.action.emmageeService"); sendBroadcast(intent); stopSelf(); } @@ -408,8 +422,24 @@ public class EmmageeService extends Service { handler.removeCallbacks(task); closeOpenedStream(); isStop = true; - Toast.makeText(this, "测试结果文件:" + EmmageeService.resultFilePath, - Toast.LENGTH_LONG).show(); + boolean isSendSuccessfully = false; + try { + isSendSuccessfully = MailSender.sendTextMail(sender, + des.decrypt(password), smtp, + "Emmagee Performance Test Report", "see attachment", + resultFilePath, receivers); + } catch (Exception e) { + isSendSuccessfully = false; + } + if (isSendSuccessfully) { + Toast.makeText(this, "测试结果报表已发送至邮箱:" + recipients, + Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(this, + "测试结果未成功发送至邮箱,结果保存在:" + EmmageeService.resultFilePath, + Toast.LENGTH_LONG).show(); + } + super.onDestroy(); } diff --git a/src/com/netease/qa/emmagee/utils/CpuInfo.java b/src/com/netease/qa/emmagee/utils/CpuInfo.java index 575b0f54da8058ddaaa995c04bb4ef3959cacff2..5d325873beba06f87a52322dea69581d38edfa45 100644 --- a/src/com/netease/qa/emmagee/utils/CpuInfo.java +++ b/src/com/netease/qa/emmagee/utils/CpuInfo.java @@ -169,8 +169,8 @@ public class CpuInfo { traffic = (lastestTraffic - initialTraffic + 1023) / 1024; processCpuRatio = fomart.format(100 * ((double) (processCpu - processCpu2) / ((double) (totalCpu - totalCpu2)))); - totalCpuRatio = fomart - .format(100 * ((double) ((totalCpu - idleCpu) - (totalCpu2 - idleCpu2)) / (double) (totalCpu - totalCpu2))); + totalCpuRatio = fomart.format(100 * ((double) ((totalCpu - idleCpu) - (totalCpu2 - idleCpu2)) + / (double) (totalCpu - totalCpu2))); long pidMemory = mi.getPidMemorySize(pid, context); String pMemory = fomart.format((double) pidMemory / 1024); long freeMemory = mi.getFreeMemorySize(context); diff --git a/src/com/netease/qa/emmagee/utils/CustomizedAuthenticator.java b/src/com/netease/qa/emmagee/utils/CustomizedAuthenticator.java new file mode 100644 index 0000000000000000000000000000000000000000..947fd7a62e1f544ac2f643e6f14ea9cf6aa3f048 --- /dev/null +++ b/src/com/netease/qa/emmagee/utils/CustomizedAuthenticator.java @@ -0,0 +1,24 @@ +package com.netease.qa.emmagee.utils; + +import javax.mail.*; + +/** + * Customized Authenticator + * + */ +public class CustomizedAuthenticator extends Authenticator { + String userName = null; + String password = null; + + public CustomizedAuthenticator() { + } + + public CustomizedAuthenticator(String username, String password) { + this.userName = username; + this.password = password; + } + + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(userName, password); + } +} diff --git a/src/com/netease/qa/emmagee/utils/EncryptData.java b/src/com/netease/qa/emmagee/utils/EncryptData.java new file mode 100644 index 0000000000000000000000000000000000000000..c3990b68245b3ba0e838e6436d284512b9587fca --- /dev/null +++ b/src/com/netease/qa/emmagee/utils/EncryptData.java @@ -0,0 +1,177 @@ +package com.netease.qa.emmagee.utils; + +import java.security.*; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; + +/** + * 提供加密算法,可以对输入的字符串进行加密、解密操作 + */ +public class EncryptData { + private static String strDefaultKey = "emmagee"; + + private Cipher encryptCipher = null; + + private Cipher decryptCipher = null; + + /** + * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0813, 和public static byte[] + * hexStr2ByteArr(String strIn) 互为可逆的转换过程 + * + * @param arrB + * 需要转换的byte数组 + * @return 转换后的字符串 + * @throws Exception + * 本方法不处理任何异常,所有异常全部抛出 + */ + public static String byteArr2HexStr(byte[] arrB) throws Exception { + int iLen = arrB.length; + // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍 + StringBuffer sb = new StringBuffer(iLen * 2); + for (int i = 0; i < iLen; i++) { + int intTmp = arrB[i]; + // 把负数转换为正数 + while (intTmp < 0) { + intTmp = intTmp + 256; + } + // 小于0F的数需要在前面补0 + if (intTmp < 16) { + sb.append("0"); + } + sb.append(Integer.toString(intTmp, 16)); + } + return sb.toString(); + } + + /** + * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB) + * 互为可逆的转换过程 + * + * @param strIn + * 需要转换的字符串 + * @return 转换后的byte数组 + * @throws Exception + * 本方法不处理任何异常,所有异常全部抛出 + * @author + */ + public static byte[] hexStr2ByteArr(String strIn) throws Exception { + byte[] arrB = strIn.getBytes(); + int iLen = arrB.length; + + // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2 + byte[] arrOut = new byte[iLen / 2]; + for (int i = 0; i < iLen; i = i + 2) { + String strTmp = new String(arrB, i, 2); + arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); + } + return arrOut; + } + + /** + * 默认构造方法,使用默认密钥 + * + * @throws Exception + */ + public EncryptData() throws Exception { + this(strDefaultKey); + } + + /** + * 指定密钥构造方法 + * + * @param strKey + * 指定的密钥 + * @throws Exception + */ + public EncryptData(String strKey) { + try { + Key key = getKey(strKey.getBytes()); + + encryptCipher = Cipher.getInstance("DES"); + encryptCipher.init(Cipher.ENCRYPT_MODE, key); + + decryptCipher = Cipher.getInstance("DES"); + decryptCipher.init(Cipher.DECRYPT_MODE, key); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 加密字节数组 + * + * @param arrB + * 需加密的字节数组 + * @return 加密后的字节数组 + * @throws BadPaddingException + * @throws IllegalBlockSizeException + * @throws Exception + */ + public byte[] encrypt(byte[] arrB) throws Exception { + return encryptCipher.doFinal(arrB); + } + + /** + * 加密字符串 + * + * @param strIn + * 需加密的字符串 + * @return 加密后的字符串 + * @throws Exception + */ + public String encrypt(String strIn) throws Exception { + if (strIn == null) { + strIn = ""; + } + return byteArr2HexStr(encrypt(strIn.getBytes("utf-8"))); + } + + /** + * 解密字节数组 + * + * @param arrB + * 需解密的字节数组 + * @return 解密后的字节数组 + * @throws Exception + */ + public byte[] decrypt(byte[] arrB) throws Exception { + return decryptCipher.doFinal(arrB); + } + + /** + * 解密字符串 + * + * @param strIn + * 需解密的字符串 + * @return 解密后的字符串 + * @throws Exception + */ + public String decrypt(String strIn) throws Exception { + return new String(decrypt(hexStr2ByteArr(strIn))); + } + + /** + * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位 + * + * @param arrBTmp + * 构成该字符串的字节数组 + * @return 生成的密钥 + * @throws java.lang.Exception + */ + private Key getKey(byte[] arrBTmp) throws Exception { + // 创建一个空的8位字节数组(默认值为0) + byte[] arrB = new byte[8]; + + // 将原始字节数组转换为8位 + for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) { + arrB[i] = arrBTmp[i]; + } + + // 生成密钥 + Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES"); + + return key; + } +} diff --git a/src/com/netease/qa/emmagee/utils/MailSender.java b/src/com/netease/qa/emmagee/utils/MailSender.java new file mode 100644 index 0000000000000000000000000000000000000000..a2dee9dedc40b9eafae68f17e6352c0fb0edf024 --- /dev/null +++ b/src/com/netease/qa/emmagee/utils/MailSender.java @@ -0,0 +1,113 @@ +package com.netease.qa.emmagee.utils; + +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.Address; +import javax.mail.BodyPart; +import javax.mail.Message; +import javax.mail.MessagingException; +import javax.mail.Multipart; +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 MailSender { + + private static final String LOG_TAG = MailSender.class.getSimpleName(); + private static final int PORT = 25; + + /** + * 以文本格式发送邮件 + * + * 待发送的邮件的信息 + */ + public static boolean sendTextMail(String sender, String encryptPassword, + String smtp, String subject, String content, String file, + String[] maillists) { + if (maillists == null || maillists.length == 0 + || (maillists[0].trim().equals(""))) { + return false; + } else { + // Get system properties + Properties props = new Properties(); + + // Setup mail server + props.put("mail.smtp.host", smtp); + props.put("mail.smtp.port", PORT); + // Get session + props.put("mail.smtp.auth", "true"); // 如果需要密码验证,把这里的false改成true + + // 判断是否需要身份认证 + CustomizedAuthenticator authenticator = null; + if (true) { + // 如果需要身份认证,则创建一个密码验证器 + authenticator = new CustomizedAuthenticator(sender, + encryptPassword); + } + // 根据邮件会话属性和密码验证器构造一个发送邮件的session + Session sendMailSession = Session.getInstance(props, + authenticator); + try { + // 根据session创建一个邮件消息 + Message mailMessage = new MimeMessage(sendMailSession); + // 创建邮件发送者地址 + Address from = new InternetAddress(sender); + // 设置邮件消息的发送者 + mailMessage.setFrom(from); + // 创建邮件的接收者地址,并设置到邮件消息中 + Address[] tos = null; + + tos = new InternetAddress[maillists.length]; + for (int i = 0; i < maillists.length; i++) { + tos[i] = new InternetAddress(maillists[i]); + } + + // Message.RecipientType.TO属性表示接收者的类型为TO + mailMessage.setRecipients(Message.RecipientType.TO, tos); + // 设置邮件消息的主题 + mailMessage.setSubject(subject); + // 设置邮件消息发送的时间 + mailMessage.setSentDate(new Date()); + + BodyPart bodyPart = new MimeBodyPart(); + bodyPart.setText(content); + + MimeBodyPart attachPart = new MimeBodyPart(); + DataSource source = new FileDataSource(file); + attachPart.setDataHandler(new DataHandler(source)); + attachPart.setFileName(file); + + Multipart multipart = new MimeMultipart(); + multipart.addBodyPart(bodyPart); + multipart.addBodyPart(attachPart); + + mailMessage.setContent(multipart); + 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); + Transport.send(mailMessage); + return true; + } catch (MessagingException ex) { + ex.printStackTrace(); + } + } + return false; + } +}