Mail هي مكتبة إنترنت لـ Ruby مصممة للتعامل مع توليد البريد الإلكتروني ، وتحليل وإرسال بطريقة بسيطة ، Rubyesque.
الغرض من هذه المكتبة هو توفير نقطة وصول واحدة للتعامل مع جميع وظائف البريد الإلكتروني ، بما في ذلك إرسال واستقبال البريد الإلكتروني. تتم جميع إجراءات نوع الشبكة من خلال أساليب الوكيل إلى Net :: SMTP ، Net :: Pop3 إلخ.
تم تصميمه من تجربتي مع TMAIL ، وهو مصمم ليكون تطبيقًا روبيًا نقيًا يجعل توليد وإرسال وتحليل البريد الإلكتروني بدون تفكير.
كما أنه مصمم من الألف إلى الياء للعمل مع الإصدارات الأكثر حداثة من روبي. تعامل الياقوت الحديثة مع ترميزات النص بشكل رائع أكثر من ذي قبل ، لذا فقد استفادت هذه الميزات بشكل كامل في هذه المكتبة مما يسمح للبريد بالتعامل مع الرسائل بشكل أكثر نظافة من TMAIL.
أخيرًا ، تم تصميم Mail مع نظام بسيط للغاية موجه نحو الكائنات يفتح حقًا رسائل البريد الإلكتروني التي تقوم بتجليلها ، إذا كنت تعرف ما تفعله ، فيمكنك تململ كل جزء آخر من بريدك الإلكتروني مباشرة.
نعم أنت! يتم استخدام البريد في عدد لا يحصى من التطبيقات من قبل الناس في جميع أنحاء العالم. إنه ، مثل كل البرامج المفتوحة المصدر ، عمل من الحب الذي يتحمله وقت فراغنا. إذا كنت ترغب في أن تقول شكرا ، يرجى التنقيب والمساهمة إلى جانبنا! فرز وإصلاح مشكلات github ، تحسين وثائقنا ، إضافة ميزات جديدة - لك! شكرا لك على الترويج.
يتم اختبار البريد ضد:
مع إصدار إصدارات جديدة من Ruby ، ستكون Mail متوافقة مع دعم "المعاينة" وجميع "الصيانة العادية" و "الصيانة الأمنية" وإصدارات "نهاية الحياة" الأخيرة المدرجة في صفحة فروع الصيانة Ruby. طلبات السحب للمساعدة في إضافة دعم إصدارات المعاينة الجديدة أكثر من موضع ترحيب.
يتم اختبار كل التزام البريد من خلال إجراءات GitHub على جميع إصدارات Ruby المدعومة.
إذا كنت ترغب في مناقشة البريد مع الأفراد مثل التفكير ، فيرجى الاشتراك في مجموعة Google.
Mail هو RFC5322 و RFC6532 الآن ، أي أنه يمكن تحليل البريد الإلكتروني US-ASCII و UTF-8 وإنشاء البريد الإلكتروني US-USCII. هناك عدد قليل من بناء جملة البريد الإلكتروني المفقود الذي سيواجهه ، ولكنه أيضًا قوي للغاية ، يعني ، إذا وجد شيئًا لا يفهمه ، فلن يعطل ، بدلاً من ذلك ، سيتخطى المشكلة ويستمر في التحليل. في حالة الرأس الذي لا يفهمه ، سيقوم بتشغيل الرأس كحقل اختياري غير منظم ويستمر في التحليل.
هذا يعني أن البريد لن (على الإطلاق) بياناتك (على ما أظن).
يمكنك أيضًا إنشاء رسائل بريد إلكتروني MIME. هناك طرق مساعدة لصنع بريد إلكتروني متعدد/بديل للنص/العادي والنص/HTML (الزوج الأكثر شيوعًا) ويمكنك إنشاء أي نوع آخر من البريد الإلكتروني الآخر.
بجوار TODO:
أساسا ... نحن نفعل BDD على البريد. لا يتم كتابة أي طريقة في البريد دون مواصفات مقابلة أو تغطي. نتوقع كحد أدنى 100 ٪ تغطية تقاسها RCOV. في حين أن هذا ليس مثاليًا بأي مقياس ، إلا أنه جيد جدًا. بالإضافة إلى ذلك ، يجب أن تمر جميع الاختبارات الوظيفية من TMAIL قبل إصدار الأحجار الكريمة.
وهذا يعني أيضًا أنه يمكنك التأكد من أن البريد سوف يتصرف بشكل صحيح.
يمكنك تشغيل الاختبارات محليًا عن طريق تشغيل bundle exec rspec
.
يمكنك إجراء اختبارات على جميع إصدارات Ruby المدعومة باستخدام ACT.
لا توجد API عمليات إزالة ضمن إصدار نقطة واحدة. جميع عمليات الإزالة التي سيتم إهمالها من خلال تحذيرات لإطلاق نقطة ثانوية واحدة على الأقل قبل الإزالة.
أيضا ، جميع الأساليب الخاصة أو المحمية التي يجب إعلانها على هذا النحو - على الرغم من أن هذا لا يزال I/P.
التثبيت بسيط إلى حد ما ، أستضيف البريد على Rubygems ، حتى تتمكن من القيام به فقط:
# gem install mail
إذا لم تكن تعرف ، فإن التعامل مع الترميزات في رسائل البريد الإلكتروني ليس مستقيمًا كما تأمل.
لقد حاولت تبسيطها بعض:
جميع الكائنات التي يمكن أن يتم تقديمها إلى بريد إلكتروني ، لها طريقة #encoded
. سوف يعيد الترميز الكائن كسلسلة كاملة جاهزة لإرسال نظام البريد ، أي أنه سيشمل حقل الرأس والقيمة و CRLF في النهاية ولفه حسب الحاجة.
جميع الكائنات التي يمكن أن يتم تقديمها إلى بريد إلكتروني ، لها طريقة #decoded
. ستعمل فك التشفير على إرجاع "قيمة" الكائن فقط كسلسلة. هذا يعني أنه لن يشمل حقول الرأس (مثل "إلى:" أو "الموضوع:").
افتراضيًا ، سيتصل الاتصال بـ #to_s
على كائن حاوية عن طريقته المشفرة ، بينما سيقوم #to_s
على كائن الحقل بالاتصال بأسلوبه فك التشفير. لذا ، فإن الاتصال بـ #to_s
على كائن بريد سيعيد البريد ، وكلها مشفرة جاهزة للإرسال ، أثناء الاتصال بـ #to_s
على الحقل من الحقل أو سيعيد الجسم القيمة التي تم فك تشفيرها للكائن. يعتبر كائن رأس البريد حاوية. إذا كنت موضع شك ، اتصل بـ #encoded
، أو #decoded
بشكل صريح ، فهذا أكثر أمانًا إذا لم تكن متأكدًا.
ستوفر الحقول المهيكلة التي لها قيم المعلمات التي يمكن ترميزها (مثل نوع المحتوى) قيم المعلمة التي تم فك تشفيرها عند استدعاء أسماء المعلمات كطرق مقابل الكائن.
ستوفر الحقول المهيكلة التي لها قيم المعلمات التي يمكن ترميزها (مثل نوع المحتوى) قيمًا مشفرة للمعلمة عند الاتصال بأسماء المعلمة من خلال object.parameters['<parameter_name>']
.
من فضلك افعل! المساهمة سهلة في البريد. يرجى قراءة المستند المساهمة. لمزيد من المعلومات.
يجب أن تكون جميع وظائف البريد الرئيسية قادرة على الحدوث من وحدة البريد. لذلك ، يجب أن تكون قادرًا على require 'mail'
للبدء.
تم توثيق mail
بشكل جيد في رمز Ruby. يمكنك البحث عنها على سبيل المثال في Rubydoc.info.
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'This is a test email'
body File . read ( 'body.txt' )
end
mail . to_s #=> "From: [email protected]: you@...
mail = Mail . new do
body File . read ( 'body.txt' )
end
mail [ 'from' ] = '[email protected]'
mail [ :to ] = '[email protected]'
mail . subject = 'This is a test email'
mail . header [ 'X-Custom-Header' ] = 'custom value'
mail . to_s #=> "From: [email protected]: you@...
mail = Mail . new do
to '[email protected]'
body 'Some simple body'
end
mail . to_s =~ /Message - ID: <[ d w _]+@.+.mail/ #=> 27
سيقوم البريد تلقائيًا بإضافة حقل معرف الرسائل إذا كان مفقودًا ومنحه معرف رسالة عشوائي فريد على غرار:
mail = Mail . new do
to '[email protected]'
message_id '<[email protected]>'
body 'Some simple body'
end
mail . to_s =~ /Message - ID: <[email protected]>/ #=> 27
سيأخذ البريد message_id الذي تخصصه له الثقة في أنك تعرف ما تفعله.
الإعدادات الافتراضية للبريد للإرسال عبر SMTP إلى المنفذ المضيف المحلي 25. إذا كان لديك SendMail أو Postfix Daemon قيد التشغيل على هذا المنفذ ، فإن إرسال البريد الإلكتروني سهل مثل:
Mail . deliver do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file '/full/path/to/somefile.png'
end
أو
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file :filename => 'somefile.png' , :content => File . read ( '/somefile.png' )
end
mail . deliver!
يمكن أن يتم إرسال عبر SendMail مثل:
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file :filename => 'somefile.png' , :content => File . read ( '/somefile.png' )
end
mail . delivery_method :sendmail
mail . deliver
إرسال عبر SMTP (على سبيل المثال إلى Mailcatcher)
Mail . defaults do
delivery_method :smtp , address : "localhost" , port : 1025
end
يتطلب exim مدير التوصيل الخاص به ، ويمكن استخدامه على النحو التالي:
mail . delivery_method :exim , :location => "/usr/bin/exim"
mail . deliver
قد يتم "تسليم" البريد إلى ملف السجل ، أيضًا ، للتطوير والاختبار:
# Delivers by logging the encoded message to $stdout
mail . delivery_method :logger
# Delivers to an existing logger at :debug severity
mail . delivery_method :logger , logger : other_logger , severity : :debug
يمكنك تكوين البريد لتلقي البريد الإلكتروني باستخدام retriever_method
داخل Mail.defaults
:
# e.g. POP3
Mail . defaults do
retriever_method :pop3 , :address => "pop.gmail.com" ,
:port => 995 ,
:user_name => '<username>' ,
:password => '<password>' ,
:enable_ssl => true
end
# IMAP
Mail . defaults do
retriever_method :imap , :address => "imap.mailbox.org" ,
:port => 993 ,
:user_name => '<username>' ,
:password => '<password>' ,
:enable_ssl => true
end
يمكنك الوصول إلى البريد الإلكتروني الوارد بعدة طرق.
آخر البريد الإلكتروني:
Mail . all #=> Returns an array of all emails
Mail . first #=> Returns the first unread email
Mail . last #=> Returns the last unread email
أول 10 رسائل بريد إلكتروني تم فرزها حسب التاريخ بترتيب تصاعدي:
emails = Mail . find ( :what => :first , :count => 10 , :order => :asc )
emails . length #=> 10
أو حتى جميع رسائل البريد الإلكتروني:
emails = Mail . all
emails . length #=> LOTS!
mail = Mail . read ( '/path/to/message.eml' )
mail . envelope_from #=> '[email protected]'
mail . from . addresses #=> ['[email protected]', '[email protected]']
mail . sender . address #=> '[email protected]'
mail . to #=> '[email protected]'
mail . cc #=> '[email protected]'
mail . subject #=> "This is the subject"
mail . date . to_s #=> '21 Nov 1997 09:55:06 -0600'
mail . message_id #=> '<[email protected]>'
mail . decoded #=> 'This is the body of the email...
العديد من الطرق المتاحة.
mail = Mail . read ( 'multipart_email' )
mail . multipart? #=> true
mail . parts . length #=> 2
mail . body . preamble #=> "Text before the first part"
mail . body . epilogue #=> "Text after the last part"
mail . parts . map { | p | p . content_type } #=> ['text/plain', 'application/pdf']
mail . parts . map { | p | p . class } #=> [Mail::Message, Mail::Message]
mail . parts [ 0 ] . content_type_parameters #=> {'charset' => 'ISO-8859-1'}
mail . parts [ 1 ] . content_type_parameters #=> {'name' => 'my.pdf'}
ينشئ البريد شجرة من الأجزاء. كل رسالة لها أجزاء كثيرة أو معدومة. كل جزء هو رسالة أخرى يمكن أن تحتوي على أجزاء كثيرة أو معدومة.
لن يكون للرسالة أجزاء إلا إذا كانت نوع محتوى متعدد/مختلط أو متعدد الصلة/محدد حدود محددة.
mail . attachments . each do | attachment |
# Attachments is an AttachmentsList object containing a
# number of Part objects
if ( attachment . content_type . start_with? ( 'image/' ) )
# extracting images for example...
filename = attachment . filename
begin
File . open ( images_dir + filename , "w+b" , 0644 ) { | f | f . write attachment . decoded }
rescue => e
puts "Unable to save data for #{ filename } because #{ e . message } "
end
end
end
Mail يجعل بعض الافتراضات الأساسية ويجعل القيام بالشيء الشائع بسيطًا قدر الإمكان .... (يسأل الكثير من مكتبة البريد)
mail = Mail . deliver do
part :content_type => "multipart/mixed" do | p1 |
p1 . part :content_type => "multipart/related" do | p2 |
p2 . part :content_type => "multipart/alternative" ,
:content_disposition => "inline" do | p3 |
p3 . part :content_type => "text/plain; charset=utf-8" ,
:body => "Here is the attachment you wanted n "
p3 . part :content_type => "text/html; charset=utf-8" ,
:body => "<h1>Funky Title</h1><p>Here is the attachment you wanted</p> n "
end
end
add_file '/path/to/myfile.pdf'
end
from "Mikel Lindsaar <[email protected]>"
to "[email protected]"
subject "First multipart email sent with Mail"
end
يقوم Mail ثم يسلم البريد الإلكتروني في نهاية الكتلة ويقوم بإرجاع كائن البريد الناتج عن البريد :: ، والذي يمكنك بعد ذلك فحصه إذا كنت ترغب في ذلك ...
puts mail.to_s #=>
Date: Tue, 26 Apr 2022 20:12:07 +0200
From: Mikel Lindsaar <[email protected]>
To: [email protected]
Message-ID: <[email protected]>
Subject: First multipart email sent with Mail
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="--==_mimepart_626835f733867_10873fdfa3c2ffd494636";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f733867_10873fdfa3c2ffd494636
Content-Type: multipart/mixed;
boundary="--==_mimepart_626835f73382a_10873fdfa3c2ffd494518";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f73382a_10873fdfa3c2ffd494518
Content-Type: multipart/related;
boundary="--==_mimepart_626835f7337f5_10873fdfa3c2ffd494438";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f7337f5_10873fdfa3c2ffd494438
Content-Type: multipart/alternative;
boundary="--==_mimepart_626835f733702_10873fdfa3c2ffd494376";
charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Content-ID: <[email protected]>
----==_mimepart_626835f733702_10873fdfa3c2ffd494376
Content-Type: text/plain;
charset=utf-8
Content-Transfer-Encoding: 7bit
Here is the attachment you wanted
----==_mimepart_626835f733702_10873fdfa3c2ffd494376
Content-Type: text/html;
charset=utf-8
Content-Transfer-Encoding: 7bit
<h1>Funky Title</h1><p>Here is the attachment you wanted</p>
----==_mimepart_626835f733702_10873fdfa3c2ffd494376--
----==_mimepart_626835f7337f5_10873fdfa3c2ffd494438--
----==_mimepart_626835f73382a_10873fdfa3c2ffd494518--
----==_mimepart_626835f733867_10873fdfa3c2ffd494636
Content-Type: text/plain;
charset=UTF-8;
filename=myfile.txt
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=myfile.txt
Content-ID: <6
[email protected]>
Hallo,
Test
End
----==_mimepart_626835f733867_10873fdfa3c2ffd494636--
يقوم البريد بإدراج ترميز نقل المحتوى ، وإصدار MIME ، وأعداد المحتوى ويتعامل مع نوع المحتوى والحدود.
يفترض Mail أنه إذا كان نصك في الجسم هو US-ASCII فقط ، فإن ترميز النقل الخاص بك هو 7bit وهو نص/عادي. يمكنك تجاوز هذا بإعلانه بشكل صريح.
لست مضطرًا لاستخدام كتلة مع النص المشمل ، ويمكنك القيام بذلك بشكل تعريفي. ومع ذلك ، تحتاج إلى إضافة البريد :: قطع الغيار إلى بريد إلكتروني ، وليس البريد :: الرسائل.
mail = Mail . new do
to '[email protected]'
from 'Mikel Lindsaar <[email protected]>'
subject 'First multipart email sent with Mail'
end
text_part = Mail :: Part . new do
body 'This is plain text'
end
html_part = Mail :: Part . new do
content_type 'text/html; charset=UTF-8'
body '<h1>This is HTML</h1>'
end
mail . text_part = text_part
mail . html_part = html_part
النتائج في نفس البريد الإلكتروني كما تم القيام به باستخدام نموذج الكتلة
@mail = Mail . read ( '/path/to/bounce_message.eml' )
@mail . bounced? #=> true
@mail . final_recipient #=> rfc822;[email protected]
@mail . action #=> failed
@mail . error_status #=> 5.5.0
@mail . diagnostic_code #=> smtp;550 Requested action not taken: mailbox unavailable
@mail . retryable? #=> false
يمكنك فقط قراءة الملف على المسار المطلق ، سيحاول Mail تخمين MIME_TYPE وسيقوم بتشفير الملف في BASE64 لك.
@mail = Mail . new
@mail . add_file ( "/path/to/file.jpg" )
@mail . parts . first . attachment? #=> true
@mail . parts . first . content_transfer_encoding . to_s #=> 'base64'
@mail . attachments . first . mime_type #=> 'image/jpg'
@mail . attachments . first . filename #=> 'file.jpg'
@mail . attachments . first . decoded == File . read ( '/path/to/file.jpg' ) #=> true
أو يمكنك تمرير File_Data ومنحه اسم ملف ، مرة أخرى ، سيحاول Mail أن يخمن MIME_TYPE لك.
@mail = Mail . new
@mail . attachments [ 'myfile.pdf' ] = File . read ( 'path/to/myfile.pdf' )
@mail . parts . first . attachment? #=> true
@mail . attachments . first . mime_type #=> 'application/pdf'
@mail . attachments . first . decoded == File . read ( 'path/to/myfile.pdf' ) #=> true
يمكنك أيضًا تجاوز نوع وسائط MIME الذي تم تخمينه إذا كنت تعرف حقًا أفضل من البريد (يجب أن تكون هناك حاجة إليها)
@mail = Mail . new
@mail . attachments [ 'myfile.pdf' ] = { :mime_type => 'application/x-pdf' ,
:content => File . read ( 'path/to/myfile.pdf' ) }
@mail . parts . first . mime_type #=> 'application/x-pdf'
بالطبع ... سوف يتجول البريد في رحلة مرفق أيضًا
@mail = Mail . new do
to '[email protected]'
from 'Mikel Lindsaar <[email protected]>'
subject 'First multipart email sent with Mail'
text_part do
body 'Here is the attachment you wanted'
end
html_part do
content_type 'text/html; charset=UTF-8'
body '<h1>Funky Title</h1><p>Here is the attachment you wanted</p>'
end
add_file '/path/to/myfile.pdf'
end
@round_tripped_mail = Mail . new ( @mail . encoded )
@round_tripped_mail . attachments . length #=> 1
@round_tripped_mail . attachments . first . filename #=> 'myfile.pdf'
انظر "اختبار واستخراج المرفقات" أعلاه لمزيد من التفاصيل.
إذا كان البريد جزءًا من نظامك ، فستحتاج إلى طريقة لاختباره دون إرسال رسائل بريد إلكتروني فعليًا ، فيمكن أن يقوم TestMailer بذلك نيابة عنك.
require 'mail'
=> true
Mail . defaults do
delivery_method :test
end
=> #<Mail::Configuration:0x19345a8 @delivery_method=Mail::TestMailer>
Mail :: TestMailer . deliveries
=> [ ]
Mail . deliver do
to '[email protected]'
from '[email protected]'
subject 'testing'
body 'hello'
end
=> #<Mail::Message:0x19284ec ...
Mail :: TestMailer . deliveries . length
=> 1
Mail :: TestMailer . deliveries . first
=> #<Mail::Message:0x19284ec ...
Mail :: TestMailer . deliveries . clear
=> [ ]
هناك أيضًا مجموعة من مطاعم RSPEC المسروقة/المستوحاة من مطابقة Mucha's Actionmailer (سترغب في تعيين delivery_method
على النحو الوارد أعلاه أيضًا):
Mail . defaults do
delivery_method :test # in practice you'd do this in spec_helper.rb
end
RSpec . describe "sending an email" do
include Mail :: Matchers
before ( :each ) do
Mail :: TestMailer . deliveries . clear
Mail . deliver do
to [ '[email protected]' , '[email protected]' ]
from '[email protected]'
subject 'testing'
body 'hello'
end
end
it { is_expected . to have_sent_email } # passes if any email at all was sent
it { is_expected . to have_sent_email . from ( '[email protected]' ) }
it { is_expected . to have_sent_email . to ( '[email protected]' ) }
# can specify a list of recipients...
it { is_expected . to have_sent_email . to ( [ '[email protected]' , '[email protected]' ] ) }
# ...or chain recipients together
it { is_expected . to have_sent_email . to ( '[email protected]' ) . to ( '[email protected]' ) }
it { is_expected . to have_sent_email . with_subject ( 'testing' ) }
it { is_expected . to have_sent_email . with_body ( 'hello' ) }
# Can match subject or body with a regex
# (or anything that responds_to? :match)
it { is_expected . to have_sent_email . matching_subject ( /test(ing)?/ ) }
it { is_expected . to have_sent_email . matching_body ( /h(a|e)llo/ ) }
# Can chain together modifiers
# Note that apart from recipients, repeating a modifier overwrites old value.
it { is_expected . to have_sent_email . from ( '[email protected]' ) . to ( '[email protected]' ) . matching_body ( /hell/ )
# test for attachments
# ... by specific attachment
it { is_expected . to have_sent_email . with_attachments ( my_attachment ) }
# ... or any attachment
it { is_expected . to have_sent_email . with_attachments ( any_attachment ) }
# ... or attachment with filename
it { is_expected . to have_sent_email . with_attachments ( an_attachment_with_filename ( 'file.txt' ) ) }
# ... or attachment with mime_type
it { is_expected . to have_sent_email . with_attachments ( an_attachment_with_mime_type ( 'application/pdf' ) ) }
# ... by array of attachments
it { is_expected . to have_sent_email . with_attachments ( [ my_attachment1 , my_attachment2 ] ) } #note that order is important
#... by presence
it { is_expected . to have_sent_email . with_any_attachments }
#... or by absence
it { is_expected . to have_sent_email . with_no_attachments }
end
ملفات التوصيف في المواصفات/المباريات/رسائل البريد الإلكتروني/من _trec_2005 هي من Corpus TREC Public Spam 2005. يبقون حقوق الطبع والنشر بموجب شروط هذا المشروع واتفاقية الترخيص. يتم استخدامها في هذا المشروع للتحقق ووصف تطوير تطبيق محلل البريد الإلكتروني هذا.
http://plg.uwaterloo.ca/~gvcormac/treccorpus/
يتم استخدامها كما يسمح بها "الاستخدامات المسموح بها ، البند 3":
"Small excerpts of the information may be displayed to others
or published in a scientific or technical context, solely for
the purpose of describing the research and development and
related issues."
-- http://plg.uwaterloo.ca/~gvcormac/treccorpus/
(ترخيص معهد ماساتشوستس للتكنولوجيا)
حقوق الطبع والنشر (C) 2009-2016 Mikel Lindsaar
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة ("البرنامج") ، للتعامل في البرنامج دون تقييد ، بما في ذلك على سبيل المثال لا الحصر حقوق استخدام ، نسخ ، تعديل ، دمج أو نشر نسخ وتوزيعها و/أو بيعها و/أو بيع نسخ من البرامج ، والسماح للأشخاص الذين يتم تقديم البرنامج لهم للقيام بذلك ، مع مراعاة الشروط التالية:
يجب إدراج إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجارات. لا يجوز بأي حال من الأحوال أن يتحمل المؤلفون أو حاملي حقوق الطبع والنشر مسؤولية أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو أضرار أو غير ذلك ، ناشئة عن البرامج أو خارجها أو الاستخدام أو غيرها برمجة.