Android发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)
2017-04-08 10:44
656 查看
概述
Android客户端发送图片到指定邮箱在某些业务场景中还是可能会用到,我写这篇文章的目的就是帮助刚要做这个功能的朋友先快速实现功能,然后再去研究他们感兴趣的内容。我在代码中做尽量多的注释,也可以直接看代码。所需jar包:
http://ohe73xbzs.bkt.clouddn.com/activation.jar http://ohe73xbzs.bkt.clouddn.com/additionnal.jar http://ohe73xbzs.bkt.clouddn.com/mail.jar 使用
发送图片到指定邮箱主要有以下步骤
1.既然是要发送图片肯定先要有bitmap对象(如果是发送已有的图片请直接看步骤2)
如果有跟我一样是由服务端提供字符串生成二维码的话可以参考Google开源的zxing二维码生成库,我这边贴一下代码(ZXing相关文件官方下载地址:https://github.com/zxing/zxing/releases)
(1)首先是单实例构造方法:
private static QRCodeUntil QR_CODE_UNTIL = null; public static QRCodeUntil getInstance() { if (QR_CODE_UNTIL == null) { synchronized (BitmapUnit.class) { QR_CODE_UNTIL = new QRCodeUntil(); } } return QR_CODE_UNTIL; }
(2)构造图片
private static final int BLACK = 0xff000000; /** * 生成一个二维码图像 * 传入的字符串,通常是一个URL * @param widthAndHeight 图像的宽高 */ public Bitmap createQRCode(String str, int widthAndHeight) throws WriterException { Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight); int width = matrix.getWidth(); int height = matrix.getHeight(); int[] pixels = new int[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (matrix.get(x, y)) { pixels[y * width + x] = BLACK; } } } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, width, 0, 0, width, height); return bitmap; }
(3)如果需要向图片添加文字
/** * 向图片添加文字 * */ public Bitmap addTextToBitmap(Bitmap bmpSrc, String text) { int srcWidth = bmpSrc.getWidth();//图片宽度 int srcHeight = bmpSrc.getHeight();//图片高度 // 先计算text所需要的height int textSize = 50;//字体大小 int padding = 3;//字间间距 int textLinePadding = 1;//行间距 int perLineWords = (srcWidth - 2 * padding) / textSize;// 每行的文字数目 int lineNum = text.length() / perLineWords;//行数 lineNum = text.length() % perLineWords == 0 ? lineNum : lineNum + 1; int textTotalHeight = lineNum * (textSize + textLinePadding) + 2 * padding;//完整的文字的高度 Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight + textTotalHeight, Bitmap.Config.ARGB_8888); try { Canvas canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); canvas.drawBitmap(bmpSrc, 0, textTotalHeight, null); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.BLACK); paint.setTextSize(textSize); // canvas.drawText(text, bitmap.getWidth()/2-textSize*text.length()/2, textTotalHeight + padding, paint); canvas.drawText(text, (bitmap.getWidth() - ((text.length() - 2) * textSize - 25)) / 2, textTotalHeight + padding, paint); canvas.save(Canvas.ALL_SAVE_FLAG); canvas.restore(); } catch (Exception e) { bitmap = null; e.getStackTrace(); } return bitmap; }
[b]2.先保存图片到本地(注意:saveFile调用需要异步)
public static void saveFile(Bitmap bm, String fileName) throws IOException { File appDir = new File(Environment.getExternalStorageDirectory(),"这边是你想要保存的本地地址"); if (!appDir.exists()) { appDir.mkdirs(); } String name = fileName + ".jpg"; File file = new File(appDir, name); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { String path = "/sdcard/这边加上你保存的地址"; appDir = new File(path); if (!appDir.exists()) { appDir.mkdirs(); }else{ Log.i("###", "saveImageToGallery: "+"该文件夹已经存在了"); } FileOutputStream fos = new FileOutputStream(file);//开流 bm.compress(Bitmap.CompressFormat.JPEG, 20, fos);//使用compress方法压缩图片 fos.write(BitmapUnit.getInstance().getBitmaptoByte(bm)); fos.close(); } }
3.发送图片到指定邮箱,如果你第一第二步都不需要的话,第三步就是比较关键的步骤了
(a)开头我说了要帮助有这个需求的朋友快速实现,所以我封装了一个工具类
public class Send2EmailUtil { public static String username = "xxxx.com"; // 服务邮箱(from邮箱) public static String password = "xxxxx"; // 邮箱密码 public static String senderNick = "xxxxxxx"; // 发件人昵称 private Properties props; // 系统属性 private Session session; // 邮件会话对象 private MimeMessage mimeMsg; // MIME邮件对象 private Multipart mp; // Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象 private static Send2EmailUtil instance = null; public Send2EmailUtil() { props = System.getProperties(); props.put("mail.smtp.auth", "true"); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "smtp.mxhichina.com");// 注意,如果你是阿里的服务邮箱才用这个 props.put("mail.smtp.port", "25"); props.put("username", username); props.put("password", password); // 建立会话 session = Session.getDefaultInstance(props); session.setDebug(false); } public static Send2EmailUtil getInstance() { if (instance == null) { instance = new Send2EmailUtil(); } return instance; } /** * 发送邮件 * @param from 发件人 * @param to 收件人 * @param copyto 抄送 * @param subject 主题 * @param content 内容 * @param fileList 附件列表 * @return */ public boolean sendMail(String from, String[] to, String[] copyto, String subject, String content, String[] fileList) { boolean success = true; try { mimeMsg = new MimeMessage(session); mp = new MimeMultipart(); // 自定义发件人昵称 String nick = ""; try { nick = javax.mail.internet.MimeUtility.encodeText(senderNick); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 设置发件人 // mimeMsg.setFrom(new InternetAddress(from)); mimeMsg.setFrom(new InternetAddress(from, nick)); // 设置收件人 if (to != null && to.length > 0) { String toListStr = getMailList(to); mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toListStr)); } // 设置抄送人 if (copyto != null && copyto.length > 0) { String ccListStr = getMailList(copyto); mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(ccListStr)); } // 设置主题 mimeMsg.setSubject(subject); // 设置正文 BodyPart bp = new MimeBodyPart(); bp.setContent(content, "text/html;charset=utf-8"); mp.addBodyPart(bp); // 设置附件 if (fileList != null && fileList.length > 0) { for (int i = 0; i < fileList.length; i++) { bp = new MimeBodyPart(); FileDataSource fds = new FileDataSource(fileList[i]); bp.setDataHandler(new DataHandler(fds)); bp.setFileName(MimeUtility.encodeText(fds.getName(), "UTF-8", "B")); mp.addBodyPart(bp); } } mimeMsg.setContent(mp); mimeMsg.saveChanges(); // 发送邮件 if (props.get("mail.smtp.auth").equals("true")) { Transport transport = session.getTransport("smtp"); transport.connect((String)props.get("mail.smtp.host"), (String)props.get("username"), (String)props.get("password")); // transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO)); // transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.CC)); transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients()); transport.close(); } else { Transport.send(mimeMsg); } Log.e("邮件发送成功","邮件发送成功"); } catch (MessagingException e) { e.printStackTrace(); success = false; } catch (UnsupportedEncodingException e) { e.printStackTrace(); success = false; } return success; } /** * 发送邮件 * @param from 发件人 * @param to 收件人, 多个Email以英文逗号分隔 * @param cc 抄送, 多个Email以英文逗号分隔 * @param subject 主题 * @param content 内容 * @param fileList 附件列表 * @return */ public boolean sendMail(String from, String to, String cc, String subject, String content, String[] fileList) { boolean success = true; try { mimeMsg = new MimeMessage(session); mp = new MimeMultipart(); // 自定义发件人昵称 String nick = ""; try { nick = javax.mail.internet.MimeUtility.encodeText(senderNick); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 设置发件人 // mimeMsg.setFrom(new InternetAddress(from)); mimeMsg.setFrom(new InternetAddress(from, nick)); // 设置收件人 if (to != null && to.length() > 0) { mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); } // 设置抄送人 if (cc != null && cc.length() > 0) { mimeMsg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); } // 设置主题 mimeMsg.setSubject(subject); // 设置正文 BodyPart bp = new MimeBodyPart(); bp.setContent(content, "application/octet-stream;charset=utf-8"); mp.addBodyPart(bp); // 设置附件 if (fileList != null && fileList.length > 0) { for (int i = 0; i < fileList.length; i++) { bp = new MimeBodyPart(); FileDataSource fds = new FileDataSource(fileList[i]); bp.setDataHandler(new DataHandler(fds)); bp.setFileName(MimeUtility.encodeText(fds.getName(), "UTF-8", "B")); mp.addBodyPart(bp); } } mimeMsg.setContent(mp); mimeMsg.saveChanges(); // 发送邮件 if (props.get("mail.smtp.auth").equals("true")) { Transport transport = session.getTransport("smtp");
// 这边是服务邮箱以及密码 transport.connect((String)props.get("smtp.mxhichina.com"), (String)props.get("xxx.com"), (String)props.get("xxx")); transport.sendMessage(mimeMsg, mimeMsg.getAllRecipients()); transport.close(); } else { Transport.send(mimeMsg); } } catch (MessagingException e) { e.printStackTrace(); success = false; } catch (UnsupportedEncodingException e) { e.printStackTrace(); success = false; } return success; } public String getMailList(String[] mailArray) { StringBuffer toList = new StringBuffer(); int length = mailArray.length; if (mailArray != null && length < 2) { toList.append(mailArray[0]); } else { for (int i = 0; i < length; i++) { toList.append(mailArray[i]); if (i != (length - 1)) { toList.append(","); } } } return toList.toString(); } public static void send(String toAddress) { String from = username; String[] to = {toAddress}; String[] copyto = {}; String subject = "标题"; String content = "内容"; File file = new File("你所要发的图片的位置"); File[] files = file.listFiles(); String[] fileList = new String[files.length]; if (files != null) { int count = files.length;// 文件个数 for (int i = 0; i < count; i++) { File file1 = files[i]; String path = file1.getPath(); fileList[i] = path; } Send2EmailUtil.getInstance().sendMail(from, to, copyto, subject, content, fileList); // 发送之后删除 for (int i = 0; i < files.length; i++) { files[i].delete(); } } } }
最后:
技术贵在共享,有需要使用或者怎么样的话,直接拿去用就好了,也不用说明出处。
群号:124459262
相关文章推荐
- Android客户端配合Servlert服务端实现简单的数据交互
- Android 客户端与PC服务端socket通信接收与发送图片(终结者)
- android-新闻客户端-离线下载的简单实现(图片部分)
- 如何实现程序调用系统邮件,发送app中抓取的xml图片和内容到指定的邮箱
- Android(iOS)重写smtp,发送图片到指定邮箱,偶尔失败问题
- Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据
- android客户端和servlet服务端的简单登录实现
- Android Retrofit Multipart图片上传至webapi,客户端发送请求,服务端却收到两个请求的原因
- Android 使用javaMail jar包发送邮件到指定邮箱,并可以发送图片附件
- 数据报实现简单的客户端发送数据,服务端接收数据
- 基于Socket的TCP长连接(服务端Java+客户端Android),Service配合AIDL实现
- Python服务端,通过TCP发送一张图片给Android客户端,客户端把图片显示出来
- Android 用socket实现客户端发送消息,服务端显示消息
- 实现Android手机(服务端)与PC(客户端)实现通信
- Android通过手势实现图片按照指定路径移动
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- android 简单实现获取网络图片
- Silverlight程序中实现客户端截图发送到服务端
- java 实现简单http服务端,客户端DEMO
- 16—【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能