티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
Sending Email in Android using JavaMail API without using the default/built-in app
기본 앱을 사용하지 않고 JavaMail API로 이메일 보내기
문제 내용
I am trying to create a mail sending application in Android.
나는 안드로이드로 메일 보내기 앱을 만들려고 한다.
If I use:
사용하는 경우:
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
This will launch the built-in Android application; I'm trying to send the mail on button click directly without using this application.
내장된 Android 응용 프로그램이 실행됩니다. 이 응용 프로그램을 사용하지 않고 버튼 클릭으로 직접 메일을 보내려고 합니다.
높은 점수를 받은 Solution
Send e-mail in Android using the JavaMail API using Gmail authentication.
Gmail 인증을 사용하여 JavaMail API를 사용하여 Android에서 이메일을 보냅니다.
Steps to create a sample Project:
샘플 프로젝트를 만드는 단계:
MailSenderActivity.java:
MailSenderActivity.java:
public class MailSenderActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button send = (Button) this.findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
GMailSender sender = new GMailSender("username@gmail.com", "password");
sender.sendMail("This is Subject",
"This is Body",
"user@gmail.com",
"user@yahoo.com");
} catch (Exception e) {
Log.e("SendMail", e.getMessage(), e);
}
}
});
}
}
GMailSender.java:
GMailSender.java:
public class GMailSender extends javax.mail.Authenticator {
private String mailhost = "smtp.gmail.com";
private String user;
private String password;
private Session session;
static {
Security.addProvider(new com.provider.JSSEProvider());
}
public GMailSender(String user, String password) {
this.user = user;
this.password = password;
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
session = Session.getDefaultInstance(props, this);
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception {
try{
MimeMessage message = new MimeMessage(session);
DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
message.setSender(new InternetAddress(sender));
message.setSubject(subject);
message.setDataHandler(handler);
if (recipients.indexOf(',') > 0)
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
else
message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
Transport.send(message);
}catch(Exception e){
}
}
public class ByteArrayDataSource implements DataSource {
private byte[] data;
private String type;
public ByteArrayDataSource(byte[] data, String type) {
super();
this.data = data;
this.type = type;
}
public ByteArrayDataSource(byte[] data) {
super();
this.data = data;
}
public void setType(String type) {
this.type = type;
}
public String getContentType() {
if (type == null)
return "application/octet-stream";
else
return type;
}
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(data);
}
public String getName() {
return "ByteArrayDataSource";
}
public OutputStream getOutputStream() throws IOException {
throw new IOException("Not Supported");
}
}
}
JSSEProvider.java:
JSEProvider.java:
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Alexander Y. Kleymenov
* @version $Revision$
*/
import java.security.AccessController;
import java.security.Provider;
public final class JSSEProvider extends Provider {
public JSSEProvider() {
super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");
AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() {
public Void run() {
put("SSLContext.TLS",
"org.apache.harmony.xnet.provider.jsse.SSLContextImpl");
put("Alg.Alias.SSLContext.TLSv1", "TLS");
put("KeyManagerFactory.X509",
"org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");
put("TrustManagerFactory.X509",
"org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");
return null;
}
});
}
}
ADD 3 jars found in the following link to your Android Project
Android 프로젝트에 대한 다음 링크에서 발견된 3개의 병 추가
Click here - How to add External Jars
여기를 클릭 - 외부 Jars를 추가하는 방법
And don't forget to add this line in your manifest:
매니페스트에 다음 행을 추가하는 것을 잊지 마십시오.
<uses-permission android:name="android.permission.INTERNET" />
Just click below link to change account access for less secure apps https://www.google.com/settings/security/lesssecureapps
보안이 떨어지는 앱에 대한 계정 액세스를 변경하려면 아래 링크를 클릭하십시오. https://www.google.com/settings/security/lesssecureapps
Run the project and check your recipient mail account for the mail. Cheers!
프로젝트를 실행하고 수신자 메일 계정에서 메일을 확인합니다. 건배!
P.S. And don't forget that you cannot do network operation from any Activity in android. Hence it is recommended to use AsyncTask
or IntentService
to avoid network on main thread exception.
추신: Android의 어떤 Activity에서도 네트워크 작업을 수행할 수 없다는 것을 잊지 마십시오. 따라서 주 스레드의 네트워크 예외를 방지하려면 AsyncTask 또는 IntentService를 사용하는 것이 좋습니다.
Jar files: https://code.google.com/archive/p/javamail-android/
Jar 파일: https://code.google.com/archive/p/javamail-android/
가장 최근 달린 Solution
I found a shorter alternative for others who need help. The code is:
나는 도움이 필요한 다른 사람들을 위한 더 짧은 대안을 찾았다. 코드는 다음과 같습니다.
package com.example.mail;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class SendMailTLS {
public static void main(String[] args) {
final String username = "username@gmail.com";
final String password = "password";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("from-email@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("to-email@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"
+ "\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
Source: Sending Email via JavaMail API
출처: JavaMail API를 통해 이메일 보내기
Hope this Helps! Good Luck!
이것이 도움이 되길 바래요! 행운을 빕니다.
출처 : https://stackoverflow.com/questions/2020088/sending-email-in-android-using-javamail-api-without-using-the-default-built-in-a
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드 CalledFromWrongThreadException 수정하기 (0) | 2022.12.02 |
---|---|
Android에서 화면 크기를 픽셀로 가져오는 방법 (0) | 2022.12.01 |
패키지 이름과 일치하는 클라이언트를 찾을 수 없습니다(Google Analytics) (0) | 2022.12.01 |
웹뷰 net::ERR_CACHE_MISS 오류 메시지 (0) | 2022.12.01 |
Fragment에서 findViewById 사용하기 (0) | 2022.12.01 |