2015-12-10 24 views
7

Tôi đã viết một chương trình C# để gửi email, hoạt động hoàn hảo. Ngoài ra, tôi có một kịch bản PHP để gửi email, hoạt động hoàn hảo.Gửi email từ webhosting mà không cần phải sử dụng tên người dùng và mật khẩu

Nhưng câu hỏi của tôi là: Có thể gửi một email với C# như bạn làm từ PHP mà bạn không cần phải xác định thông tin, máy chủ, cổng, vv

Tôi muốn sử dụng C# thay vì PHP, bởi vì tôi đang tạo một ứng dụng web ASP.Net.

Đây là hiện mã của tôi C#:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using System.Net.Mail; 
using System.Net; 

namespace $rootnamespace$ 
{ 
public partial class $safeitemname$ : Form 
{ 
    public $safeitemname$() 
    { 
     InitializeComponent(); 
    } 

    private void AttachB_Click(object sender, EventArgs e) 
    { 
     if (AttachDia.ShowDialog() == DialogResult.OK) 
     { 
      string AttachF1 = AttachDia.FileName.ToString(); 
      AttachTB.Text = AttachF1; 
      AttachPB.Visible = true; 
      AttachIIB.Visible = true; 
      AttachB.Visible = false; 
     } 
    } 

    private void AttachIIB_Click(object sender, EventArgs e) 
    { 
     if (AttachDia.ShowDialog() == DialogResult.OK) 
     { 
      string AttachF1 = AttachDia.FileName.ToString(); 
      AttachIITB.Text = AttachF1; 
      AttachPB.Visible = true; 

     } 
    } 





    private void SendB_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      SmtpClient client = new SmtpClient(EmailSmtpAdresTB.Text); 
      client.EnableSsl = true; 
      client.Timeout = 20000; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.UseDefaultCredentials = false; 
      client.Credentials = new NetworkCredential(EmailUserNameTB.Text, EmailUserPasswordTB.Text); 
      MailMessage Msg = new MailMessage(); 
      Msg.To.Add(SendToTB.Text); 
      Msg.From = new MailAddress(SendFromTB.Text); 
      Msg.Subject = SubjectTB.Text; 
      Msg.Body = EmailTB.Text; 

      /// Add Attachments to mail or Not 
      if (AttachTB.Text == "") 
      { 
       if (EmailSmtpPortTB.Text != null) 
        client.Port = System.Convert.ToInt32(EmailSmtpPortTB.Text); 

       client.Send(Msg); 
       MessageBox.Show("Successfuly Send Message !"); 
      } 
      else 
      { 
       Msg.Attachments.Add(new Attachment(AttachTB.Text)); 
       Msg.Attachments.Add(new Attachment(AttachIITB.Text)); 
       if (EmailSmtpPortTB.Text != null) 
       client.Port = System.Convert.ToInt32(EmailSmtpPortTB.Text); 

       client.Send(Msg); 
       MessageBox.Show("Successfuly Send Message !"); 
      } 


     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 

    private void settingsBindingNavigatorSaveItem_Click(object sender, EventArgs e) 
    { 
     this.Validate(); 
     this.settingsBindingSource.EndEdit(); 
     this.tableAdapterManager.UpdateAll(this.awDushiHomesDBDataSet); 

    } 

    private void awDushiHomesEmail_Load(object sender, EventArgs e) 
    { 
     // TODO: This line of code loads data into the 'awDushiHomesDBDataSet.Settings' table. You can move, or remove it, as needed. 
     this.settingsTableAdapter.Fill(this.awDushiHomesDBDataSet.Settings); 

    } 
    } 
} 

Đây là cách nó được thực hiện trong PHP:

<?php 
//define the receiver of the email 
$to = '[email protected]'; 

//define the subject of the email 
$subject = 'Test email with attachment'; 

//create a boundary string. It must be unique 
//so we use the MD5 algorithm to generate a random hash 
$random_hash = md5(date('r', time())); 

//define the headers we want passed. Note that they are separated with \r\n 
$headers = "From: [email protected]\r\nReply-To: [email protected]"; 

//add boundary string and mime type specification 
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\""; 

//read the atachment file contents into a string, 
//encode it with MIME base64, 
//and split it into smaller chunks 
$attachment = chunk_split(base64_encode(file_get_contents('PDFs\Doc1.pdf'))); 

