Android发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)
概述
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; }
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发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)相关推荐
- 使用两种方式,Android 发送文件到指定邮箱(带多个附件)
第一种方法,调用系统的邮件软件来发送 众所周知在Android中调用其他程序进行相关处理,都是使用的Intent.当然,Email也不例外. 在Android中,调用Email有三种类型的Intent ...
- 树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱
树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱 树莓派开机自启动Python并发送IP地址到指定邮箱 环境 用Python发送邮件 获取WIFI的IP地址 整合发送邮件和获取WIF ...
- 编写Java程序,使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的场景(用户充当客户端,QQ 小冰充当服务端)
查看本章节 查看作业目录 需求说明: 小冰是微软公司研发的人工智能机器人,被腾讯公司加入 QQ 群后,立即受到千万网友的喜爱.现在使用 Socket类模拟用户加入 QQ 群时,QQ 小冰发送欢迎消息的 ...
- python批量下载文件只有1kb_详解如何用python实现一个简单下载器的服务端和客户端...
话不多说,先看代码: 客户端: import socket def main(): #creat: download_client=socket.socket(socket.AF_INET,socke ...
- 一个简单的完成端口(服务端/客户端)类
一个简单的完成端口(服务端/客户端)类 作者:spinoza 翻译:麦子芽儿, POWERCPP(后面部分内容) 下载源代码 原文网址:http://www.codeproject.com/KB/IP ...
- UE4 TCP通信 (UE客户端与网络调试助手服务端、python服务端通信)
目录 一.使用UE4建立TCP客户端 二.使用网络调试助手建立服务端 三.基于网络调试助手的服务端与UE客户端通信 四.基于python的TCP服务端与UE客户端通信 一.使用UE4建立TCP客户端 ...
- 学习 ET(1)- 开源的游戏客户端(基于 unity3d)服务端双端框架
我: 客户端程序员,15+ 以上 C++ 编码经历, 还算扎实.Unity 编码经历 1年,C# 没有单独学过.真不想离开C++的世界,大形势驱使进入了Unity+C#世界. ET - 开源的游戏客户 ...
- 联众服务器超时中断,http连接中客户端中断了请求,服务端会中断执行吗?超时时间设置?...
由于http是基于tcp的,在tcp中,客户端中断了连接,服务端是无法感知的,只能通过发心跳包来检测,而显然我们的nginx是没有发心跳包的,所以,包括nginx,php-fpm都是不知道客户端已断开 ...
- openfire android 发送图片,基于openfire+smack开发Android即时聊天应用[四]-单人聊天、群聊、发送接收文件等...
这篇文章主要介绍如何实现点对点单人聊天.多人的群聊.以及如何给对方发送文件,如何发送图片消息和语音消息等功能. 1.单人聊天 1.首先创建聊天对象 /** * 创建聊天窗口 * @param jid ...
最新文章
- Oracle 并行原理与示例总结
- python大型项目经验_经验丰富程序员才知道的8种高级Python技巧
- SpringCloud Zuul(二)之简单用法
- android是语言吗,android – 内容描述应该是多种语言吗?
- Mixed Content: The page at ‘xxx‘ was loaded over HTTPS, but requested an insecure resource ‘xxx‘.
- Elasticsearch 5.x segments merge 流程分析
- 虚拟机linux下git clone 报SSL connect error错误
- centos7 docker安装_Docker安装运行并连接Centos7容器
- 计算机应用基础253页答案,计算机应用基础作业一(答案)
- AJAX学习摘记——客户端访问WebService(上)
- 黑马程序员全套Java教程_Java基础入门视频教程零基础自学Java必备教程视频讲义(1)
- MSN 无法登陆,错误代码: 80072efd,如何解决
- 小卡的土豆园开园了~
- Android音视频点/直播模块开发
- 英文和中文在计算机的优劣,汉语和英语优缺点的比较(转载)
- Android 使用adb查看和修改电池信息
- JAVA字符串中字符类型的识别和分类(汉字、数字、字母、特殊符号等)
- VR演示室设备使用说明
- 新浪邮箱(@sina.com/@sina.cn):启用IMAP4/SMTP服务+授权码
- 【重读.转】黑客帝国中的佛法义理