- ارسال مستقیم ایمیل :
* کتابخانه های
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"
,
true
,
false
);
}
@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