//define the body of the message. 
ob_start(); //Turn on output buffering 
?> 

--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>" 

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit 

Hello World!!! 
This is simple text email message. 

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1" 
Content-Transfer-Encoding: 7bit 

<h2>Hello World!</h2> 
<p>This is something with <b>HTML</b> formatting.</p> 

--PHP-alt-<?php echo $random_hash; ?>-- 

--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: application/zip; name="Doc1.pdf" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

<?php echo $attachment; ?> 
--PHP-mixed-<?php echo $random_hash; ?>-- 

<?php 
//copy current buffer contents into $message variable and delete current output buffer 
$message = ob_get_clean(); 

//send the email 
$mail_sent = @mail($to, $subject, $message, $headers); 
//if the message is sent successfully print "Mail sent". Otherwise print "Mail failed" 
echo $mail_sent ? "Mail sent" : "Mail failed"; 
?> 

Tôi không yêu cầu để bạn có thể viết mã của tôi, nhưng có lẽ bạn có thể cung cấp một số thông tin hoặc cho tôi biết nếu nó có thể hay không.

Edit:

Câu hỏi của tôi không được về việc không sử dụng một máy chủ smtp nhưng làm thế nào để gửi một email mà không cần phải nhập tên tài khoản và mật khẩu. Tôi biết, nó sẽ chỉ hoạt động nếu yêu cầu gửi email đến từ máy chủ của tôi.

+3

