Android实战之 Jmail发送邮件(无需跳转到邮件客户端)

         转载请标明源地址:http://write.blog.csdn.net/postedit/50396718


       最近公司的项目需要一个反馈功能,暂且用邮件发送。发送邮件我首先想到的是可以,但是要手机上安装有邮件客户端,然后跳转发邮件。但是你懂得这样用户体验很不好,一个字烦两个字麻烦。我想有没有一种方法不用跳转到客户端悄无声息地把邮件发送出去了。答案是肯定的,没有你做不到的只有你想不到的,哈哈。那就是JMai技术,我们只需要调用其中的接口就可以了,在这我也就不多唠叨了。需要导入三个包,不用担心,我会把源码奉上,里面啥都有。

需要注意:

1.我测试只有QQ邮箱行得通,163邮箱不行,不知道为什么,有谁知道请赐教。

 2.添加附件时,只能选择图片。本想着通过系统自带的文件管理器能选择任意类型文件,可反复尝试就是不能获取文件路径,也就是说不能把 uri通过cursor转化为 path 

 3.如果在QQ邮箱(设置-账户)中没有开启POP3/SMTP服务,则正常输入密码即可,如果开启了输入密码就不行了,要输入授权码,如"fyxvinfyaajrhcbi",不然会报错javax.mail.AuthenticationFailedException。  QQ邮箱配置如图:


下面是主类代码:

public class MainActivity extends Activity implements View.OnClickListener {

	private Button sendButton, add_attachment;
	private TextView file_dir;
	private EditText email_addr_edit, email_pwd_edit, accept_email_addr_edit;
	private final int FILE_SELECT_CODE = 0;
	private final int FILECHOOSER_RESULTCODE = 1;
	// 附件地址,目前暂时只能添加图片
	private String file_path = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		sendButton = (Button) findViewById(R.id.send_btn);
		add_attachment = (Button) findViewById(R.id.add_attachment);
		file_dir = (TextView) findViewById(R.id.file_dir);
		email_addr_edit = (EditText) this.findViewById(R.id.email_addr_edit);
		email_pwd_edit = (EditText) this.findViewById(R.id.email_pwd_edit);
		accept_email_addr_edit = (EditText) this
				.findViewById(R.id.accept_email_addr_edit);

		sendButton.setOnClickListener(this);
		add_attachment.setOnClickListener(this);
	}

	public void onClick(View view) {
		// TODO Auto-generated method stub
		switch (view.getId()) {
		case R.id.send_btn:
			// TODO Auto-generated method stub
			// 在这里需要注意:1.我测试只有QQ邮箱行得通,163邮箱不行。2.如果在QQ邮箱
			// (设置-账户)中没有开启POP3/SMTP服务,则正常输入密码即可,如果开启了输入密码就不行了,要输入授权码,如
			// "fyxvinfyaajrhcbi",
			// 不然会报错:javax.mail.AuthenticationFailedException
			SenderRunnable senderRunnable = new SenderRunnable(email_addr_edit
					.getText().toString(), email_pwd_edit.getText().toString());
			senderRunnable.setMail("发送邮件的标题", "发送件的内容。。。。。。。。。。。。。。。。。。",
					accept_email_addr_edit.getText().toString(), file_path);
			// 最后一个参数为null表明不发送附件,也可以发送附件,如"/mnt/sdcard/test.txt"
			new Thread(senderRunnable).start();
			break;
		case R.id.add_attachment:
			showFileChooser();
			break;
		}
	}

	/** 调用文件选择软件来选择文件 **/
	private void showFileChooser() {
		Intent i = new Intent(Intent.ACTION_GET_CONTENT);
		i.addCategory(Intent.CATEGORY_OPENABLE);
		// 不知道为什么,这里只能跳转到图片,i.setType("*/*");怎不能正确获取文件路径
		i.setType("image/*");
		startActivityForResult(Intent.createChooser(i, "File Chooser"),
				FILECHOOSER_RESULTCODE);
	}

	/** 根据返回选择的文件,来进行上传操作 **/
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		if (resultCode == Activity.RESULT_OK) {
			// Get the Uri of the selected file
			Uri uri = data.getData();
			Log.d("gaolei", "uri---------------" + uri);
			String[] pojo = { MediaStore.Images.Media.DATA };
			CursorLoader cursorLoader = new CursorLoader(this, uri, pojo, null,
					null, null);
			Cursor cursor = cursorLoader.loadInBackground();
			if (cursor != null) {
				cursor.moveToFirst();
				file_path = cursor.getString(cursor.getColumnIndex(pojo[0]));
				Log.d("gaolei", "file_path---------------" + file_path);
				file_dir.setText(file_path);
			}

		}
		super.onActivityResult(requestCode, resultCode, data);
	}

	// 异步发送邮件
	class SenderRunnable implements Runnable {

		private String user;
		private String password;
		private String subject;
		private String body;
		private String receiver;
		private MailSender sender;
		private String attachment;

		public SenderRunnable(String user, String password) {
			this.user = user;
			this.password = password;
			sender = new MailSender(user, password);
			String mailhost = user.substring(user.lastIndexOf("@") + 1,
					user.lastIndexOf("."));
			if (!mailhost.equals("gmail")) {
				mailhost = "smtp." + mailhost + ".com";
				Log.i("hello", mailhost);
				sender.setMailhost(mailhost);
			}
		}

		public void setMail(String subject, String body, String receiver,
				String attachment) {
			this.subject = subject;
			this.body = body;
			this.receiver = receiver;
			this.attachment = attachment;
		}

		public void run() {
			// TODO Auto-generated method stub
			try {
				sender.sendMail(subject, body, user, receiver, attachment);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}


    效果图:

   




             源码下载地址,欢迎光临......



展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值