不需服务端配合)"/>
Android发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)
概述
Android客户端发送图片到指定邮箱在某些业务场景中还是可能会用到,我写这篇文章的目的就是帮助刚要做这个功能的朋友先快速实现功能,然后再去研究他们感兴趣的内容。我在代码中做尽量多的注释,也可以直接看代码。
所需jar包:
- .jar
- .jar
- .jar
发送图片到指定邮箱主要有以下步骤
1.既然是要发送图片肯定先要有bitmap对象(如果是发送已有的图片请直接看步骤2)
- 如果有跟我一样是由服务端提供字符串生成二维码的话可以参考Google开源的zxing二维码生成库,我这边贴一下代码(ZXing相关文件官方下载地址:)
(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发送图片到指定邮箱(仅客户端简单实现,不需服务端配合)
发布评论