Trên thực tế PHP * không * sử dụng [cài đặt khác nhau mail server] (http: // php. net/manual/en/mail.configuration.php), tuy nhiên chúng được lưu trữ trong tệp php.ini và có các giá trị mặc định dựng sẵn. Tôi cho rằng bạn có thể thay đổi chúng trong thời gian chạy với 'ini_set()' nếu bạn cần thực hiện các thay đổi không phải là toàn hệ thống. – Mike

+0

@ Giống như tôi đã không thực sự biết những gì để tìm nhưng tôi googled rất nhiều, có thể cho những điều sai trái ... tôi sẽ thử các liên kết bạn đã cho tôi. client.UseDefaultCredentials = true; trông đầy hứa hẹn. – Creator

+0

Thực ra tôi đã xóa nhận xét cuối cùng của mình bởi vì tôi không nghĩ rằng điều đó tôi đã làm. Nó xuất hiện được sử dụng khi bạn cần xác thực với máy chủ thư. Đúng nếu tôi sai. Tôi không biết C# chút nào. – Mike

Trả lời

11

Lý do tại sao trong PHP bạn có thể gửi thư mà không chỉ định thông tin đăng nhập SMTP là vì ai đó đã định cấu hình php.ini hoặc sendmail.ini cho bạn (tệp mà trình thông dịch php sử dụng để nhận một số giá trị).

Trường hợp này thường xảy ra với quản lý lưu trữ (hoặc nếu bạn sử dụng php trên máy tính của mình bằng các công cụ như AMPPS có thể giúp bạn chỉnh sửa dễ dàng cài đặt SMTP thông qua giao diện người dùng và quên nó).

Trong ASP.net/C# có các app.config hoặc web.config tập tin, nơi bạn có thể tiêm cài đặt smtp (trong thẻ <mailSettings>) và do đó đạt được kết quả tương tự như PHP (các SmtpClient sẽ tự động sử dụng thông tin đăng nhập được lưu trữ ở đó).

Xem những câu hỏi này cho một ví dụ:

SmtpClient and app.config system.net configuration

SMTP Authentication with config file's MailSettings

+0

Và đây chính là câu trả lời. Máy chủ PHP phải được cấu hình bởi một ai đó, để làm cho 'mail' hoạt động. – yergo

+0

Ngoài ra, bạn có thể nói rằng ông có thể làm xước các thông tin đăng nhập nếu một SMTP không cần xác thực được cấu hình. –

1

Tại các bài đăng này, có khả năng đây sẽ là bản sao của, bạn sẽ tìm thấy một vài cách để gửi email bằng ASP.NET.

Lưu ý: Bạn không thể gửi email mà không cần một máy chủ smtp, mặc dù bạn không cần một trong những của riêng bạn nếu ai đó cho phép bạn sử dụng của họ.

+0

anh ấy thích gửi email mà không cần sử dụng smtp –

+0

@GoudaElalfy Cập nhật câu trả lời của tôi, và một máy chủ smtp là cần thiết ở đâu đó ... ngay cả với php. – LGSon

+0

@LGSon tôi đã nhận nó để làm việc từ Làm thế nào để gửi email trong ASP.NET C# liên kết bạn đã cho tôi. Điều buồn cười duy nhất là phải mất 30 phút để có được email. nhưng tôi gues nó không có gì để làm với mã nhưng với máy chủ. – Creator

1

Nếu bạn đã cài đặt php trong máy chủ của bạn chỉ đơn giản là bạn có thể gửi email thông qua chức năng chính php. Bạn không cần thông tin đăng nhập.

Việc xây dựng trong email chức năng của php gửi là

mail($to,$subject,$message,$header); 

Bạn có thể sử dụng mã này cho sự hiểu biết chi tiết

// recipients 
    $to = "[email protected]"; // note the comma 
    // subject 
    $subject = 'Testing Email'; 

    // message 
    $message = " Hello, I am sending email"; 

    // To send HTML mail, the Content-type header must be set 
    $headers = 'MIME-Version: 1.0' . "\r\n"; 
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 

    // Additional headers 
    $headers .= 'To: 'Zahir' <'[email protected]'>' . "\r\n"; 
    $headers .= 'From: Admin | Hello Softs <[email protected]>' . "\r\n"; 


    // Mail it 
    mail($to, $subject, $message, $headers); 
1
Host : localhost 
OS : Ubuntu 12.04 + 
Language : PHP 

Install sendmail trong hệ điều hành của bạn

sudo apt-get install sendmail 

Tạo một file thử mail.php
Viết mã bên:

<?php 
$to  = '[email protected]'; 
$subject = 'Test Mail'; 
$message = 'hello how are you ?'; 
$headers = 'From: [email protected]' . "\r\n" . 
    'Reply-To: [email protected]' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

if(mail($to, $subject, $message, $headers)){ 
    echo "Mail send"; 
}else{ 
    echo "Not send"; 
} 

echo "Now here"; 
?> 

Mail sẽ được gửi đến [email protected]

Note: Bạn don; t cần để viết tên người dùng/mật khẩu.

1

Bạn có thể định cấu hình phần cài đặt thư trong tệp web.config trong ứng dụng web của mình như được hiển thị bên dưới. Nếu trang web của bạn được lưu trữ bởi một công ty lưu trữ bên thứ ba, bạn có thể yêu cầu họ cung cấp chi tiết smtp (tên người dùng smtp, mật khẩu smtp, tên máy chủ hoặc IP và số cổng). Nếu bạn có cấu hình này trong web.config và smtp được bật (trên máy chủ), thì bạn sẽ có thể gửi email mà không chỉ định thông tin đăng nhập trong mã C#.

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network password="password01" userName="smtpUsername" host="smtp.server.com" port="25"/> 
     </smtp> 
    </mailSettings> 
</system.net> 
0

Bạn có thể gửi mail mà không SMTP hay "mà không cần phải" thông tin: Không ..

Nếu bạn không muốn viết thông tin quan trọng của bạn trong file php của bạn (trong giai đoạn phát triển), bạn có thể sử dụng .env

https://github.com/vlucas/phpdotenv

dụ .env file:

DB_HOST='example' 
DB_PORT='example' 
DB_USER='postgres' 
DB_PASS='example' 
SMTP_HOST='example' 
SMTP_PORT='example' 
SMTP_USER='example' 
SMTP_PASS='example' 
HOST='example' 

sau đó bạn có thể sử dụng các biến env trong file php của bạn:

getenv('SMTP_USER') 

Ngoài ra bạn có thể crypt file .env hoặc thiết lập không truy cập công cộng .Nhưng đây không phải là vấn đề an ninh quan trọng nhất một người nên quan tâm. . Nếu ai đó đột nhập vào máy chủ của bạn, bạn đã gặp rắc rối ..

tôi không phải là một nhà phát triển NET MVC nhưng bạn có thể set environmental variables (trong giai đoạn phát triển) quá

Dù sao bạn cần phải viết chúng ở đâu đó hoặc họ đã được viết .. Và nó không phải là một mối quan tâm an ninh lớn trừ khi bạn đăng bài yo mã ur nơi nào đó như github vv ..

LƯU Ý RẰNG: có các biến môi trường có thể gây ra vấn đề hiệu suất trong sản xuất đặc biệt là với php

Các vấn đề liên quan