Как показать изображение в теле письма?
Примечание. Я не хочу прикреплять изображение к электронной почте
Я хочу показать изображение в теле письма,
Я пробовал тег изображения HTML <img src=\"http://url/to/the/image.jpg\">"
, и я получил вывод, как вы можете видеть в этом моем вопросе о Как добавить изображение в тело электронной почты, поэтому Я устал Html.ImageGetter
.
Это не работает для меня, это также дает мне тот же результат, поэтому я сомневаюсь, что это возможно сделать,
Мой код
Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_EMAIL,new String[] {"[email protected]"});
i.putExtra(Intent.EXTRA_TEXT,
Html.fromHtml("Hi <img src='http://url/to/the/image.jpg'>",
imgGetter,
null));
i.setType("image/png");
startActivity(Intent.createChooser(i,"Email:"));
private ImageGetter imgGetter = new ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable = null;
try {
drawable = getResources().getDrawable(R.drawable.icon);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
} catch (Exception e) {
e.printStackTrace();
Log.d("Exception thrown",e.getMessage());
}
return drawable;
}
};
ОБНОВЛЕНИЕ 1: Если я использую код ImageGetter
для TextView
, я могу получить текст и изображение, но я не могу видеть изображение в теле письма
Вот мой код:
TextView t = null;
t = (TextView)findViewById(R.id.textviewdemo);
t.setText(Html.fromHtml("Hi <img src='http://url/to/the/image.jpg'>",
imgGetter,
null));
ОБНОВЛЕНИЕ 2: Я использовал жирный тег и тег привязки, как показано ниже, эти теги работают нормально, но когда я использовал тег img, я могу увидеть квадратную рамку, которая называется OBJ
i.putExtra(Intent.EXTRA_TEXT,Html.fromHtml("<b>Hi</b><a href='http://www.google.com/'>Link</a> <img src='http://url/to/the/image.jpg'>",
imgGetter,
null));
Ответы
Ответ 1
К сожалению, это невозможно сделать с помощью намерений.
Причина, по которой в тексте EditText отображается текст полужирный, а не изображение StyleSplan реализует Parcelable, тогда как ImageSpan нет. Поэтому, когда Intent.EXTRA_TEXT извлекается в новом действии, ImageSpan не сможет распараллелить и не будет частью стиля, добавленного в EditText.
Использование других методов, в которых вы не передаете данные с помощью Intent, к сожалению, невозможно здесь, так как вы не контролируете принимающую активность.
Ответ 2
Два простых предложения:
- Закройте тэг img (
<img src="..." />
вместо <img src="...">
)
- Используйте
i.setType("text/html")
вместо i.setType("image/png")
Если ни один из них не работает, возможно, вы попытаетесь добавить изображение к электронной почте, а затем ссылаетесь на него, используя "cid:ATTACHED_IMAGE_CONTENT_ID"
, а не "http:URL_TO_IMAGE"
?
Intent i = new Intent(Intent.ACTION_SEND);
i.putExtra(Intent.EXTRA_EMAIL,new String[] {"[email protected]"});
i.putExtra(Intent.EXTRA_STREAM, Uri.parse("http://url/to/the/image.jpg");
i.putExtra(Intent.EXTRA_TEXT,
Html.fromHtml("Hi <img src='cid:image.jpg' />", //completely guessing on 'image.jpg' here
imgGetter,
null));
i.setType("image/png");
См. раздел Отправка HTML-форматированного письма со встроенными изображениями в руководство пользователя электронной почты apache
Хотя, тогда вам нужно будет знать идентификатор содержимого прикрепленного изображения, и я не уверен, что это всплыло через стандартный подход Intent. Может быть, вы можете проверить необработанное письмо и определить их соглашения об именах?
Ответ 3
Я знаю, что это не отвечает на исходный вопрос, но, возможно, приемлемой альтернативой для некоторых людей является привязка изображения к электронной почте. Мне удалось добиться этого с помощью следующего кода...
String urlOfImageToDownload = "https://ssl.gstatic.com/s2/oz/images/google-logo-plus-0fbe8f0119f4a902429a5991af5db563.png";
// Start to build up the email intent
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" });
i.putExtra(Intent.EXTRA_SUBJECT, "Check Out This Image");
i.putExtra(Intent.EXTRA_TEXT, "There should be an image attached");
// Do we need to download and attach an icon and is the SD Card available?
if (urlOfImageToDownload != null && Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
// Download the icon...
URL iconUrl = new URL(urlOfImageToDownload);
HttpURLConnection connection = (HttpURLConnection) iconUrl.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap immutableBpm = BitmapFactory.decodeStream(input);
// Save the downloaded icon to the pictures folder on the SD Card
File directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
directory.mkdirs(); // Make sure the Pictures directory exists.
File destinationFile = new File(directory, attachmentFileName);
FileOutputStream out = new FileOutputStream(destinationFile);
immutableBpm.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
Uri mediaStoreImageUri = Uri.fromFile(destinationFile);
// Add the attachment to the intent
i.putExtra(Intent.EXTRA_STREAM, mediaStoreImageUri);
}
// Fire the intent
startActivity(i);
http://www.oliverpearmain.com/blog/android-how-to-launch-an-email-intent-attaching-a-resource-via-a-url/
Ответ 4
i resolve problem send image as a body mail in android
you have need three lib of java mail
1.activation.jar
2.additionnal.jar
3.mail.jar
public class AutomaticEmailActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
final String fromEmail = "[email protected]"; //requires valid gmail id
final String password = "abc"; // correct password for gmail id
final String toEmail = "[email protected]"; // can be any email id
System.out.println("SSLEmail Start");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
props.put("mail.smtp.socketFactory.port", "465"); //SSL Port
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory"); //SSL Factory Class
props.put("mail.smtp.auth", "true"); //Enabling SMTP Authentication
props.put("mail.smtp.port", "465"); //SMTP Port
Authenticator auth = new Authenticator() {
//override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, password);
}
};
final Session session = Session.getDefaultInstance(props, auth);
Button send_email=(Button) findViewById(R.id.send_email);
send_email.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sendImageEmail(session, toEmail,"SSLEmail Testing Subject with Image", "SSLEmail Testing Body with Image");
}
});
}
public static void sendImageEmail(Session session, String toEmail, String subject, String body){
try{
MimeMessage msg = new MimeMessage(session);
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));
msg.setReplyTo(InternetAddress.parse("[email protected]", false));
msg.setSubject(subject, "UTF-8");
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
MimeMultipart multipart = new MimeMultipart("related");
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
messageBodyPart.setContent(htmlText, "text/html");
// add it
multipart.addBodyPart(messageBodyPart);
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
String filename = base + "/photo.jpg";
messageBodyPart = new MimeBodyPart();
DataSource fds = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID", "<image>");
multipart.addBodyPart(messageBodyPart);
msg.setContent(multipart);
// Send message
Transport.send(msg);
System.out.println("EMail Sent Successfully with image!!");
}catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}