My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

۲ مطلب در تیر ۱۳۹۳ ثبت شده است

-  ارسال مستقیم ایمیل :

 * کتابخانه های Javamail_ android  رو به برنامه خود اضافه کنید .

برای رسیدن به هدفتون این سه jar رو دانلود کنید و به برناتون اضافه کنید.

*از Gmail SMTP استفاده کنید.

هر ایمیل نیاز به یک مقصد دارد.  درست است که ما یک ایمیل آدرس رو به عنوان مقصد در نظر می گیریم ولی برای ارسال آن باید ایمیل رو به یک SMTP server بفرستیم. چون ما نمی دونیم که کاربر ها در کدام شبکه هستند وقتی که برنامه ما را اجرا می کنند و همچنین پورت های gmail معمولا باز هستند و در اختیار برنامه نویسان قرار می گیرد.

متد زیر نشان می دهد که چگونه با استفاده از یک نمونه از شی javax.mail.Session  از Gmail SMTP Server استقاده کنیم:

private Session createSessionObject() {
    Properties properties = new Properties();
    properties.put("mail.smtp.auth""true");
    properties.put("mail.smtp.starttls.enable""true");
    properties.put("mail.smtp.host""smtp.gmail.com");
    properties.put("mail.smtp.port""587");
    return Session.getInstance(properties, new javax.mail.Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);}});}

 توجه : برای username  و password  می توانید هم به صورت هارد کد وارد کنید و هم ...!

* پیغام خود رو تهیه کنید:

private Message createMessage(String email,String subject,String messageBody,Session session) throws MessagingException, UnsupportedEncodingException {
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress("sara.zakizadeh@gmail.com",
"Sara Zakizadeh"));
    message.addRecipient(Message.RecipientType.TO,
new InternetAddress(email, email));
    message.setSubject(subject);
    message.setText(messageBody);
    return message;}

 *برای ارسال مستقیم ایمیل از AsyncTask استفاده کنید.

در اندروید، انصال به شبکه و اینترنت نباید در main thread اتفاق بیفتد. در واقع وقتی شما تلاش می کنید که این ارتباط را در main thread انجام  دهید شما با خطا زیر مواجه می شوید :

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}:

android.os.NetworkOnMainThreadException

یک راه ساده برای حل این مشکل این است که از ایمیل را از یک AsyncTask ارسال کنیم.

برای این کار من یک کلاس داخلی رو تعریف کردم:

private class SendMailTask extends AsyncTask<Message, Void, Void> {
    private ProgressDialog progressDialog;
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog =ProgressDialog.show(MainActivity.this,"Please wait",
"Sending mail"truefalse);
    }
 @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();}
 @Override
    protected Void doInBackground(Message... messages) {
        try {
            Transport.send(messages[0]);
        catch (MessagingException e) {
            e.printStackTrace();
        }
        return null;}}
0
این کار نه تنها ایمیل شما را در thread دیگری ارسال می کند بلکه شما می توانید در صورت تمایل یک بازخوردی از ارسال ایمیل هم به کاربر نشان دهید با استفاده از progress bar.

 * همه را یکجا سر هم کنید!

وقتی کدهای ذکر شده در بالا را به Activity  مورد نظر اضافه کردید می توانید با متد زیر ایمیلتون رو ارسال کنید.

private void sendMail(String email, String subject, String messageBody) {
    Session session = createSessionObject();
 
    try {
        Message message = createMessage(email,subject,messageBody,session);
        new SendMailTask().execute(message);
    catch (AddressException e) {
        e.printStackTrace();
    catch (MessagingException e) {
        e.printStackTrace();
    catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

}

نمونه کد در Git Hub

۰ نظر موافقین ۳ مخالفین ۰ ۲۳ تیر ۹۳ ، ۱۶:۲۹
سارا زکی زاده

ارسال ایمیل در اپلیکیشن اندروید به دو صورت قابل اجراست:

روش اول:

 - یک روش آسان و راحت، راهنمایی کاربر به اپلیکیشن ایمیل از برنامه خودتان با استفاده ار قطعه کد زیر:

1
2
3
4
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","abc@gmail.com"null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

برنامه انتخاب شده باز می شه و یک ایمیل جدید ساخته می شود با موضوع و مقصدی که برنامه نویس از قبل مشخص کرده است.این اجازه میده که کاربر خودش انتخاب کنه با استفاده از چه برنامه ای می خواد که ایمیل رو  ارسال کنه

این روش برای مواردی که می خواهید کاربر ایمیلی را ارسال کند بسیار مناسب است. ولی شرایطی را در نظر بگیرید که می خواهید برنامه ایملی را ارسال کند. فرض کنید شما یک برنامه مانیتورینگ دارید و یا می خواهید برنامه شما در صورت بروز خطایی ... خطا را برای شما ایمیل کنند.

برای موارد ذکر شده باید روش دیگری را به کار برد ؛

روش دوم در پست بعدی تشریح می شود.

۰ نظر موافقین ۳ مخالفین ۰ ۲۳ تیر ۹۳ ، ۰۱:۰۶
سارا زکی زاده